begin/async tcplistener 是如何工作的
How does the begin/async tcplistener work
我正在创建一个 windows 服务,该服务接受 TCP 连接,处理发送到服务器的数据,然后 returns 返回一条消息,说明该过程已完成。有几个客户端将连接到该服务,而且这个数字还在增长。为了处理这些消息,我认为使用非阻塞结构是最理想的。从最初的搜索来看,BeginAcceptTcpClient
似乎就是我要找的东西。我正在寻找 at this tutorial 来获取示例,但我对它的工作原理有一些疑问。我基于此示例的代码如下。
- 在
OnClientConnected
函数中,为什么还要调用WaitForClients
呢?为什么听者不总是倾听?
- 如果在再次调用
WaitForClients
之前尝试另一个连接会怎样?我知道这是 OnClientConnected
中的第一条语句,但可能会发生两个连接 "at the same time"
- 我真的无法理解它在多线程方面的工作原理。如果我有 10 个模拟连接,看起来第一个将进入
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
}
}
- 不,它接受与
BeginAcceptTcpClient
调用一样多的连接,因此为了接受另一个连接,您需要再次调用 BeginAcceptTcpClient
。处理程序的开头似乎是这样做的合理位置。
- 它将在下一次调用
BeginAcceptTcpClient
时排队和处理,如果没有及时发生,则超时。
- Please refer to the docs,这些很可能是 运行 使用
ThreadPool
。
我正在创建一个 windows 服务,该服务接受 TCP 连接,处理发送到服务器的数据,然后 returns 返回一条消息,说明该过程已完成。有几个客户端将连接到该服务,而且这个数字还在增长。为了处理这些消息,我认为使用非阻塞结构是最理想的。从最初的搜索来看,BeginAcceptTcpClient
似乎就是我要找的东西。我正在寻找 at this tutorial 来获取示例,但我对它的工作原理有一些疑问。我基于此示例的代码如下。
- 在
OnClientConnected
函数中,为什么还要调用WaitForClients
呢?为什么听者不总是倾听? - 如果在再次调用
WaitForClients
之前尝试另一个连接会怎样?我知道这是OnClientConnected
中的第一条语句,但可能会发生两个连接 "at the same time" - 我真的无法理解它在多线程方面的工作原理。如果我有 10 个模拟连接,看起来第一个将进入
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
}
}
- 不,它接受与
BeginAcceptTcpClient
调用一样多的连接,因此为了接受另一个连接,您需要再次调用BeginAcceptTcpClient
。处理程序的开头似乎是这样做的合理位置。 - 它将在下一次调用
BeginAcceptTcpClient
时排队和处理,如果没有及时发生,则超时。 - Please refer to the docs,这些很可能是 运行 使用
ThreadPool
。