我想知道我在正在构建的应用程序中做的是否正确。该应用程序必须接收传入的TCP连接,并在每个调用中使用一个线程,以便服务器可以并行应答多个调用。
我正在做的是,一旦获得接受的客户,就再次调用BeginAcceptTcpClient
。我猜想当ConnectionAccepted
方法被点击时,它实际上是在一个单独的线程中。
public class ServerExample:IDisposable
{
TcpListener _listener;
public ServerExample()
{
_listener = new TcpListener(IPAddress.Any, 10034);
_listener.Start();
_listener.BeginAcceptTcpClient(ConnectionAccepted,null);
}
private void ConnectionAccepted(IAsyncResult ia)
{
_listener.BeginAcceptTcpClient(ConnectionAccepted, null);
try
{
TcpClient client = _listener.EndAcceptTcpClient(ia);
// work with your client
// when this method ends, the poolthread is returned
// to the pool.
}
catch (Exception ex)
{
// handle or rethrow the exception
}
}
public void Dispose()
{
_listener.Stop();
}
}
我说的对吗?
干杯。
最佳答案
好吧,您可以像这样将方法设为静态:
private static void ConnectionAccepted(IAsyncResult ia)
{
var listener = (TcpListener)result.AsyncState;
TcpClient client = listener.EndAcceptTcpClient();
listener.BeginAcceptTcpClient(ConnectionAccepted, listener);
// .....
}
也许您不希望它是静态的,但是通过这种方式,您可以将方法移动到您喜欢的位置,而不依赖于此类中的成员变量,而不必依赖于另一个成员变量。
I.E:分离服务器tcp逻辑和服务器客户端逻辑。