2011-11-11 2 views
0

Я хочу отправить список объектов через соединение сокета. И я знаю, что сервис WCF будет лучшим вариантом, но это не вариант для меня.Исключение программирования сокета В документе XML есть ошибка (170, 46)

Я использую этот код для отправки данных

private void tm_Tick(object sender, EventArgs e) 
    { 

     XmlSerializer formatter = new XmlSerializer(typeof(List<Objects.PIP>)); 

     MemoryStream stream = new MemoryStream(1024); 

     formatter.Serialize(stream, Repository.GlobalRepository.PIPInformation); 

     byte[] bt = stream.ToArray(); 
     foreach (Communication.Client Client in server.ClientList) 
     { 
      Client.SendMessage(bt); 

     } 
     stream.Flush(); 
    } 

    public void SendMessage(Byte[] bytesSent) 
    { 
     SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs(); 
     writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length); 
     socket.SendAsync(writeEventArgs); 
    } 

, кажется, работает нормально.

для получения данных я использую этот код в потоке.

void ReceiveData() 
    { 
     try 
     { 

      while (true) 
      { 
       if (disposed == true) 
        return; 
       data = new byte[socket.ReceiveBufferSize]; 
       var recv = socket.Receive(data); 

       XmlSerializer formatter = new XmlSerializer(typeof(List<Object.PIP>)); 
       MemoryStream stream = new MemoryStream(data); 
       **Classes.TickerInformation.PIPList= (List<Object.PIP>)formatter.Deserialize(stream);** 

      } 
      socket.Close(); 
      return; 
     } 
     catch (Exception ex) 
     { 

     } 

    } 

Я получаю исключение В документе XML есть ошибка (170, 46). в этой строке: Classes.TickerInformation.PIPList = (List) formatter.Deserialize (stream);

Я предполагаю, что все данные не получены, так что это происходит.

ответ

2

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

Предлагаю настроить строку терминатора, отправленную клиентом, чтобы вы могли узнать, что вы полностью получили сообщение.

Помните, что сокеты не основаны на запросе-ответе. вы открываете розетку и продолжаете читать.

+1

Кроме того, отправка сообщения длиной до сообщения является еще одним вариантом –

+0

Большое спасибо за ответ ура – thewayman

+0

Да, абсолютно ... но что, если вы получите сообщение во второй половине ... тогда вы не знаете, с чего вы начали – Aliostad

Смежные вопросы