我有一台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)
个循环的方法。
答案 0 :(得分:3)
基本上,您的StartMonitoring
函数需要循环 - 您一次只接受一个客户端,然后通常将请求传递给工作线程,然后继续接受新连接。正如你所说,它的写作方式只接受一个客户。
你需要扩展它以适应你的启动/关闭/终止需求,但基本上,你正在寻找的是StartMonitoring
更像这样:
public void StartMonitoring()
{
_isMonitoring = true;
while (_isMonitoring)
Server.BeginAcceptTcpClient(HandleNewClient, null);
}
请注意,如果_isMonitoring
将由另一个线程设置,您最好将其标记为volatile
,否则您可能永远不会终止循环。