我如何持续监视新的TCP客户端?

我有一个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
        }
    }
}

但是,此代码有两个问题.

第一个是HandleNewClient()中的StartMonitoring()调用.没有它,服务器将仅接受一个传入连接,而忽略任何其他连接.我想做的是不断监视新客户,但是我现在做事的方式使我感到不对.有更好的方法吗?

第二个是_isMonitoring标志.我不知道如何停止异步回调的激活并使其停止循环.关于如何可以改善的任何建议?我想坚持使用异步回调,并避免必须手动创建运行其中具有while(true)循环的方法的新线程.

解决方法:

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

您将希望对此进行扩展以适合您的启动/关闭/终止需求,但是基本上,您正在寻找的是StartMonitoring,它更像是这样:

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

请注意,如果_isMonitoring将由另一个线程设置,则最好将其标记为volatile,否则可能永远不会终止循环.

上一篇:任务管理器中的内存使用率是否不断增加


下一篇:CodeGo.net> TcpClient(IPEndPoint localEP),选择正确的localEp?