netty-NioServerSocketChannel和boss NioEventLoopGroup 如何建立关系的

netty-NioServerSocketChannel和boss NioEventLoopGroup 如何建立关系的
一、
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
1、boss 或者 worker
NioEventLoopGroup 初始化完成了一个NioEventLoop 数组 (默认机器核数的2倍)所有NioEventLoop 持有了同一个Executor 调用execute时立即生成一个新线程并且执行Runable
二、
ServerBootstrap b = new ServerBootstrap(); // (2)
继承AbstractBootstrap
1、就是初始化了boss 和work 将用到的option 和attr的容器
2、还有个ServerBootstrapConfig 这个就是通过config 来获取bootstrap的属性
三、 b.group(bossGroup, workerGroup)
分别将bossGroup,workerGroup设置给AbstractBootstrap和ServerBootstrap的对应属性
四、 .channel(NioServerSocketChannel.class)
封装一个java.nio 的获取ServerSocketChannel 的工厂类持有ServerSocketChannel的构造器
五、 .childHandler(new ChannelInitializer() { // (4)
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new DiscardServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128) // (5)
.childOption(ChannelOption.SO_KEEPALIVE, true); // (6)
分别设置到ServerBootstrap和AbstractBootstrap 对应属性
六、
1、bind 方法
init初始化了一个NioServerSocketChannel 也就是
ServerSocketChannel 并且配置非阻塞

2、然后调用ChannelFuture regFuture = config().group().register(channel);

上面语句就是boss这个group 根据轮训策略chooser 数组里一个NioEventLoop .register serverSocketchannel 在NioEventLoop 封装了一个DefaultChannelPromis 然后传递NioEventLoop 和 DefaultChannelPromis 调用NioServerSocketChannel这个 channel 的 unsafe.register
整个流程就是 bossGroup 调用了 nioserverchannel register 然后开始
eventLoop.execute( Runnable)