using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

// 声明SocketAsyncEventArgs对象
SocketAsyncEventArgs socketEventArg;

public class ChatServer
{
    // 定义IP地址和端口号
    private static readonly IPAddress IP = IPAddress.Parse('127.0.0.1');
    private static readonly int Port = 8080;

    // 定义Socket对象
    private static Socket serverSocket;

    // 定义客户端列表
    private static readonly List<Socket> clientSockets = new List<Socket>();

    // 定义字节缓冲区大小
    private static readonly int BUFFER_SIZE = 2048;

    // 定义字节缓冲区
    private static readonly byte[] buffer = new byte[BUFFER_SIZE];

    static void Main(string[] args)
    {
        // 创建Socket对象
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // 绑定IP地址和端口号
        serverSocket.Bind(new IPEndPoint(IP, Port));

        // 启动监听
        serverSocket.Listen(5);

        Console.WriteLine('服务器已启动,监听端口:' + Port);

        // 创建SocketAsyncEventArgs对象
        socketEventArg = new SocketAsyncEventArgs();
        socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceiveCompleted);
        socketEventArg.SetBuffer(buffer, 0, BUFFER_SIZE);

        // 开始接受客户端连接
        Accept();

        // 防止控制台关闭
        while (true)
        {
            Console.ReadLine();
        }
    }

    // 接受客户端连接
    private static void Accept()
    {
        // 创建异步操作对象
        SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs();
        acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);

        // 开始异步接受客户端连接
        serverSocket.AcceptAsync(acceptEventArg);
    }

    // 客户端连接完成回调函数
    private static void OnAcceptCompleted(object sender, SocketAsyncEventArgs e)
    {
        // 如果有异常则返回
        if (e.SocketError != SocketError.Success)
        {
            Console.WriteLine('客户端连接失败:' + e.SocketError);
            return;
        }

        // 添加客户端Socket到列表中
        clientSockets.Add(e.AcceptSocket);

        Console.WriteLine('客户端已连接,当前客户端数量:' + clientSockets.Count);

        // 接受客户端发送的消息
        Receive(e.AcceptSocket);

        // 继续接受客户端连接
        Accept();
    }

    // 接受客户端消息
    private static void Receive(Socket socket)
    {
        // 开始异步接收消息
        socket.ReceiveAsync(socketEventArg);
    }

    // 客户端消息接收完成回调函数
    private static void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
    {
        // 如果有异常则返回
        if (e.SocketError != SocketError.Success)
        {
            Console.WriteLine('消息接收失败:' + e.SocketError);
            return;
        }

        // 如果接收到的数据长度为0则表示客户端已关闭连接
        if (e.BytesTransferred == 0)
        {
            CloseClientSocket(e);
            return;
        }

        // 接收到数据
        string message = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);
        Console.WriteLine('收到消息:' + message);

        // 将消息发送给所有客户端
        foreach (Socket clientSocket in clientSockets)
        {
            if (clientSocket != e.AcceptSocket)  // 不要将消息发给自己
            {
                clientSocket.Send(Encoding.UTF8.GetBytes(message));
            }
        }

        // 继续接收消息
        Receive(e.AcceptSocket);
    }

    // 关闭客户端连接
    private static void CloseClientSocket(SocketAsyncEventArgs e)
    {
        Socket socket = e.AcceptSocket;
        socket.Close();
        clientSockets.Remove(socket);
        Console.WriteLine('客户端已关闭连接,当前客户端数量:' + clientSockets.Count);
    }
}

此代码创建了一个简单的聊天服务器,用于接受客户端连接并接收和转发聊天消息。它使用异步套接字操作来提高性能并避免阻塞主线程。在处理SocketAsyncEventArgs对象时,使用Completed事件来指定回调函数,以便在操作完成时执行必要的代码。

C# 简单聊天服务器示例代码:异步套接字实现

原文地址: https://www.cveoy.top/t/topic/l4y0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录