如何处理传入的 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
 }

如何处理传入的 protobuf 消息

我认为这里的简短版本是:使用SerializeWithLengthPrefixDeserializeWithLengthPrefix。默认的 protobuf 行为是"读到流的末尾"。顺便说一句,序列化时不需要MemoryStream;您应该可以直接Serialize NetworkStream。如果出于其他原因需要MemoryStream,可以使用以下命令为自己保存数据副本:

stream.Write(ms.GetBuffer(), 0, (int)ms.Length);