2015-09-07 30 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库。

相关问题