2017-10-09 14 views
2

Je crée un service Windows qui accepte les connexions TCP, traite les données envoyées au serveur, puis renvoie un message indiquant que le processus est terminé. Il y a plusieurs clients qui vont se connecter au service et ce nombre augmente. Pour gérer ces messages, j'ai pensé que l'utilisation d'une structure non bloquante serait idéale. Des recherches initiales, le BeginAcceptTcpClient a semblé être ce que je cherchais. Je cherchais at this tutorial pour obtenir un échantillon, mais j'ai quelques questions sur la façon dont cela fonctionne. Mon code que j'ai basé sur cet exemple est ci-dessous.Comment fonctionne le tcplistener begin/async

  1. Dans la fonction OnClientConnected, pourquoi est-il nécessaire d'appeler à nouveau ? Pourquoi l'auditeur n'écoute-t-il pas toujours? Que se passe-t-il si une autre connexion est tentée avant d'appeler à nouveau ? Je sais que c'est la première déclaration dans le OnClientConnected, mais il pourrait y avoir deux connexions qui se produisent "en même temps"
  2. Je ne peux pas vraiment comprendre comment cela fonctionne en termes de multithreading. Si j'avais 10 connexions de simulations, il semblerait que la première entrera OnClientConnected, puis appelez le WaitForClients, ce qui permettra ensuite de gérer une autre connexion. Cela semble une sorte de connexion à la fois approche plutôt que d'avoir plusieurs threads qui peuvent gérer beaucoup de trafic.

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 
    } 
} 

Répondre

2
  1. Non, il accepte exactement autant de connexions que BeginAcceptTcpClient appels, donc afin d'accepter un autre, vous devez appeler BeginAcceptTcpClient à nouveau. Le début du gestionnaire semble être un endroit raisonnable pour le faire.
  2. Il sera mis en file d'attente et traité avec l'appel suivant au BeginAcceptTcpClient ou expiré si cela n'arrive pas en temps opportun.
  3. Please refer to the docs, ceux-ci sont probablement exécutés en utilisant ThreadPool.