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

本文关键字:数据 两个 数据包 send Socket 调用 在很短的时间内 | 更新日期: 2023-09-27 17:57:04

我正在编写一个游戏,每当玩家移动时,它都会将玩家的位置发送到服务器,使用如下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);

爪哇服务器:

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);
    }

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

TCP的工作方式是这样的,因为它是基于流而不是基于消息的。

在这里阅读我的答案:通过套接字接收信息时应用程序停止

客户端:

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 个字节,然后在长度标头中接收的字节数。(在我的示例中我没有这样做)