2
私は、TCP接続を受け入れ、サーバーに送信されたデータを処理し、プロセスが完了したというメッセージを返すWindowsサービスを作成しています。サービスに接続するクライアントがいくつかあり、その数が増えています。これらのメッセージを処理するには、ノンブロッキング構造を使用することが理想的だと思いました。最初の検索から、BeginAcceptTcpClient
が私が探していたようでした。私はサンプルを取得するためにat this tutorialを見ていたが、私はこれがどのように動作するかについていくつか質問がある。この例に基づいている私のコードは以下の通りです。begin/async tcplistenerはどのように動作するのですか?
OnClientConnected
の機能では、なぜWaitForClients
に再度電話する必要がありますか?リスナーはいつも聞いていないのですか?WaitForClients
が再度呼び出される前に別の接続が試行されるとどうなりますか?私はそれがOnClientConnected
の最初のステートメントであることを知っていますが、同時に2つの接続が発生する可能性があります。- これはマルチスレッドに関してどのように動作するのか分かりません。シミュレーション接続が10個ある場合は、最初に
OnClientConnected
と入力し、次にWaitForClients
と入力すると、別の接続を処理できるようになります。これは、多くのトラフィックを処理できる複数のスレッドを持つのではなく、一度に1つの接続というように見えます。
public class DeviceListener
{
private TcpListener listener = null;
public DeviceListener()
{
listener = new TcpListener(1001);
}
public void StartListener()
{
listener.Start();
//TODO: Log listening started here
WaitForClients();
}
private void WaitForClients()
{
listener.BeginAcceptTcpClient(OnClientConnected, null);
}
private void OnClientConnected(IAsyncResult asyncResult)
{
WaitForClients();
TcpClient client = listener.EndAcceptTcpClient(asyncResult);
if(client != null)
{
//TODO: Log connected
HandleClientRequest(client);
}
}
private void HandleClientRequest(TcpClient client)
{
//Code to process client request
}
}