这种模式对于异步TCP侦听器是否正确?

时间:2011-04-18 16:24:51

标签: .net multithreading sockets asynchronous tcplistener

我想知道我在正在构建的应用程序中是否正确。应用程序必须接收传入的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();
    }
}

我做对了吗?

干杯。

1 个答案:

答案 0 :(得分:1)

嗯,你可以像这样使方法静态:

private static void ConnectionAccepted(IAsyncResult ia)
    {         
     var listener = (TcpListener)result.AsyncState;
     TcpClient client = listener.EndAcceptTcpClient();
     listener.BeginAcceptTcpClient(ConnectionAccepted, listener);
     // .....
     }

也许你不希望它是静态的,但是这样你可以将方法移动到你喜欢的地方,并且不依赖于这个类中的成员变量而是另一个。 I.E:解耦服务器tcp逻辑和服务器客户端逻辑。