web-dev-qa-db-fra.com

Comment configurer TcpListener pour toujours écouter et accepter plusieurs connexions?

Voici mon application serveur:

public static void Main()
{
    try
    {
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");

        Console.WriteLine("Starting TCP listener...");

        TcpListener listener = new TcpListener(ipAddress, 500);

        listener.Start();

        while (true)
        {
            Console.WriteLine("Server is listening on " + listener.LocalEndpoint);

            Console.WriteLine("Waiting for a connection...");

            Socket client = listener.AcceptSocket();

            Console.WriteLine("Connection accepted.");

            Console.WriteLine("Reading data...");

            byte[] data = new byte[100];
            int size = client.Receive(data);
            Console.WriteLine("Recieved data: ");
            for (int i = 0; i < size; i++)
                Console.Write(Convert.ToChar(data[i]));

            Console.WriteLine();

            client.Close();
        }

        listener.Stop();
    }
    catch (Exception e)
    {
        Console.WriteLine("Error: " + e.StackTrace);
        Console.ReadLine();
    }
}

De ce à quoi il ressemble, il écoute déjà en cours d’exécution, mais je lui demande tout de même de préciser que je souhaite une prise en charge permanente et une connexion multiple.

Comment puis-je modifier cela pour écouter en permanence tout en acceptant plusieurs connexions?

23
Kehlan Krumme

Le socket sur lequel vous écoutez les connexions entrantes est communément appelé le listening socket . Lorsque le socket en écoute reconnaît une connexion entrante, il crée un socket communément appelé socket socket qui représente le point de terminaison distant.

Afin de gérer plusieurs connexions client simultanément, vous devez créer un nouveau thread pour chaque socket enfant sur lequel le serveur recevra et gérera les données. Cela permettra au socket en écoute d'accepter et de gérer plusieurs connexions car le thread sur lequel vous écoutez ne bloque plus ni n'attend en attendant les données entrantes. 

while (true)
{
    Socket client = listener.AcceptSocket();
    Console.WriteLine("Connection accepted.");

    var childSocketThread = new Thread(() =>
    {
        byte[] data = new byte[100];
        int size = client.Receive(data);
        Console.WriteLine("Recieved data: ");
        for (int i = 0; i < size; i++)
            Console.Write(Convert.ToChar(data[i]));

        Console.WriteLine();

        client.Close();
    });
    childSocketThread.Start();
}
44
User 12345678

J'ai eu un problème similaire aujourd'hui et je l'ai résolu comme ceci:

while (listen) // <--- boolean flag to exit loop
{
   if (listener.Pending())
   {
      Thread tmp_thread = new Thread(new ThreadStart(() =>
      {
         string msg = null;

         clt = listener.AcceptTcpClient();

         using (NetworkStream ns = clt.GetStream())
         using (StreamReader sr = new StreamReader(ns))
         {
            msg = sr.ReadToEnd();
         }

         Console.WriteLine("Received new message (" + msg.Length + " bytes):\n" + msg);
      }
      tmp_thread.Start();
   }
   else
   {
       Thread.Sleep(100); //<--- timeout
   }
}

Ma boucle n’est pas restée en attente d’une connexion et elle a accepté plusieurs connexions.

0
Unknown6656