2

任意の数のクライアントからのメッセージを読み取ることができる非同期サーバーを作成しました。私のサーバーコードはこの例と密接に関連しています:http://msdn.microsoft.com/en-us/library/fx6588te.aspx

クライアントが接続した後、定期的にそのクライアントにデータを送信したいと思います。おそらく1秒間に2〜3回です。非同期のsend()でこれを実現する良い方法を考えることはできません。AcceptCallback()クライアントへの接続が行われる場所であるため、何らかのタイミングメカニズムをメソッドに追加する必要があると思います。

以前のバージョンのサーバーでは、ブロッキングソケットを使用し、send()メソッドを無限while()ループでループsleep()して、タイミングを下げるために呼び出しました。

これが私が考えていることです:

public void AcceptCallback(IAsyncResult ar)
    {
        allDone.Set(); // Signal the main thread to continue.

        // Get the socket that handles the client request.
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);
        IPEndPoint remotePoint = (IPEndPoint)handler.RemoteEndPoint;
        IPAddress remoteAddress = remotePoint.Address;
        Console.WriteLine("Connected to {0}!", remoteAddress.ToString());

        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = handler;

        //Start periodically sending here??

        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);
    }
4

1 に答える 1

1

クライアントにデータを送信するように Timer オブジェクトを設定します。コメントの AcceptCallback メソッドでタイマーをインスタンス化して開始します。そのタイマー コールバックがクライアントにデータを送信できるようにするための情報を追跡する必要があります (ソケットや、停止できるようにするための何らかのテストなど)。ただし、タイマーをオフにすることはできますが、その場合、タイマーを追跡する必要があります)。

ところで、このような状況で Sleep を呼び出さないでください。これは、スレッドがしばらくの間座っていることをコミットし、簡単に中止してスレッドを元に戻すことができないためです (終了するか、他の何かに使用するため)。

于 2012-07-13T15:54:50.460 に答える