Правильный ли этот шаблон для асинхронного прослушивателя TCP? - PullRequest
3 голосов
/ 18 апреля 2011

Мне было интересно, правильно ли я работаю в приложении, которое создаю. Приложение должно принимать входящие 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 Ответ

1 голос
/ 18 апреля 2011

Ну, вы можете сделать метод статическим, как это:

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

возможно, вы не хотите, чтобы он был статическим, но таким образом вы могли бы перемещать метод туда, где вам это нравится, и не зависеть от переменных-членов этого класса, а от другого. I.E: разъединить логику tcp сервера и логику клиента сервера.

...