我有一个简单的TCP监听器,用于监听连接。一旦建立了连接,该方法会尝试发送数据,服务器端会尝试读取。
客户端代码:
客户端代码:
using (NetworkStream stream = new NetworkStream(_client.Client, false))
{
Serializer.Serialize(stream, MyPersonObject);
}
服务器端:
using (NetworkStream stream = new NetworkStream(_client.Client, false))
{
var myObject = Serializer.DeSerialize<Person>(stream);
}
然而,我注意到一旦它到达 DeSerialize 方法,它就会挂起并无限期地等待。 请注意使用完全相同的步骤时,使用 BinaryFormatter 不会发生这种情况。 我不确定出了什么问题。
NetworkStream
的结束,这意味着不会再 有任何 数据到达;或者换句话说,如果您发送了正好一个帧并关闭了出站,那么您可以使用NetworkStream
来完成此操作-然后接收器只需在其入站上读取直到EOF。 - Marc GravellMemoryStream
在这里扭曲了你的思维; 流是“管道”,而不是“桶”-它们通常不包含任何东西-它们更多是一个API来获取某些东西。MemoryStream
实际上有字节这一事实是MemoryStream
泄漏的实现细节。然而,你应该关注“数据是否可以被获取?” - 在NetworkStream
上,如果没有任何本地缓冲区,则答案是“我不知道是或否,直到我看到更多字节或套接字关闭”;MemoryStream
可以立即更明确地回答,因此它不会造成阻塞。 - Marc Gravell