2011-10-18 12 views
0

私はクライアント/サーバーソケットアプリケーションを作成しています。おそらく問題に関する知識の不足のために、私はこの問題を解決することができません。ソケットクライアントの回答

クライアントが通信を続行するために答えを送信する必要があります:

while(comunicate) 
{ 
    if (chkCorrectAnswer.Checked) 
       answer = encoder.GetBytes('\x02' + "82SP|" + '\x03'); 
      else 
       answer = encoder.GetBytes("bla"); 
      ServerStream.Write(answer, 0, answer.Length); 

      //or ?? 
      //tcp.Client.Send(answer); 
} 

、サーバはそれをrecieves:

while(comunicate) 
{ 
    var validanswer= encoder.GetBytes("myvalidanswer"); 

    answer = new byte[validanswer.Length]; 
    stream.Read(answer, 0, validanswer.Length); 

    //or ?? 
    //tcp.Client.Receive(answer); 

    if (answer.SequenceEqual(validanswer)) 
     // continue communication 
} 

各コードは異なるアプリである、「コミュスレッドを」ループ。

答えは正しく送信されているようですが、サーバーがうまく受信していないようです。時にはそれはblablabまたはlablablと7文字のバリエーションを受信します。私は受信すると、受信データだけでバッファが満たされ、何とか反復データでバッファが満たされます。ここ

つの質問:

  1. 私が使用する必要がありますどのような、stream.write /読み取りまたはclient.send /受け取りますか?
  2. この回答を確認するにはどうすればよいですか?

答えて

1

0x02と0x03は、テキストの開始(STX)とテキストの終わり(ETX)と呼ばれ、メッセージの開始位置と終了位置を識別するための区切り文字です。実際には両方を使う必要はなく、シリアル通信を行う場合は一般的な方法でした。

ETXを受信するまで、メッセージを作成する必要があります。

のようなもの(最も簡単な解決策ではなく、非常に効率的に使用すると、クライアントの多くを持っている場合)

string buffer = ""; 
var readBuffer = new byte[1]; 
int readBytes = 0; 
while ((readBytes = stream.Read(readBuffer, 0, 1)) == 1 && readBuffer[0] != 3) 
{ 
    buffer += readBuffer[0]; 
} 

あなたはもちろん、より大きなチャンクを読み取ることができます。しかし、複数のメッセージが到着したかどうかを確認し、それに応じてバッファを処理する必要があります。それは私がそれをやる方法です。

1

私はrecievingしか入ってくるデータをバッファを満たすだろうし、何とかそれが繰り返されるデータでバッファを満たしているthoung。

まあ、あなたは繰り返しループ内でデータを送信しているので、これは予想されます。

ストリームから一定のバイト数だけを読み込みたい場合は、先に論理パケットのサイズを送信して、受信側が最初にサイズを読み取ることができるようにします(たとえば、固定されたint値として)そして実際の応答。

+0

tcp.Client.Send(answer、answer.Length、SocketFlags.None)のようなものです。 2つの "送信"? – programad

+0

ストリームに2回書き込みます.1つは(固定)長さで、もう1つはデータ付きです。 –

1

あなたが読んだら、前に書いたものを含めて、あなたが書いたものすべてを手に入れます。

あなたは何を知っているので、長さヘッダーまたは区切り文字のいくつかの種類を実装する -

長さ+メッセージ

または

メッセージ+セパレーター

をあなたが行うとき、そして、それを解析読む。