2011-11-11 7 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の最初の部分だけを直列化しています。データがなくなるまでソケットから読み取らなければなりません。

クライアントから送信されたターミネーター文字列をセットアップして、メッセージを完全に受信したことを確認することをお勧めします。

ソケットはリクエストレスポンスに基づいていません。あなたはソケットを開いて読書を続けます。

+1

さらに、メッセージの前にメッセージの長さを送信することは別のオプションです –

+0

urレスポンスにお礼ありがとうございます。 – thewayman

+0

はい、絶対に...しかし、後半にメッセージが表示されたらどうしたらいいですか? – Aliostad

関連する問題