4 Stimmen

Ist dieses Muster für einen asynchronen TCP-Listener korrekt?

Ich habe mich gefragt, ob ich bei einer Anwendung, die ich gerade entwickle, richtig vorgehe. Die Anwendung muss eingehende TCP-Verbindungen empfangen und einen Thread pro Anruf verwenden, damit der Server mehrere Anrufe parallel beantworten kann.

Was ich tue, ist ein Anruf BeginAcceptTcpClient sobald ich einen akzeptierten Kunden habe. Ich vermute, dass wenn die ConnectionAccepted Methode getroffen wird, befindet sie sich eigentlich in einem separaten Thread.

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();
    }
}

Mache ich das richtig?

Zum Wohl.

1voto

Marino Šimić Punkte 7256

Sie könnten die Methode statisch machen, wie folgt:

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

vielleicht wollen Sie nicht, dass sie statisch ist, aber auf diese Weise können Sie die Methode dorthin verschieben, wo Sie sie haben möchten, und sind nicht von Mitgliedsvariablen in dieser Klasse abhängig, sondern von einer anderen. D.h.: Entkoppeln Sie die Server-TCP-Logik und die Server-Client-Logik.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X