如何处理传入的 protobuf 消息
本文关键字:protobuf 消息 何处理 处理 | 更新日期: 2023-09-27 18:34:28
使用 TCPClient's NetworkStream 和 protobuf-net,我通过 TCP 发送和接收 protobuf 消息。
看到一个类似的问题:如何使用NetworkStream正确处理传入的protobuf消息?
但就我而言,只能有一种消息类型,所以我认为我不需要解析器。
所以我序列化了我的对象并使用 tcp/ip 发送它,在我的服务器上我尝试反序列化它并得到 io 异常:无法从传输连接读取数据。
客户:
...
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, person);
data = ms.ToArray();
}
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
服务器:
...
Byte[] bytes = new Byte[256];
String data = null;
while(true)
{
Console.Write("Waiting for a connection... ");
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
data = null;
NetworkStream stream = client.GetStream();
Person newPerson = Serializer.Deserialize<Person>(stream);<--- exeption
}
我认为这里的简短版本是:使用SerializeWithLengthPrefix
和DeserializeWithLengthPrefix
。默认的 protobuf 行为是"读到流的末尾"。顺便说一句,序列化时不需要MemoryStream
;您应该可以直接Serialize
NetworkStream
。如果出于其他原因需要MemoryStream
,可以使用以下命令为自己保存数据副本:
stream.Write(ms.GetBuffer(), 0, (int)ms.Length);