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
        }
    }
}

但是,这段代码有两个问题。

第一个是StartMonitoring()调用HandleNewClient()。没有它,服务器将只接受一个传入连接并忽略任何其他连接。我想做的是让它不断地监控新客户,但我现在的做法让我觉得有些不对劲。有没有更好的方法来做到这一点?

第二个是_isMonitoring国旗。我不知道如何阻止异步回调激活并阻止它循环。关于如何改进的任何建议?我想坚持使用异步回调,避免手动创建新线程来运行其中包含while (true)循环的方法。

4

1 回答 1

3

基本上,您的StartMonitoring函数需要循环 - 您一次只接受一个客户端,然后您通常会将请求传递给工作线程,然后继续接受新连接。正如您所说,它的编写方式只接受一个客户。

您需要对此进行扩展以满足您的启动/关闭/终止需求,但基本上,您正在寻找的是StartMonitoring更像这样:

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

Note that if _isMonitoring is going to be set by another thread, you'd better mark it as volatile, or you'll likely never terminate the loops.

于 2010-08-26T23:02:14.850 回答