2016-11-14 5 views
0

私はチャットルームアプリケーションを作っており、サーバーとクライアントの間で通信するためにTCPパケットを送信します。C# - 一度に2つのTCPパケットを受信して​​いるようですか?

私は次のコードを持っている:クライアントはこれを読むとき、応答がある、しかし

string returnMessage = "[EVT]USERSUCCESS"; 
       bytes = Encoding.ASCII.GetBytes(returnMessage); 
       info.WriteToStream(bytes); 

       foreach (ConnectionInfo con in connections) 
       { 
        info.WriteToStream(bytes); 
        bytes = Encoding.ASCII.GetBytes("[EVT]USERJOIN;" + username); 
        con.WriteToStream(bytes); 
       } 

を:

  • [EVT] USERSUCCESS [EVT] USERJOIN;名

これはすぐに両方のパケットを受信して​​いるようです。

これは、受信のために、私が持っているコードです:

static void ServerListener() 
    { 
     while (true) 
     { 
      byte[] bytes = new byte[1024]; 
      int numBytes = stream.Read(bytes, 0, bytes.Length); 
      string message = Encoding.ASCII.GetString(bytes, 0, numBytes); 

      if (HandleResponse(message) && !WindowHasFocus()) 
      { 
       player.Play(); 
      }  
     } 
    } 

別のスレッドとして実行されます。 HandleResponse()は完全に機能しています。

ありがとうございます!

答えて

3

Tcpはパケットプロトコルではなくストリームプロトコルです。

あなたが行っているように、複数のパケットまたは単一のパケットでバイトを取得できます。あなたがする必要がどのような

は(例えばNULLバイトなど)、パケットの終わりをsiginifiesバイトを入れて

Psudeoコード:

  1. あなたはすべてのバイトをするために、受信した追加のバッファを持っています。
  2. バッファ内のヌルバイトの場合は、ヌルバイトでバッファを分割します。
  3. 左側を完全なパケットとして扱います。新しいヌルバイトが得られるまで、バッファの右側を維持します。

高度なTCP:

  1. そんなに各パケットの最後にNULLバイトを追加するには、クライアントを引き起こすあなたの「パケット」
+0

にチェックを独自のエラーを追加することもできますそれぞれ別々にお読みください? – Sulphate

+0

パケットコードをパケットに分割するためにサーバーコードを書き込む必要はありません。 – Catprog

+0

どうすればいいですか?私はこれにはかなり新しいです。 – Sulphate

関連する問題