关于c#:如何处理传入的protobuf消息

How to handle incoming protobuf message

使用 TCPClient 的 NetworkStream 和 protobuf-net 我通过 TCP 发送和接收 protobuf 消息。

看到了一个类似的问题:如何正确处理带有 NetworkStream 的传入 protobuf 消息?

但就我而言,只能有一种消息类型,所以我认为我不需要解析器。

所以我序列化了我的对象并使用 tcp/ip 发送它,在我的服务器上我尝试反序列化它并获得 io 异常:无法从传输连接读取数据。

客户:

1
2
3
4
5
6
7
8
9
10
...
using (var ms = new MemoryStream())
{
    Serializer.Serialize(ms, person);

    data = ms.ToArray();
}
NetworkStream stream = client.GetStream();

stream.Write(data, 0, data.Length);

服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
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
 }

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

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