基于Netty的多人聊天室服务端实现
import io.netty.bootstrap.ServerBootstrap; // 引入Netty的ServerBootstrap类,用于启动服务器
import io.netty.channel.ChannelFuture; // 引入Netty的ChannelFuture类,用于异步操作的结果通知
import io.netty.channel.ChannelHandlerContext; // 引入Netty的ChannelHandlerContext类,用于处理网络事件
import io.netty.channel.ChannelInitializer; // 引入Netty的ChannelInitializer类,用于初始化Channel
import io.netty.channel.ChannelOption; // 引入Netty的ChannelOption类,用于设置channel的选项
import io.netty.channel.EventLoopGroup; // 引入Netty的EventLoopGroup类,用于处理事件的循环组
import io.netty.channel.nio.NioEventLoopGroup; // 引入Netty的NioEventLoopGroup类,用于处理NIO类型的事件循环
import io.netty.channel.socket.SocketChannel; // 引入Netty的SocketChannel类,用于处理网络套接字的通道
import io.netty.channel.socket.nio.NioServerSocketChannel; // 引入Netty的NioServerSocketChannel类,用于创建NIO类型的服务器套接字通道
import io.netty.handler.codec.string.StringDecoder; // 引入Netty的StringDecoder类,用于将字节解码为字符串
import io.netty.handler.codec.string.StringEncoder; // 引入Netty的StringEncoder类,用于将字符串编码为字节
import io.netty.util.concurrent.DefaultEventExecutorGroup; // 引入Netty的DefaultEventExecutorGroup类,用于处理任务的执行组
import io.netty.util.concurrent.EventExecutorGroup; // 引入Netty的EventExecutorGroup类,用于处理任务的执行组
import java.util.concurrent.ConcurrentHashMap; // 引入java.util.concurrent.ConcurrentHashMap类,用于线程安全的存储用户信息
public class MultiChatServer {
private final int port; // 服务器端口
private final ConcurrentHashMap<String, ChannelHandlerContext> userMap = new ConcurrentHashMap<>(); // 存储用户信息的map,使用用户名作为key,ChannelHandlerContext作为value
private final EventExecutorGroup group = new DefaultEventExecutorGroup(16); // 处理任务的执行组,使用线程池提高效率
public MultiChatServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(); // 创建bossGroup,用于接收客户端连接
EventLoopGroup workerGroup = new NioEventLoopGroup(); // 创建workerGroup,用于处理已连接客户端的I/O事件
try {
ServerBootstrap b = new ServerBootstrap(); // 创建ServerBootstrap实例,用于配置服务器启动参数
b.group(bossGroup, workerGroup) // 设置bossGroup和workerGroup,分别用于处理连接请求和读写事件
.channel(NioServerSocketChannel.class) // 设置服务器套接字通道的类型为NIO类型
.childHandler(new ChannelInitializer<SocketChannel>() { // 设置childHandler,用于初始化每个新连接的Channel
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringDecoder(), new StringEncoder(), new MultiChatServerHandler(userMap, group)); // 添加解码器、编码器和自定义的处理器到ChannelPipeline
}
})
.option(ChannelOption.SO_BACKLOG, 128) // 设置服务器套接字通道的选项,SO_BACKLOG用于设置连接队列的大小
.childOption(ChannelOption.SO_KEEPALIVE, true); // 设置连接的选项,SO_KEEPALIVE用于保持连接活跃
ChannelFuture f = b.bind(port).sync(); // 绑定端口并启动服务器,sync()方法会阻塞直到绑定完成
System.out.println('Server started on port ' + port); // 打印服务器启动信息
f.channel().closeFuture().sync(); // 等待服务器关闭,closeFuture()方法返回一个ChannelFuture,用于监听服务器关闭事件
} finally {
workerGroup.shutdownGracefully(); // 关闭workerGroup,释放资源
bossGroup.shutdownGracefully(); // 关闭bossGroup,释放资源
}
}
public static void main(String[] args) throws Exception {
int port = 8080; // 设置服务器端口
new MultiChatServer(port).run(); // 创建服务器实例并启动
}
}
原文地址: https://www.cveoy.top/t/topic/f3Bg 著作权归作者所有。请勿转载和采集!