问题描述
我有一个简单的 TCPlistener,它侦听连接,一旦建立连接,一个方法会尝试发送数据,而服务器端会尝试读取它。
客户端:
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 时不会发生这种情况。我不确定出了什么问题。
解决方法
protobuf 流不是“关闭的”——默认情况下它会一直读取到流的末尾,这意味着它将一直读取到入站 TCP 套接字被标记为完成。
如果您打算发送多条消息,请尝试使用“WithLengthPrefix”版本的序列化和反序列化;为您添加消息框架,让它知道每个负载的结束位置。