2016-06-15 223 views
-1

目前,我收到的數據是17個字節。但是,我有兩種類型的數據,17個字節和10個字節。當我有兩種類型的數據時,如何才能使其進行處理?TCP客戶端數據接收

 byte[] message = new byte[17]; 
     int bytesRead; 

     while (true) 
     { 
      bytesRead = 0; 

      try 
      { 
       //blocks until a client sends a message 
       bytesRead = clientStream.Read(message, 0, 17); 

      } 
      catch 
      { 
       //a socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       break; 
      } 

我看過類似的問題,但它在C中,我無法理解。請幫助我。

+1

您需要一個應用協議來提供消息幀。你現在假設你收到一個17字節的消息,但你可能正在讀一個10字節的消息和下一個消息的前7個字節。我們無法爲您解答。 – CodeCaster

+1

你可以讓你的數據類型爲18和11個字節。第一個字節將是標識符。你讀一個字節,測試它的消息類型,以知道你是否必須讀取10或17個字節。然後你讀你的數據。 – Holger

+0

@CodeCaster謝謝。將嘗試你的建議。 – active92

回答

2

您試圖在基於流的協議(如TCP)上實現消息交換。當消息具有不同的長度和/或類型,有兩種常用的方法

  • 成幀信息:每個消息將包括包含消息的長度和類型以及可能的其它元數據的已知長度的報頭(例如,時間戳)。在讀取頭部之後,從流中讀取適當量的字節(即有效載荷)。
  • 自定義消息:消息的結尾可以通過到目前爲止讀取的流的內容來檢測。自定義的一個示例是HTTP Header,它由雙換行符(2x CRLF)分隔。

由於您始終知道要讀取多少個字節,所以更容易實現IMHO構建的消息傳遞。對於自定義消息,您必須使用緩衝和解析來檢測消息的結束。此外,您必須確保郵件的結束標記不會出現在郵件的有效內容中。

要實現成幀消息協議的接收方,您可以使用System.IO.BinaryReader類。

  • 讀取的消息的長度使用ReadByte()或的ReadUInt*()方法之一,如果消息將變得長於255個字節
  • 讀取使用Read(Byte[], Int32, Int32)的有效負載。 請注意,即使讀取的字節少於指定字節,Read也可能會返回。您必須使用循環來填充byte[] message
+0

非常感謝您的詳細解釋。我決定實施框架消息,因爲在我的情況下它更方便。 – active92