我正在创建一个接受TCP连接的Windows服务,处理发送到服务器的数据,然后返回一条消息,说明该过程已完成。有几个客户端将连接到该服务,并且该数量正在增长。为了处理这些消息,我认为使用非阻塞结构将是理想的。从最初的搜索开始,BeginAcceptTcpClient
似乎就是我想要的。我正在寻找at this tutorial来获取样本,但我对如何运作有一些疑问。我基于这个例子的代码如下。
OnClientConnected
函数中,为什么还需要再次调用WaitForClients
?为什么听众总是不听?WaitForClients
之前尝试了另一个连接,会发生什么?我知道这是OnClientConnected
中的第一个声明,但可能会发生两个连接"同时#34; OnClientConnected
,然后调用WaitForClients
,这将允许处理另一个连接。这似乎是一次一个连接,而不是有几个线程可以处理大量的流量。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
}
}
答案 0 :(得分:2)
BeginAcceptTcpClient
次呼叫完全相同的连接数,因此要接受另一个连接,您需要再次呼叫BeginAcceptTcpClient
。处理程序的开头似乎是一个合理的地方。BeginAcceptTcpClient
时处理或超时。ThreadPool
运行的。