2

私はc#でのTCPクライアントアプリケーションのリターンで大きな問題に直面しています。通常は正常に動作していますが、サーバーが特定のクライアントに同時応答を送信する場合もあるため、この場合、すべての同時応答がクライアント側で単一のメッセージとして受信されます。この場合、クライアントは個々のメッセージを識別できませんでした。したがって、そのような場合、私のクライアントアプリケーションは特定のアクティビティを処理できませんでした。クライアント側で個別のメッセージとして読み取ることは可能ですか?したがって、この問題を解決するために、いくつかの選択肢がありますが、それが正しい方法かどうかはわかりません。

1-クライアント側で固定長のバッファーを使用します(ただし、私のメッセージは可変長です)。

2-各応答メッセージに区切り文字を追加します。

誰かがそのような問題を解決するための解決策を知っているなら、私を助けてください。

4

3 に答える 3

5

TCP はストリーム ベースで、クライアントからサーバーへのデータ ストリームを取得します。送信される各メッセージが個別に送信されることを保証するアプリケーション プロトコルを構築できない場合は、ストリームから期待しているものを「逆シリアル化」する必要があります (通常、TCP では賢明な考えではありません)。

そのため、データが何であるかを区別できるように、メッセージごとに何かを送信する必要があります。これは、多くの場合、各メッセージの開始時にタグまたはタイプ データを使用して行われます。1 バイトで十分な場合もあります (メッセージの種類によって異なります)。次に、ストリームからそのバイトを読み取り、次に何を逆シリアル化するかを決定します。たとえば、文字列を送信する場合は、'1' をシリアル化し、string. 日付/時刻を送信する場合は、「2」をシリアル化してからDateTime. サーバー上で、これらのオブジェクトの両方がほぼ同時に送信された場合、単純に を逆シリアルbyte化でき、それが「1」の場合は a を逆シリアル化しstring、次に逆シリアル化を続行します。次のを取得しbyte、「2」の場合は逆シリアル化しますDateTime。_

TCP はメッセージ ベースのプロトコルではなく、ストリーム ベースのプロトコルであることを覚えておくことが重要です。メッセージベースは、アプリケーション レベルで実装する必要があります。たとえば、上記のようなものです。

また、「シリアライズ」と「デシリアライズ」とは、.NET ドキュメントの「オブジェクトのシリアライズ」で説明されている典型的な組み込みのシリアライザーとデシリアライザーを意味します。JSON.NET などのライブラリに含まれる JSON シリアライザーや、組み込みのDataContractJsonSerializerand JavaScriptSerializer.

于 2012-09-10T13:06:32.890 に答える
0

各メッセージの長さが最初の数バイトであることを確認してください。これにより、全体を単一のメッセージに分割できます。

たとえば、サーバーから次の 20 バイトのメッセージを受け取ったとします。

                                       (1)                                     (2)
0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5   6   7   8   9   0

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 2 | 4 | 6 | 1 | 5 | 3 | 3 | 2 | 6 | 3 | 4 | 1 | 6 | 2 | 3 | 5 | 3 | 0 | 4 | 6 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  ^           ^       ^               ^               ^           ^
  • 最初のバイトは、最初のメッセージに 2 バイトのデータがあることを示しているため、そのメッセージをバイト 1 と 2 として取得できます。
  • 次に、バイト 3 を読み取ります。これは、2 番目のメッセージに 1 バイトの追加データ (バイト 4) しかないことを示しています。
  • 3 番目と 4 番目のメッセージには 3 バイトのデータがあり (バイト 5 と 9 が示すように)、2 バイトのメッセージと 3 バイトのメッセージがあります。
于 2012-09-10T13:35:48.543 に答える
-1

少なくとも本体の長さを含む固定長のヘッダーを使用するのが最も簡単な方法です。次に、本文によっては、追加情報が必要になる場合があります (JSON などを使用して実際のメッセージをシリアル化/逆シリアル化する場合の型名など)。

すべてを自分で処理したくない場合は、のようなネットワーク ライブラリを使用できます。記事の最後までスクロールして、JSON RPC のサンプル実装を確認してください。そのほとんどを使用して、JSON ベースの通信チャネルを取得できます。

于 2012-09-10T13:44:14.230 に答える