下面是一个简单的基于C#的聊天程序示例代码,注释包含在代码中:

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/ME8 著作权归作者所有。请勿转载和采集!

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