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