2014-12-17 3 views
2

Использование NetworkStream и protobuf-net TCPClient Я отправляю и получаю сообщения protobuf через 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 
} 

ответ

0

Я думаю, что короткая версия здесь: использовать SerializeWithLengthPrefix и DeserializeWithLengthPrefix. По умолчанию поведение protobuf «читается до конца потока». Вам не нужно использовать MemoryStream при сериализации, btw; вы должны быть в порядке до Serialize непосредственно на NetworkStream. Если вам нужны MemoryStream по другим причинам, вы можете сохранить копию данных, используя:

stream.Write(ms.GetBuffer(), 0, (int)ms.Length); 
Смежные вопросы