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(); // 创建服务器实例并启动
    }
}
基于Netty的多人聊天室服务端实现

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

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