我想知道我在正在构建的应用程序中做的是否正确。该应用程序必须接收传入的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逻辑和服务器客户端逻辑。

10-06 06:24