2016-08-24 8 views
0

C#で単純なTCPサーバーを作成しました。これは、クライアントからのコマンドを受け取る(そして、それ以降の処理のためにそれらを渡す)ためのものです。これらのコマンドとその引数はテキストです。 (クライアントがテキストコマンドをエンコードすることを意味し、サーバーはテキストを解釈してテキストに戻します。)c#TCPサーバーがテキストとバイナリを受け入れる

これらのコマンドの一部は、バイナリファイル(ZIPファイルなど)をパラメータとして使用します。

ここでは、サーバーサイドでテキストとバイナリデータを区別する方法がわかりません。サーバーはバイナリデータのみを受信しますが、一部はテキストにデコードされることが意図されていますが、一部はデコードされていません。どれがどちらであるかはどのように判断するのですか?

私は何らかのプロトコルを定義しなければならないと思います。しかし、私はそれについてどうやって行くのか本当に分かりません。

アドバイスやヒントありがとうございました!

Chris。

+1

あなたのファイルサイズに33%のオーバーヘッドが気になる場合は、あなたのバイナリファイルを[Base64](https://en.wikipedia.org/wiki/Base64)にしてください。 – Phylogenesis

+0

TCPトランスポート層とともにアプリケーション層が必要です。クライアントはコマンドを送信し、サーバーはコマンドを処理します。したがって、各メッセージの前に1バイトのコマンドを追加することができます。サーバーは1バイトを削除して残りのメッセージを処理します。バイナリを送信するので、データが実際にどこで終了するかをサーバーに知らせるために、各メッセージにバイト数を追加します。 – jdweng

答えて

3

はい、プロトコルが必要です。 TCPは単なるベアボーンバイトのストリームですが、それ以上のものはアプリケーションプロトコルを必要とします(バイトストリームを個々のテキストメッセージとして解釈するときに暗黙のうちに行ったように)。

テキストとバイナリのデータを混在させることは、常に難しいです。 1つは、テキストはです。ぼんやりと複雑です - ほとんどのアプリケーションプロトコルは、重要なテキストのためにASCIIと仮定することでこれを回避します。しかし、もしあなたがASCIIに固執すれば、多くのことがずっと簡単になります。

コマンドを\rで区切って送信するとします。コマンドを解析するには、まず最初に\rまで読み込み、受け取ったテキストコマンドを解析する必要があります。今度はコマンドであることが分かったら、それに続くデータを扱うことができるので、ファイルの長さを引数とするSENDFILEのようなコマンドを使うことができます。コマンド自体では、次のlengthバイトを送信するファイルとして解釈する必要があります。

プロトコルの設計には多くの微妙な点があり、TCP自体はあまり簡単ではありません。私は、たとえばWCFのような、より高レベルの通信プロトコルを使用することを強くお勧めします。 生のTCPを使用する必要がある場合、あなたは多くの試行錯誤の前であなたの前で勉強しています:)

+0

この回答を補足するには、https://msdn.microsoft.com/en-us/library/ms733742.aspxをご覧ください。 – auburg

+0

ありがとうございます!私は最終的に、すべてのバイナリのために、送信されたメッセージの長さ接頭辞とともに、その内部の個々のデータ項目に行きました。いったんどのコマンドが送信されたのか分かると、どのタイプの引数が期待され、それらを適切に変換/デコードするのかが分かります。 – Christophe

関連する問題