2017-10-09 6 views
2

Ich erstelle einen Windows-Dienst, der TCP-Verbindungen akzeptiert, Daten verarbeitet, die an den Server gesendet werden, und gibt dann eine Nachricht zurück, die besagt, dass der Vorgang abgeschlossen ist. Es gibt mehrere Clients, die sich mit dem Dienst verbinden werden und diese Nummer wächst. Um diese Nachrichten zu verarbeiten, dachte ich, dass die Verwendung einer nicht blockierenden Struktur ideal wäre. Von anfänglichen Suchen, schien die BeginAcceptTcpClient, was ich suchte. Ich suchte at this tutorial, um eine Probe zu bekommen, aber ich habe ein paar Fragen, wie das funktioniert. Mein Code, den ich auf diesem Beispiel basiert, ist unten.Wie funktioniert der begin/async tcplistener

  1. In der OnClientConnected Funktion, warum es notwendig ist WaitForClients wieder anrufen? Warum hört der Zuhörer nicht immer zu?
  2. Was passiert, wenn eine andere Verbindung versucht wird, bevor WaitForClients erneut aufgerufen wird? Ich weiß, es ist die erste Aussage in der OnClientConnected, aber es könnte zwei Verbindungen sein, die "zur gleichen Zeit" passieren
  3. Ich kann nicht wirklich verstehen, wie dies in Bezug auf Multithreading funktioniert. Wenn ich 10 Simulationsverbindungen hatte, sieht es so aus, als würde die erste OnClientConnected eingeben und dann WaitForClients anrufen, was dann erlauben wird, dass eine andere Verbindung behandelt wird. Dies scheint eine Art Verbindung mit einer Verbindung zu einer Zeit zu sein, anstatt mehrere Threads zu haben, die viel Verkehr bewältigen können.

public class DeviceListener 
{ 
    private TcpListener listener = null; 

    public DeviceListener() 
    { 
     listener = new TcpListener(1001); 
    } 

    public void StartListener() 
    { 
     listener.Start(); 
     //TODO: Log listening started here 
     WaitForClients(); 
    } 

    private void WaitForClients() 
    { 
     listener.BeginAcceptTcpClient(OnClientConnected, null); 
    } 

    private void OnClientConnected(IAsyncResult asyncResult) 
    { 
     WaitForClients(); 
     TcpClient client = listener.EndAcceptTcpClient(asyncResult); 

     if(client != null) 
     { 
      //TODO: Log connected 
      HandleClientRequest(client); 
     } 
    } 

    private void HandleClientRequest(TcpClient client) 
    { 
     //Code to process client request 
    } 
} 

Antwort

2
  1. Nein, übernimmt es genau so viele Verbindungen wie BeginAcceptTcpClient Anrufe, so um Sie zu einem anderen zu akzeptieren müssen wieder BeginAcceptTcpClient nennen. Der Beginn des Handlers scheint ein vernünftiger Ort dafür zu sein.
  2. Es wird in die Warteschlange eingereiht und mit dem nächsten Anruf an BeginAcceptTcpClient oder Zeitüberschreitung behandelt, wenn das nicht rechtzeitig geschieht.
  3. Please refer to the docs werden diese höchstwahrscheinlich mit ThreadPool ausgeführt.
Verwandte Themen