Netty服务端Demo
一个简单的Netty服务端Demo如下:
EventLoopGroup bossGroup = new NioEventLoopGroup(ioThreads);
// workerGroup, 用于处理与各个客户端连接的 IO 操作
EventLoopGroup workerGroup = new NioEventLoopGroup(workerThreads);
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.localAddress(new InetSocketAddress(port))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new StringEncoder());
ch.pipeline().addLast(new PRCServerHandler());
}
});
bootstrap.option(ChannelOption.SO_BACKLOG, 100) // 客户端套件字接受队列大小
.option(ChannelOption.SO_REUSEADDR, true) // reuse addr,避免端口冲突
.option(ChannelOption.TCP_NODELAY, true) // 关闭小流合并,保证消息的及时性
.childOption(ChannelOption.SO_KEEPALIVE, true); // 长时间没动静的链接自动关闭
ChannelFuture future = bootstrap.bind(port).sync();
log.info("Server start listen at " + port);
future.channel().closeFuture().sync();
服务端Channel的创建
在ServerBootstrap通过group把boosGroup和workGroup关联起来,通过channel方法绑定服务端Channel,通过childHandler添加pipeline,在bind方法中进行Channel的创建
通过channelFactory创建我们的channel,也就是我们传进来的NioServerSocketChannel。通过反射直接创建。
服务端Channel的初始化
设置Options
通过设置传入的options参数,可以配置Channel的tcp属性等配置项
添加handler和连接器
注册Selector
最终会通过jdk注册一个channel
调用ChannelAdd事件和ChannelRegistered事件
开始读
设置当前状态为可读