tcpClient.GetStream().Read(buffer, 0, buffer.Length);
并且注意到从“问题”服务器读取的字节数较少。经过快速搜索,我找到了这篇文章http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/759f3f2f-347b-4bd8-aa05-fb7f681c3426,其中Dave Murray建议:
有几种更优雅的处理方式。如果您不打算将连接用于其他任何事情,则最简单的方法是nobugz所建议的。当服务器完成发送数据时,请关闭连接的末尾。当客户端在关闭之前读取所有已发送的数据时,Read将开始返回0,此时您就知道服务器不打算再发送任何内容。
因此,我将我的代码从单个读取更新为:
var buffer = new byte[32768];
var totalBytesRead = 0;
var bytesRead = tcpClient.GetStream().Read(buffer, 0, buffer.Length);
do
{
totalBytesRead += bytesRead;
bytesRead = tcpClient.GetStream().Read(buffer, totalBytesRead, bytesRead);
} while (bytesRead > 0);
我已经根据帖子中的内容更新了我的服务器代码,以关闭连接。根据@leppie的评论,我可能可以删除我的Base64包装属性...
Read
的结果是一个错误。然而,固定缓冲区也是一个错误,除非您事先知道长度。更好的方法是将其推入MemoryStream
中。或者:直接从TCP流反序列化。 - Marc Gravell