3

新しい着信クライアントを非同期的に継続的に監視し、それらをクライアントリストに追加するTCPサーバーがあります。

public class TcpServer
{
    public List<TcpClient> ClientsList = new List<TcpClient>();
    protected TcpListener Server = new TcpListener(IPAddress.Any, 3000);
    private _isMonitoring = false;

    public TcpServer()
    {
        Server.Start();
        Server.StartMonitoring();
    }

    public void StartMonitoring()
    {
        _isMonitoring = true;
        Server.BeginAcceptTcpClient(HandleNewClient, null);
    }

    public void StopMonitoring()
    {
        _isMonitoring = false;
    }

    protected void HandleNewClient(IAsyncResult result)
    {
        if (_isMonitoring)
        {
            var client = Server.EndAcceptTcpClient(result);
            ClientsList.Add(client);

            StartMonitoring(); // repeats the monitoring
        }
    }
}

ただし、このコードには2つの問題があります。

1つ目はのStartMonitoring()呼び出しですHandleNewClient()。これがないと、サーバーは1つの着信接続のみを受け入れ、追加の接続を無視します。私がやりたいのは、新しいクライアントを継続的に監視することですが、現在のやり方について何かが間違っています。これを行うためのより良い方法はありますか?

2番目は_isMonitoring旗です。非同期コールバックのアクティブ化を停止し、ループを停止する他の方法がわかりません。これをどのように改善できるかについてのアドバイスはありますか?while (true)非同期コールバックの使用に固執し、ループを含むメソッドを実行する新しいスレッドを手動で作成する必要をなくしたいと思います。

4

1 に答える 1

3

基本的に、StartMonitoring関数はループする必要があります。一度に 1 つのクライアントのみを受け入れ、通常は要求をワーカー スレッドに渡し、新しい接続の受け入れを再開します。あなたが述べたように、その書き方では、単一のクライアントのみを受け入れます。

起動/シャットダウン/終了のニーズに合わせてこれを拡張する必要がありますが、基本的に、探しているのは次StartMonitoringのようになることです。

public void StartMonitoring()
{
    _isMonitoring = true;
    while (_isMonitoring)
        Server.BeginAcceptTcpClient(HandleNewClient, null);
}

_isMonitoringが別のスレッドによって設定される場合は、それを としてマークしたほうがよいことに注意してvolatileください。そうしないと、ループが終了しない可能性があります。

于 2010-08-26T23:02:14.850 に答える