问题描述
请告诉我代码中哪里有问题?
我将数据序列化为对象列表,然后将其发送到 tcp 服务器以进行进一步操作 这是序列化的工作原理:
var objList = new List<object>
{
path,attachmentContext.LogItemInfo.Attachment
};
byte[] toServer;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms,objList);
toServer = ms.ToArray();
}
_client.SendAsync(toServer);
所以一些传输成功序列化,然后在随机某处失败
解决方法
我强烈怀疑这里的问题是“框架”,意思是:您正在处理的 buffer
不完全包含一条消息。它可能包含一条消息的开头,或一条完整的消息和下一条消息的一部分,其中任何一个都可能导致问题。 TCP 是一个流,而不是一系列消息。好消息是BinaryFormatter
无论如何都内置了框架,老实说:您可以直接使用NetworkStream
,它应该正常工作。否则,您将需要实现自己的框架布局,并确保接收代码在处理数据之前读取整个框架和正确处理任何过度读取,即它应该保留任何属于下一个帧的字节。
坏消息是您不应该使用BinaryFormatter
,并且特别是您不应该在套接字服务器(客户端应始终被视为敌对)。 Further reading。
要调查框架是否是问题:
- 在客户端,记录您发送的每条消息的十六进制
- 在客户端,记录您尝试处理的每条消息的十六进制
- 现在比较它们;它们应该匹配消息到消息(“开始相同”是不够的;它们需要具有相同的长度,并且始终相同)