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
- 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 leOnClientConnected
, mais il pourrait y avoir deux connexions qui se produisent "en même temps" - 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 leWaitForClients
, 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
}
}