2016-06-15 19 views
-1

現在、17バイトのデータを受信して​​います。しかし、私は17バイトと10バイトの2種類のデータを持っています。 2種類のデータがある場合、どうすれば処理できますか?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バイトにすることができます。最初のバイトは識別コードになります。あなたは1バイトを読んで、あなたのメッセージタイプをテストして、10バイトか17バイトを読まなければならないかどうかを知る。それからあなたはあなたのデータバイトを読みます。 – Holger

+0

@コードキャスターありがとうございます。あなたの提案をお試しになります。 – active92

答えて

2

ストリームベースのプロトコル(TCPなど)の上にメッセージ交換を実装しようとしています。各メッセージは、メッセージの長さと種類及びおそらく他のメタデータ(例えば、タイムスタンプが含まれている既知の長さのヘッダで構成されます:メッセージは、異なる長さおよび/または種類を有している場合、2つの一般的アプローチ

  • 入りメッセージがあります)。ヘッダを読み取った後、適切な量のバイト(すなわち、ペイロード)がストリームから読み出される。
  • 自己区切りメッセージ:これまでに読み込まれたストリームの内容によって、メッセージの終わりを検出できます。セルフデリミタの1つの例は、HTTPヘッダーです.HTMLヘッダーは、ダブル改行(2x CRLF)で区切られています。

IMHOフレームメッセージングは​​、読み込むバイト数を常に知っているので実装が簡単です。自己区切りメッセージの場合は、メッセージの終わりを検出するためにバッファリングと解析を使用する必要があります。さらに、メッセージの終わりがメッセージのペイロードに表示されないようにする必要があります。

フレーム付きメッセージングプロトコルの受信側を実装するには、System.IO.BinaryReaderクラスを使用できます。メッセージは255バイト

  • Read(Byte[], Int32, Int32)を使用してペイロードを読み取るよりなるかどう

    • ReadByte()又はReadUInt*()方法のいずれかを使用して、メッセージの長さを読み取ります。 Readは、指定されたバイト数より少ないバイトが読み込まれた場合でも返されることがあります。byte[] messageを入力するにはループを使用する必要があります。
  • +0

    あなたの詳細な説明に感謝します。私はフレーム化されたメッセージを実装することを決定しました。私の場合はずっと便利です。 – active92

    関連する問題