it-swarm.com.de

Wie kann man TcpListener so einrichten, dass er immer mehrere Verbindungen abhört und akzeptiert?

Hier ist meine Server-App:

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

So wie es aussieht, hört es immer schon beim Laufen zu, aber ich möchte trotzdem angeben, dass ich sowohl die permanente Wiedergabe als auch die Unterstützung mehrerer Verbindungen wünschen würde.

Wie kann ich das ändern, um ständig zu hören und gleichzeitig mehrere Verbindungen zu akzeptieren?

23
Kehlan Krumme

Die Buchse, an der Sie auf eingehende Verbindungen warten, wird im Allgemeinen als Listening-Buchse bezeichnet. Wenn der abhörende Socket eine eingehende Verbindung bestätigt, wird ein Socket erstellt, der im Allgemeinen als untergeordneter Socket bezeichnet wird und der den fernen Endpunkt darstellt.

Um mehrere Clientverbindungen gleichzeitig handhaben zu können, müssen Sie für jeden untergeordneten Socket einen neuen Thread erstellen, auf dem der Server Daten empfängt und verarbeitet. Dadurch kann der Listen-Socket mehrere Verbindungen akzeptieren und handhaben, da der Thread, den Sie abhören, nicht länger blockiert oder auf eingehende Daten wartet. 

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

Ich hatte heute ein ähnliches Problem und habe es so gelöst:

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

Meine Schleife blieb beim Warten auf eine Verbindung nicht hängen und akzeptierte mehrere Verbindungen.

0
Unknown6656