服务器端多TcpClient连接交互异常问题求助
问题根源
你的服务器代码是单线程阻塞模式,一旦第一个客户端连接,代码就会卡在该客户端的Read循环里,根本没法回到外层循环去接收新的客户端连接。后续客户端虽然能成功建立TCP连接,但服务器没有任何线程去处理它们的消息,所以看起来服务器没响应。
修复方案
给每个新连接的客户端单独分配异步任务(或线程)来处理消息交互,让主线程专注于监听新连接请求。
修复后的完整代码
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Collections.Generic; class TcpServer { private static List<TcpClient> _connectedClients = new List<TcpClient>(); private const int _bufferSize = 1024; static void Main(string[] args) { IPAddress ip = IPAddress.Parse("127.0.0.1"); TcpListener server = new TcpListener(ip, 1234); server.Start(); Console.WriteLine("服务器启动,等待客户端连接..."); while (true) { // 接受新客户端 TcpClient client = server.AcceptTcpClient(); // 线程安全地添加到客户端列表 lock (_connectedClients) { _connectedClients.Add(client); } Console.WriteLine($"新客户端接入,当前在线:{_connectedClients.Count}"); // 开启单独任务处理该客户端的消息 Task.Run(() => ProcessClient(client)); } } private static void ProcessClient(TcpClient client) { NetworkStream stream = client.GetStream(); byte[] buffer = new byte[_bufferSize]; int bytesRead; try { // 循环读取客户端发送的消息 while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0) { string receivedText = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到客户端消息:{receivedText}"); // 可选:把消息广播给所有其他在线客户端 BroadcastMessage(receivedText, client); } } catch (Exception ex) { Console.WriteLine($"客户端处理异常:{ex.Message}"); } finally { // 客户端断开后清理资源 lock (_connectedClients) { _connectedClients.Remove(client); } client.Close(); Console.WriteLine($"客户端断开,当前在线:{_connectedClients.Count}"); } } // 可选:实现消息广播功能 private static void BroadcastMessage(string message, TcpClient sender) { byte[] messageBytes = Encoding.ASCII.GetBytes(message); lock (_connectedClients) { foreach (var client in _connectedClients) { if (client != sender && client.Connected) { try { NetworkStream stream = client.GetStream(); stream.Write(messageBytes, 0, messageBytes.Length); } catch (Exception ex) { Console.WriteLine($"广播失败:{ex.Message}"); } } } } } }
核心改进说明
- 用
Task.Run为每个客户端创建独立处理流程,主线程不会被阻塞,能持续接收新连接 - 操作客户端列表时加
lock,避免多线程并发修改引发的异常 - 增加了客户端断开后的资源释放逻辑,避免内存泄漏
- 附带实现了消息广播,直接支持多客户端间的消息交互
内容的提问来源于stack exchange,提问作者quizor12
相关产品推荐
相关产品推荐

