netty 服务端启动流程源码详解( 四 )

创建 channel 并注册initAndRegister() 完整实现如下:
final ChannelFuture initAndRegister() {    Channel channel = null;    try {        //1. 通过 channelFactory 创建新的 channel        channel = channelFactory.newChannel();        //2. 初始化相关属性        init(channel);    } catch (Throwable t) {        // 省略    }    // 省略    return regFuture;}init 是一个抽象方法,服务端实现如下:
@Overridevoid init(Channel channel) throws Exception {    final Map<ChannelOption<?>, Object> options = options0();    //1. 设置 Socket 参数和 NioserverSocketChannel 的 附加属性    synchronized (options) {        setChannelOptions(channel, options, logger);    }    final Map<AttributeKey<?>, Object> attrs = attrs0();    synchronized (attrs) {        for (Entry<AttributeKey<?>, Object> e: attrs.entrySet()) {            @SuppressWarnings("unchecked")            AttributeKey<Object> key = (AttributeKey<Object>) e.getKey();            channel.attr(key).set(e.getValue());        }    }    // 属性省略    p.addLast(new ChannelInitializer<Channel>() {        @Override        public void initChannel(final Channel ch) throws Exception {            final ChannelPipeline pipeline = ch.pipeline();            //2. 将 AbstractBoostrap 的 Handler 添加到 NioserverSocketChannel 的 pipeline 中            ChannelHandler handler = config.handler();            if (handler != null) {                pipeline.addLast(handler);            }            //3. 将用于服务端注册的 ServerBootstrapAcceptor 添加到 pipeline 中            ch.eventLoop().execute(new Runnable() {                @Override                public void run() {                    pipeline.addLast(new ServerBootstrapAcceptor(                            ch, currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs));                }            });        }    });}到这里,服务端的监听相关资源已经初始化完毕 。
接下来,需要把 NioserverSocketChannel 注册到 Reactor 线程的多路复用选择器上,然后轮训客户端事件 。
NioserverSocketChannel 简介构造器如下:
public NioServerSocketChannel() {    this(newSocket(DEFAULT_SELECTOR_PROVIDER));}这个就是默认 channel 初始化的构造器,实际调用的是:
private static final SelectorProvider DEFAULT_SELECTOR_PROVIDER = SelectorProvider.provider();private static ServerSocketChannel newSocket(SelectorProvider provider) {    return provider.openServerSocketChannel();}


推荐阅读