2015-09-07 31 views
2

我需要反序列化通過TCP發送到服務器的對象,而只是想知道如何確定什麼時候我已經收到了所有需要的數據的這樣做呢?我假設數據不會一次顯示出來,我對嗎?如果有幫助,我在我的自定義對象中使用[Serializable()]屬性和ISerializable接口。通過TCP反序列化自定義類對象?

回答

1

TCP提供的字節流。因爲您懷疑您不一定會一口氣收到它,您也不會知道流何時結束了某個特定的消息,因此您必須開發自己的應用程序級協議或使用現有的協議來確定此協議。

開發自己是很簡單的,例如包括總字節數作爲第一個四個字節的int所以你知道,一旦你已經讀了多少,直到你收到一個消息,例如:

public static int Recieve(NetworkStream myNetworkStream, byte[] myBigBuffer) 
    { 
     // Read size of message being received 
     var myReadBuffer = new byte[1024]; 
     myNetworkStream.Read(myReadBuffer, 0, sizeof(int)); 
     var sizeOfMessage = BitConverter.ToInt32(myReadBuffer, 0); 

     // Read incoming message may be larger than the myReadBuffer size, into myBigBuffer 
     // supplied. 
     // 
     var numberOfBytesRead = 0; 
     do 
     { 
      var readSize = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length); 
      Buffer.BlockCopy(myReadBuffer, 0, myBigBuffer, numberOfBytesRead, readSize); 
      numberOfBytesRead += readSize; 
     } 
     while (numberOfBytesRead < sizeOfMessage); 

     return numberOfBytesRead; 
    } 

那麼你就需要一種方法來deseralize數組你可以使用.NET的BinaryFormatter

注意:你不需要發送對象的二進制形式 - 你可以將它們作爲文本(例如Json或XML)發送它是更便攜。如果使用二進制文件,則可以與發送者和接收者共享.NET程序集(例如作爲.dll),以便他們可以訪問相同的類型。

替代地使用已經開發了另一種應用層協議針對其NET庫已經存在,並且負責處理所有的發送/插座/錯誤處理例如protobuf或WCF,您可以使用protobuf-net或Microsoft隨WCF附帶的WCF庫。

相關問題