visual uso solo socket servidor programar permite net dirección conexion como clase cada c# networking tcplistener

c# - uso - tcp vb net



¿Cómo configurar TcpListener para que siempre escuche y acepte conexiones múltiples? (2)

Aquí está mi aplicación de servidor:

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

Por lo que parece, ya está siempre escuchando mientras se ejecuta, pero sigo pidiendo que especifique que me gustaría tanto la escucha siempre como la compatibilidad con múltiples conexiones.

¿Cómo puedo modificar esto para escuchar constantemente y también aceptar conexiones múltiples?


El zócalo en el que escucha las conexiones entrantes se conoce comúnmente como el zócalo de escucha . Cuando el zócalo de escucha reconoce una conexión entrante, se crea un zócalo comúnmente conocido como zócalo secundario que representa efectivamente el punto final remoto.

Para manejar varias conexiones de clientes simultáneamente, deberá generar un nuevo hilo para cada socket secundario en el que el servidor recibirá y manejará los datos. Si lo hace, permitirá que el conector de escucha acepte y maneje múltiples conexiones, ya que el hilo en el que está escuchando ya no estará bloqueando o esperando mientras espera los datos 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(); }


Tuve un problema similar hoy, y lo resolví así:

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

Mi bucle no se atascó en la espera de una conexión y aceptó varias conexiones.