在很短的时间内调用 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);
}
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 个字节,然后在长度标头中接收的字节数。(在我的示例中我没有这样做)