如何处理传入的protobuf消息

时间:2014-12-17 18:25:39

标签: c# tcp protobuf-net

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

看到一个类似的问题:How to properly handle incoming protobuf message with a NetworkStream?

但在我的情况下,只能有一种消息类型,所以我不认为我需要一个解析器。

所以我序列化我的对象并使用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
 }

1 个答案:

答案 0 :(得分:1)

我认为这里的简短版本是:使用SerializeWithLengthPrefixDeserializeWithLengthPrefix。默认的protobuf行为是&#34;读到流的末尾&#34;。顺便说一下,你不应该MemoryStream,顺便说一下;你可以直接SerializeNetworkStream。如果由于其他原因需要MemoryStream,您可以使用以下方法保存自己的数据副本:

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