使用c#开发一个简单的聊天功能并且注释带
下面是一个简单的基于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事件来指定回调函数,以便在操作完成时执行必要的代码。
原文地址: https://www.cveoy.top/t/topic/ME8 著作权归作者所有。请勿转载和采集!