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

}

相关文章
|
网络协议
移远EC600N 4G模块连接步骤
移远EC600N 4G模块连接步骤
1102 0
Windows下的CMake下载与安装
Windows下的CMake下载与安装
Windows下的CMake下载与安装
|
10月前
|
Linux Python
centos 编译安装 python 和 openssl
centos 编译安装 python 和 openssl
592 2
|
调度 C语言
深入浅出:C语言线程以及线程锁
线程锁的基本思想是,只有一个线程能持有锁,其他试图获取锁的线程将被阻塞,直到锁被释放。这样,锁就确保了在任何时刻,只有一个线程能够访问临界区(即需要保护的代码段或数据),从而保证了数据的完整性和一致性。 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含一个或多个线程,而每个线程都有自己的指令指针和寄存器状态,它们共享进程的资源,如内存空间、文件句柄和网络连接等。 线程锁的概念
838 1
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
Ubuntu 开发者 Python
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver
307 0
|
网络架构
移远EC20、EC200S-CN上网测试
移远EC20、EC200S-CN上网测试
1413 2
|
存储 自然语言处理 算法
【软件设计师—基础精讲笔记6】第六章 结构化开发方法
【软件设计师—基础精讲笔记6】第六章 结构化开发方法
1144 0
|
存储 算法 搜索推荐
【中级软件设计师】—数据结构与算法基础考点总结篇(八)
【中级软件设计师】—数据结构与算法基础考点总结篇(八)
【中级软件设计师】—数据结构与算法基础考点总结篇(八)

热门文章

最新文章