1

この種の質問は多く寄せられていると思いますが、私はまだ何をすべきかについて混乱しています。

私が欲しいのは、データが送信されるのを待って、ループでサーバー (他の誰かによって作成された) に非同期的に接続することです。メッセージが受信されると、メッセージがオフになり、そのデータで何かを行う必要があります。バックグラウンド ワーカーを使用するのがおそらく最善だと思います。

ただし、 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() をループで使用して、接続がデータを無期限に待機し、受信したデータを渡す方法です。

コールバックは別のスレッドにありますか? または、データを受信したときにバックグラウンドワーカーを使用して、オフにして必要なことを実行し、接続がデータのリッスンを続行できるようにする必要がありますか?

すべての助けをありがとう。

ニール

4

1 に答える 1

0

質問にソケットのタグを付けたので、.Netソケット名前空間を使用していると思います。これは、非同期受け入れ接続と非同期読み取りをサポートします。次のリンクはそれを適切に説明しています-

http://msdn.microsoft.com/en-us/library/bew39x2a.aspx

説明するために、コードをコピーして貼り付けます-

private static void Receive(Socket client) {
    try {
        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = client;

        // Begin receiving the data from the remote device.
        client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReceiveCallback), state);
    } catch (Exception e) {
        Console.WriteLine(e.ToString());
    }
}

上記の receive 関数は、サーバーとの接続が確立されると呼び出されます。パラメーターとして新しい AsyncCallback 関数を受け取る BeginReceive の呼び出しに注意してください。サーバーから送信されたデータがある場合は常に、この関数 (ReceiveCallBack) が呼び出され、何かを実行します。これはうまくいきます!

お役に立てれば。

于 2012-09-25T15:21:24.257 に答える