1

シンプルなクライアント サーバー チャット システムを構築しています。

クライアントはサーバーにデータを送信し、サーバーはそのデータを他のすべてのクライアントに再送信します。クライアントとサーバーの間でデータを送信するために、TcpListener および Network ストリーム クラスを使用しています。

送信する必要があるフィールドは、たとえば、名前、テキスト、タイムスタンプなどです。ASCII 文字 29 を使用して区切ります。

また、ストリーム データの終わりを示すために ASCII 文字 30 を使用しています。

データはUTF8でエンコードされています。

これは良いアプローチですか?問題が発生しますか? より良い方法はありますか?

アップデート:

おそらく私の質問は誤解されていたので、もっとよく説明します.クライアントからサーバーに送信するデータのリストがあり、すべてのデータを 1 つのストリームだけで送信するとします。これらのデータをどのように送信しますか?

  • マークアップの使用
  • 文字を区切り文字として使用する
  • すべてのフィールドに固定長を使用する
4

2 に答える 2

7

テキストを区切るよりも、個々のメッセージに長さのプレフィックスを付ける方がはるかに簡単だと思います。

message [TERMINATOR]

あなたは書くだろう

[LENGTH] message

(長さは、テキストではなくバイナリで送信します。4 バイトなどの固定長の数値、または送信されるデータ サイズをわずかに減らすために単純さを犠牲にする場合は、可変長の数値のいずれかです。)

これにより、次のメッセージへのオーバーシュートを心配することなく、ストリームから適切な量のデータを簡単に読み取ることができます。唯一の欠点は、送信を開始する前にメッセージの長さを知る必要があることですが、この場合は問題にならないと思います。

ちなみに、UTF-8 はエンコーディングであり、暗号化アルゴリズムではありません。

于 2010-03-07T13:28:15.427 に答える
0

別のオプションとして、オブジェクトをシリアル化/逆シリアル化し、 .NET Remotingを使用して送受信することも考えられます。送信時にオブジェクトを暗号化し、受信時に復号化することもできます。

The Code Projectで、ソース コードを使った小さな例を見つけました。

于 2010-03-07T14:33:55.270 に答える