|
■No79662 (Hongliang さん) に返信
> TCP自体はそれで手順が済んでいると思われますが、その上に乗っている、アプリケーション層のプロトコルが成立しているかどうか。
> これは、たとえば
> ・つながったらまずクライアント側がサーバにバイト列"HELLO"を送信する
> ・サーバ側は"HELLO"を受け取ったら"ACCEPT"を返す
> ・クライアント側は"ACCEPT"を受け取ったことを確認し、"GET hoge.txt"のような要求を投げる
> ・サーバ側は要求に応じたデータを返す
> のような、やりとりの手順です。
> 上記のような例の場合、クライアントがアクションを起こさない限りサーバ側からは何も送信されないでしょう。
> もちろん、接続したらサーバは一方的にデータを毎秒送りつけてくる、というようなプロトコルであれば別ですが。
今作成している処理の流れとしては、
1.クライアントがサーバにコマンド1を送る。
2.サーバがコマンド1に対しての応答を返す。
3.コマンド1の応答を受けたクライアントがコマンド2をサーバに送る。
4.サーバがコマンド2に対しての応答を返す。
といった流れになっているのですが、サーバがコマンド2に対しての応答を送信したところまでは確認しているのですが、
クライアントがそれを受信していない(TcpClient.Availableが0のまま)という状態です。
> 次に、受信部分の処理の記述が妥当かどうか。
> これはまだ示されていないので何とも言えませんけど。
受信部分については、以下のようになっています。
while (true)
{
//受信待ち
if (this.Client.Available > 0)
{
break; //受信したらループを抜ける
}
Thread.Sleep(100);
}
// 受信
if (this.Client.Available > 0)
{
byte[] ReceiveData = new Byte[this.Client.Available]; //受信データ受け入れ先作成
this.clientStream.Read(ReceiveData, 0, ReceiveData.GetLength(0)); //受信データ読み込み
e.Result = System.Text.Encoding.GetEncoding("UTF-8").GetString(ReceiveData);
if (string.IsNullOrWhiteSpace((string)e.Result) == false)
{
ReceiveCommand = (string)e.Result); //他で使う変数に受信内容を保存
}
}
この処理をバックグラウンドワーカーで起動し、一度受信処理を行いループを抜けた後も、
終了時にバックグラウンドワーカー再起動を行うので、実際は無限ループと同じような処理になっています。
|