socket发送的数据转为byte[]后长度超过1460,导致每次循环只接收了一部分,导致反序列化失败。把当前数据存起来,和下次的拼在一起就行了。
public static void ReceiveMessage()
{
if (server == null)
{
if (clientOrListening) server = link;
else server = link.Accept();
}
while (true)
{
byte[] buffer = new byte[1024 * 1024];
int currentLength = server.Receive(buffer);//利用阻塞防止界面卡住
while (server.Available > 0)
{
byte[] bytes = new byte[1460];
int receiveLength = server.Receive(bytes);
Array.Copy(bytes, 0, buffer, currentLength, receiveLength);
currentLength += receiveLength;
}
if (currentLength > 0)
{
MemoryStream memory = new();
memory.Write(buffer, 0, currentLength);
memory.Position = 0;
BinaryFormatter bf = new();
NetworkMessage message = bf.Deserialize(memory) as NetworkMessage;
Debug.Log("SocketClient.ReceiveMessage 接收消息=" + message.ToString());
enemyActionQueue.Enqueue(message);
memory.Close();
}
}
}