如何设置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(); } } 

从它的外观来看,它已经在运行时一直在聆听,但我仍然要求指明我喜欢永远倾听和多连接支持。

如何修改此function以便在接受多个连接的同时不断收听?

侦听传入连接的套接字通常称为侦听套接字 。 当侦听套接字确认传入连接时,创建通常称为子套接字的套接字 ,其有效地表示远程端点。

为了同时处理多个客户端连接,您需要为服务器将接收和处理数据的每个子套接字生成一个新线程。 这样做将允许侦听套接字接受并处理多个连接,因为在您等待传入数据时,您正在侦听的线程将不再阻塞或等待。

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

我今天遇到了类似的问题,并解决了这个问题:

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

我的循环没有停留等待连接,它确实接受了多个连接。