C# 实现基于 TCP 的简单聊天程序(服务端)

简介: 基于TcpListener实现TCP聊天服务器,监听指定端口,接收客户端连接并实时转发消息。支持多客户端并发通信,新连接自动加入广播列表,断开后自动移除,确保线程安全与稳定运行。

使用 TcpListener 实现 TCP 服务端,监听客户端连接并转发消息。
using System.Net;
using System.Net.Sockets;
using System.Text;

public class TcpChatServer
{
private TcpListener _listener;
private List _clients = new List();
private readonly object _lockObj = new object();

public async Task Start(int port)
{
    _listener = new TcpListener(IPAddress.Any, port);
    _listener.Start();
    Console.WriteLine("服务器已启动,监听端口: " + port);

    while (true)
    {
        var client = await _listener.AcceptTcpClientAsync();
        lock (_lockObj) _clients.Add(client);
        Console.WriteLine("新客户端连接");
        _ = HandleClient(client);
    }
}

private async Task HandleClient(TcpClient client)
{
    NetworkStream stream = client.GetStream();
    byte[] buffer = new byte[1024];

    try
    {
        while (client.Connected)
        {
            int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
            if (bytesRead == 0) break;

            string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine($"客户端: {message}");
            // 广播消息给所有客户端
            await BroadcastMessage(message, client);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"客户端处理异常: {ex.Message}");
    }
    finally
    {
        lock (_lockObj) _clients.Remove(client);
        client.Close();
    }
}

private async Task BroadcastMessage(string message, TcpClient sender)
{
    byte[] data = Encoding.UTF8.GetBytes(message);
    lock (_lockObj)
    {
        foreach (var client in _clients)
        {
            if (client != sender && client.Connected)
            {
                await client.GetStream().WriteAsync(data, 0, data.Length);
            }
        }
    }
}

// 调用示例
public static async Task TestServer()
{
    var server = new TcpChatServer();
    await server.Start(8888);
}

}

相关文章
|
2月前
|
监控 网络协议 C#
基于C#的TCP/IP通信客户端与服务器
基于C#的TCP/IP通信客户端与服务器
344 0
|
9月前
|
网络协议 网络安全 API
C# 与三菱FX5U PLC通讯交互指南
C# 与三菱FX5U PLC通讯交互指南
3138 121
|
人工智能 IDE 开发工具
JetBrains PyCharm 2025.1 发布 - 面向专业开发者的 Python IDE
JetBrains PyCharm 2025.1 (macOS, Linux, Windows) - 面向专业开发者的 Python IDE
1476 29
JetBrains PyCharm 2025.1 发布 - 面向专业开发者的 Python IDE
|
7月前
|
存储 缓存 监控
值得买 item_search 接口对接全攻略:从入门到精通
什么值得买商品搜索接口解析实战:基于页面爬取,详解参数构造、反爬策略与数据提取,助力构建比价、优惠监控与消费趋势分析系统。(239字)
|
存储 JSON 关系型数据库
详细讲解MySQL中的数据类型
1. TINYINT:占用1字节,表示范围为-128到127的有符号整数或0到255的无符号整数。 2. SMALLINT:占用2字节,表示范围为-32768到32767的有符号整数或0到65535的无符号整数。 3. MEDIUMINT:占用3字节,表示范围为-8388608到8388607的有符号整数或0到16777215的无符号整数。 4. INT(INTEGER):占用4字节,表示范围为-2147483648到2147483647的有符号整数或0到4294967295的无符号整数。 5. BIGINT:占用8字节,表示范围为-9223372036854775808到922337
539 0
详细讲解MySQL中的数据类型
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
1300 1
|
存储 C语言 开发者
C标准库-time.h
`<time.h>` 是 C 语言标准库中的头文件,提供了处理日期和时间的功能。它定义了 `time_t`, `tm` 等类型及多种函数,如 `time()` 获取当前时间戳,`localtime()` 和 `gmtime()` 将时间戳转换为本地时间和 UTC 时间,`strftime()` 格式化时间,`mktime()` 将 `tm` 结构转换为时间戳,`nanosleep()` 暂停程序执行等。这些功能帮助开发者高效地进行时间相关的编程工作。
|
前端开发 JavaScript 项目管理
Poetry vs npm:两个包管理器的迷人相似性
我们知道 Python 有自己的生态链。Python 版本也非常多,为了处理这么多的版本造成的包问题,Python 有了虚拟环境。在开始之前本文默认对 Python 的生态有了基础的了解(pip 等等)。 本文全面介绍了 Python 包管理项目管理,虚拟环境管理工具的 Poetry 的基本用法。对比不同的编程语言对包的管理其实都是相似的,Peotry 的与 npm 极为相似,你掌握其中一个另一个基本也熟悉了。
|
自然语言处理 IDE 开发工具
通义灵码上线 Visual Studio 插件市场啦!
通义灵码上线 Visual Studio 插件市场啦!
|
设计模式 测试技术 C#
WPF/C#:在WPF中如何实现依赖注入
WPF/C#:在WPF中如何实现依赖注入
791 0