在很短的时间内调用Socket.send会导致在同一个数据包中发送两个不同的数据

时间:2011-05-19 17:24:27

标签: c# .net sockets

我正在编写一个游戏,它会在玩家移动时将玩家的位置发送到服务器,使用这样的XML:

<?xml version="1.0" encoding="utf-8" ?> <request type="movement"> <character map="1" coords="10,20"/> </request>

问题是,由于信息发送速度非常快,它通常会在同一个数据包中发送两到三次XML,然后服务器无法正确解析它。

在客户端,使用C#.net我创建一个新的Task以便发送信息,以便它继续正确地更新游戏,在我只需要调用Socket.send发送的任务中XML作为文本字符串。

客户端:

Byte[] bytesToSend = Encoding.ASCII.GetBytes(texto);
socket.Send(bytesToSend, bytesToSend.length, 0);

Java Server:

public String convertStreamToString(InputStream is) throws Exception {
        BufferedInputStream reader = new BufferedInputStream(is);
        byte[] ent = null;
        int recivido;
        // String line = reader.readLine();
        do {
            ent = new byte[reader.available()];


            recivido = reader.read(ent);
        } while (recivido == 0);

        return new String(ent);
    }

1 个答案:

答案 0 :(得分:1)

TCP就像这样,因为它是基于流而不是基于消息的。

请在此处阅读我的回答:Application stops when receiving info through socket

客户方:

var buffer = Encoding.UTF8.GetBytes(yourXml);
var header = BitConverter.GetBytes(buffer.Length);
socket.Send(header);
socket.Send(buffer);

服务器端:

var header = new byte[4];
var received = socket.Receive(header, 0, 4);
var xmlBuffer = new byte[BitConverter.ToInt32(header)];
socket.Receive(xmlBuffer, 0, xmlBuffer.Length);

请注意,您必须保持接收,直到您确实有4个字节,然后是长度标头中接收的字节数。 (我的例子中没有这样做)