我正在编写一个游戏,它会在玩家移动时将玩家的位置发送到服务器,使用这样的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);
}
答案 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个字节,然后是长度标头中接收的字节数。 (我的例子中没有这样做)