2014-10-23 1 views
1

Я хочу отправить два класса.C# ProtoBuf с TcpClient Как я могу отделить пакеты?

[ProtoContract] 
class Person { 
    [ProtoMember(1)] 
    public int Id {get;set;} 
    [ProtoMember(2)] 
    public string Name { get; set; } 
    [ProtoMember(3)] 
    public Address Address {get;set;} 
} 
[ProtoContract] 
class Address { 
    [ProtoMember(1)] 
    public string Line1 {get;set;} 
    [ProtoMember(2)] 
    public string Line2 {get;set;} 
} 

Этого класс от https://code.google.com/p/protobuf-net/wiki/GettingStarted

И теперь я закодирован клиент, как это.

TcpClient tcp_client = new TcpClient("localhost", 33333); 
      var p1 = new Person 
      { 
       Id = 12345, 
       Name = "John1", 
       Address = new Address 
       { 
        Line1 = "USA", 
        Line2 = "New york", 
       } 
      }; 
      var p2 = new Person 
      { 
       Id = 54321, 
       Name = "John2", 
       Address = new Address 
       { 
        Line1 = "USA", 
        Line2 = "New york", 
       } 
      }; 

      NetworkStream ns = tcp_client.GetStream(); 
      Serializer.Serialize(ns, p1); 
      Serializer.Serialize(ns, p2); 

      tcp_client.Close(); 
      Console.Read(); 

Здесь Personp1 и Personp2 упорядочиваются на удаленный сервер.

Это сервер.

static void Main(string[] args) 
     { 
      IPAddress ipAddress = System.Net.Dns.GetHostEntry("localhost").AddressList[0]; 
      TcpListener svr = new TcpListener(ipAddress, 33333); 
      svr.Start(); 

      var client = svr.AcceptTcpClient(); 
      byte[] b = new byte[1024]; 
      int read = client.GetStream().Read(b, 0, 1024); 
      client.Close(); 
      svr.Stop(); 

      // Now parse packet. 
      byte[] bb = new byte[read]; 
      Array.Copy(b, bb, read); 

      // If in one time received two persons, how can i separate it? 
      Console.Read(); 
     } 

Здесь, если в одно время было получено все (по два) байтового массива, как я могу его отделить?

Заранее спасибо ...

ответ

2

Формат Protobuf проволоки не прекращенные - это был выбор дизайна, чтобы позволить конкатенации === слияния, но это проблематично во многих случаях; откровенно это, вероятно, проблематично чаще, чем полезно. Однако! protobuf-net удобно включает самоограничивающиеся вспомогательные методы; в основном, переключите Serialize на SerializeWithLengthPrefix и Deserialize на DeserializeWithLengthPrefix.