2011-07-28 63 views
3

我無法通過TCP/IP套接字連接發送序列化數據。C#套接字發送序列化數據

我的發送功能如下:

public void SendData(NetworkConnection connection, ReplicableObject ro) { 
      MemoryStream ms = new MemoryStream(); 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(ms, ro); 

      ms.WriteTo(connection.TcpStream); 
      connection.TcpStream.Flush(); 

      ms.Close(); 
     } 

我所知,目前TcpStream.Flush()不會做任何事情。無論如何,這不是我的問題。

在接收(客戶端),讀者看起來是這樣的:

byte[] readBuffer = new byte[8192]; 
      worldMapStream = worldMapConnection.GetStream(); 
      BinaryFormatter bf = new BinaryFormatter(); 
      MemoryStream ms = new MemoryStream(); 
      IsConnectedToWorldMap = true; 
      while (true) { 
       try { 
        do { 
         int bytes = worldMapStream.Read(readBuffer, 0, readBuffer.Length); 
         ms.Write(readBuffer, 0, bytes); 
        } 
        while (worldMapStream.DataAvailable); 

        try { 
         ReplicableObject ro = (ReplicableObject) bf.Deserialize(ms); 
         ro = ro; 
        } 
        catch (Exception e) { 
         e = e; 
        } 
       } 

奇怪RO = RO和E = E線就在那裏,所以我可以添加一個斷點。

我的問題是這樣的:讀取總是失敗。我收到一個異常,並且該消息解釋了在解析完成之前流的末端已達到。現在,我明白數據可能不會全部到達一個塊,但是我沒有清除內存流捕捉異常,所以下一個塊應該只是將剩餘的數據添加到它的末尾,對吧?但顯然這不起作用。

那麼,我做錯了什麼?提前致謝。 :)

P.S.我知道WCF是更好的選擇;但不幸的是我不能在這個項目中使用它。

回答

2

這裏,我們去:

while (worldMapStream.DataAvailable); 

應該是:

while(bytes>0); 

這也意味着移動bytes外循環。

DataAvailable只是意味着「現在,在NIC」。它並沒有告訴你是否有更多來臨。此外,你應該ony bytes>0太;老實說while這裏的迴路比較容易:)

然後;在填充ms之後,設置ms.Position = 0以重放te流。

+0

對不起,我必須誤解......當然,那個循環永遠不會退出嗎?由於每次從字節讀取tcpstream都會大於0;導致它回到循環的開始並再次讀取? – Xenoprimate

+0

@Motig關閉時它會返回<= 0。此外,還有第二個錯誤 - 請參閱編輯 –

+0

@Migig - 另外,我*不*認爲WCF會更好;但我可以建議一個比BinaryFormatter更好的序列化程序,如果你喜歡:) –