2011-11-11 1 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 = (목록) formatter.Deserialize (스트림);

나는 모든 데이터가 수신되지 않고 있다고 가정합니다.

답변

2

문제는 XML 전체가 끝날 때까지받지 못했기 때문에 XML의 초기 부분 만 serialize하는 것입니다. 데이터가 없을 때까지 소켓에서 읽어야합니다.

클라이언트가 보낸 종료 문자 문자열을 설정하여 사용자가 메시지를 완전히 받았는지 알아볼 것을 제안합니다.

소켓은 요청 - 응답을 기반으로하지 않습니다. 소켓을 열고 계속 읽습니다.

+1

메시지 전의 메시지 길이를 다른 옵션으로 보내기 –

+0

ur 응답에 많은 감사를드립니다. – thewayman

+0

예, 절대적으로 ...하지만 후반에 메시지를 받으면 어떻게 시작했는지 알 수 없습니다. – Aliostad