この種の質問は多く寄せられていると思いますが、私はまだ何をすべきかについて混乱しています。
私が欲しいのは、データが送信されるのを待って、ループでサーバー (他の誰かによって作成された) に非同期的に接続することです。メッセージが受信されると、メッセージがオフになり、そのデータで何かを行う必要があります。バックグラウンド ワーカーを使用するのがおそらく最善だと思います。
ただし、 Callback の全体をよく理解していません。msdn の例は正しく機能していないようです。一度だけ読んでから閉じます。メッセージが届くのを待って、接続を開いたままにする必要があります。
接続してメッセージを待機することで、正しい方法で物事を行っていますか?それとも、サーバー側として機能し、クライアントからの接続を許可してから、クライアントから送信されたメッセージを受信する必要がありますか?
正しい方向にプッシュしてください。
よろしく、
ニール
更新 1:
返信ありがとうございます。Callback 関数の必要性は理解していますが、次のコードについて混乱しています。
// Read data from the remote device.
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0) {
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));
// Get the rest of the data.
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
new AsyncCallback(ReceiveCallback), state);
} else {
// All the data has arrived; put it in response.
if (state.sb.Length > 1) {
response = state.sb.ToString();
}
// Signal that all bytes have been received.
receiveDone.Set();
}
私が理解しているように、データを受信してsbに保存します。しかし、さらにデータがある場合に備えて、再び自分自身を呼び出すことになっていますか? 私が受け取ったテストデータは小さいので、すべてが最初に受信されますが、そのコードにブレークポイントを置いてステップスルーすると、Callback が 2 回目に呼び出されないため、次のようになります。
response = state.sb.ToString();
当たることはありません。
そして、私が確信していないもう1つのことは、 Receive() をループで使用して、接続がデータを無期限に待機し、受信したデータを渡す方法です。
コールバックは別のスレッドにありますか? または、データを受信したときにバックグラウンドワーカーを使用して、オフにして必要なことを実行し、接続がデータのリッスンを続行できるようにする必要がありますか?
すべての助けをありがとう。
ニール