2015-02-13 4 views
1

Я пытаюсь передать пользовательский class от одного клиента tcp к другому (используя TcpListener, TcpClient и XmlSerializer).XmlSerializer и NetworkStream с сервером Tcp - клиент

У меня есть 1 проблема, которая разбивается на 2 проблемы.

, когда я использую этот код, клиент зависает при Serilization делается (я думаю, что другая сторона не знает, когда данные полностью пересылаются):

public void SendData(myMessage messageClass) 
{ 
    NetworkStream serverStream = tcpServer.GetStream(); 
    XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage)); 
    xmlSrlz.Serialize(serverStream, messageClass); 
    serverStream.Flush(); 
} 

public myMessage ReadData() 
{ 
    while (true) 
    { 
     NetworkStream clientStream = client.GetStream(); 
     XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage)); 
     int bytesToread; 
     byte[] inStream = new byte[10025]; 
     myMessage msg; 
     do 
     { 
      msg = (myMessage)xmlSrlz.Deserialize(clientStream); 
      clientStream.Flush(); 
     } 
     while (((bytesToread = clientStream.Read(inStream, 0, (int)client.ReceiveBufferSize)) > 0)); 
     return msg; 
    } 
} 

Так что, когда я искал вокруг я заметил, что я могу распоряжаться поток (или использовать using) и таким образом пусть другая сторона знает, что данные полностью отправлен и Тереза ​​больше нет данных для отправки:

public void SendData(myMessage messageClass) 
{ 
    using (NetworkStream serverStream = tcpServer.GetStream()) 
    { 
     XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage)); 
     xmlSrlz.Serialize(serverStream, messageClass); 
     serverStream.Flush(); 
    } 
} 

public myMessage ReadData() 
{ 
    while (true) 
    { 
     using (NetworkStream clientStream = client.GetStream()) 
     { 
      XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage)); 

      int bytesToread; 
      byte[] inStream = new byte[10025]; 
      myMessage msg; 
      do 
      { 
       msg = (myMessage)xmlSrlz.Deserialize(clientStream); 
       clientStream.Flush(); 
      } 
      while (((bytesToread = clientStream.Read(inStream, 0, (int)client.ReceiveBufferSize)) > 0)); 
      return msg; 
     } 
    } 
} 

Но теперь я потерял связь из них 2 клиентов.

, когда я пытаюсь отправить другое сообщение я получаю исключение:

Операция не допускается на несвязных сокетов.

Так как я могу послать Serilized объекта без нарушениясоединения?

ответ

0

Прежде всего, используя using, это , закрывая ваш сокет, удалив базовый поток. Плохая идея.

Во-вторых, рассмотрите сериализацию строки и из строки, вместо сериализации непосредственно в поток. Я не уверен, есть ли побочные эффекты, но, конечно, может быть.

Вы можете использовать этот вопрос для сериализации/десериализации из string: Deserialize from string instead TextReader