2016-05-16 13 views
0

私が達成しようとしているのは、クライアントが文字列とデータ構造をソケットで送信し、それを読み込んで処理するサーバーを取得させることです。たとえばについてはC#ソケットから混合データを送信する

:クライアントはJSONに続いて「を保存」という文字列を送信し、サーバは、最初の文字列を解析し、それに応じて行動することを決定しなければならない(この場合はJSONをデシリアライズし、どこかに保存してください)

私が考えていた何:サーバが8バイト

byte[] buffernew = new byte[8]; 

のチャンクに入力されたデータを分割することができ、その後文字列のみが含まれており、最初のチャンクを読むdeseria次のバイトのチャンクでどのオブジェクトが渡されるかをlizeします。 (最後の8バイトのチャンクも、通信が終了したことを知らせるべきですか?たとえば、古典的な文字列)

これは実行可能な解決策ですか?より良い方法がありますか?

誰でもサーバー側のソリューションのスケッチを提供できますか?

+0

ため、接続の受信側をチャンクに対処しますもう一方の端

var br = new BinaryReader(stream , false); var cmd = br.ReadString(); var json = br.ReadString(); 

var bw = new BinaryWriter(stream, false); bw.Write("save"); bw.Write(json); 

を行います。したがって、次のうち1つ以上を使用することができます:1)Ascii:既知の文字で終了2)Asciiまたはバイナリ:データ項目の先頭にバイト数を追加3)Asciiまたはバイナリ:固定長のデータ項目。文字列をbyte []に​​変換し、 '\ 0'で終了するように、C#でクラスである文字列を送ることはできません。構造は固定または可変サイズにすることができます。固定サイズの構造を簡単に送ることができます。可変サイズの構造では、各データ項目は上記の3つの方法のいずれかで終了する必要があります。 – jdweng

+0

バイト数を追加するのは良いようですが、カウントを取得してバイト入力ストリームの情報をどのように分割するのですか? – SOROMEED

+0

バイト数がstring + structureの合計で、 '\ 0'で文字列を終了すると、stringの長さを取得できます。構造は、全長 - 文字列の長さです。すべての項目は、前のデータから取得できる開始位置と終了位置を特定するための特定の方法を必要とします。 全体は常にピースの合計に等しい。 – jdweng

答えて

0

もし私のC#コードが私のC#コードと話すなら、私はBinaryWriterとBinaryReaderを使用します。これらは、ワイヤの基本的なデータ型の整列と整列をうまく処理します。だから、それは、各データ項目(複数可)の終わりを知っておく必要があります

+0

貢献していただきありがとうございますが、クライアントは他の言語(JSONや他のデータ構造をシリアル化できるもの)であれば、 – SOROMEED

関連する問題