我有些困惑如何正确地在.NET中实现TcpListner和TcpClient的异步方法。我已经阅读了很多关于此问题的帖子,并且相信我已经解决了服务器接受新客户端的代码。以下是接受新连接的代码:
Public Sub Start()
m_oListener = New TcpListener(m_oIpAddress, m_iPort)
m_oListener.Start()
m_oListener.BeginAcceptTcpClient(New AsyncCallback(AddressOf OnAcceptClient), m_oListener)
End Sub
Public Sub OnAcceptClient(ByVal ar As IAsyncResult)
Dim listener As TcpListener = CType(ar.AsyncState, TcpListener)
Dim client As TcpClient = listener.EndAcceptTcpClient(ar)
If listener.Server.IsBound Then
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf OnHandleClient), client)
listener.BeginAcceptTcpClient(New AsyncCallback(AddressOf OnAcceptClient), listener)
End If
End Sub
我不确定的是一旦连接建立后应该如何处理客户端。从我所看到的情况来看,通常人们为每个连接的客户端创建一个新线程,以防止IO读取阻塞应用程序。
我的应用程序将在任何时候最多连接100个客户端。如果为每个客户端启动一个新线程,那么我将有大约100个线程。这正确吗?我认为我只是在.NET框架的异步方法方面缺少一些东西。
我看到的大多数示例都是服务器接受连接,读取短消息(例如“hello server”),然后关闭客户端并关闭服务器。这并不能帮助我了解在长时间内维护大量活动客户端的正确方式。
提前感谢您的任何帮助。
BeginRead()
方法将自动将您放入线程池中,因此您已经准备就绪。 - Jon B