You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务器端多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:25:04