2013-10-15 4 views
15

Вот мой сервер приложений:Как настроить TcpListener, чтобы всегда слушать и принимать несколько соединений?

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

Из того, что он выглядит, это уже всегда слушаю во время работы, но я все еще просить, чтобы указать, что я хотел бы как всегда прослушивания и поддержка нескольких соединений.

Как я могу изменить это, чтобы постоянно слушать, а также принимать несколько соединений?

+0

делает указание «127.0.0.1» ограничивает прослушивающий разъем только работой на локальной машине? Смогут ли устройства в общедоступной сети получить доступ к этому гнезду для прослушивания? – Zapnologica

ответ

35

Розетка, на которой вы слушаете входящие соединения, обычно называется разъемом для прослушивания . Когда слуховой сокет подтверждает входящее соединение, создается гнездо, обычно называемое дочерним сосетом , которое эффективно представляет удаленную конечную точку.

Чтобы одновременно обрабатывать несколько клиентских подключений, необходимо создать новый поток для каждого дочернего сокета, на котором сервер будет получать и обрабатывать данные. Это позволит прослушивающему сокету принимать и обрабатывать несколько соединений, поскольку поток, на котором вы слушаете, больше не будет блокировать или ждать, пока вы ждете входящих данных.

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

Ничего себе, спасибо за очень краткий ответ. +1 – Kehlan

+1

Как настроить его асинхронно (не разворачивая новый поток для каждого клиента?) – SHM

+0

@SHM Есть ли причина, по которой вы предпочитаете асинхронные потоки? – MrDysprosium

0

У меня была аналогичная проблема сегодня, и решить ее так:

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

Моя петля не застревают на ожидания подключения, и это было принять несколько соединений.

Смежные вопросы