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

public B channel(Class<? extends C> channelClass) {    if (channelClass == null) {        throw new NullPointerException("channelClass");    }    return channelFactory(new ReflectiveChannelFactory<C>(channelClass));}ReflectiveChannelFactory 反射的核心实现如下:
public ReflectiveChannelFactory(Class<? extends T> clazz) {    if (clazz == null) {        throw new NullPointerException("clazz");    }    this.clazz = clazz;}@Overridepublic T newChannel() {    try {        return clazz.getConstructor().newInstance();    } catch (Throwable t) {        throw new ChannelException("Unable to create Channel from class " + clazz, t);    }}实际上就是通过 NioServerSocketChannel 创建了 Channel 对象 。
启动类设置 Handler启动类可以为启动服务类和父类,分别设置 Handler 。
这个也是一开始老马学习 netty 比较迷惑的地方,这两个有啥区别呢?

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

文章插图
 
输入图片说明
本质区别:
(1)ServerBoostrap 中的 Handler 是 NioServerSocketChannel 使用的,所有连接这个监听端口的客户端都会执行 。
(2)父类 AbstractServerBoostrap 中的 Handler 是一个工厂类,会为每一个接入的客户端都创建一个新的 Handler 。
端口绑定最后,还有服务端的端口绑定 。我们上面只是简单的过了一下,这里做一下展开:
private ChannelFuture doBind(final SocketAddress localAddress) {    //1. 创建 channel 并注册    final ChannelFuture regFuture = initAndRegister();    final Channel channel = regFuture.channel();    if (regFuture.cause() != null) {        return regFuture;    }    //2. 创建完成后,设置对应的附加属性    if (regFuture.isDone()) {        // At this point we know that the registration was complete and successful.        ChannelPromise promise = channel.newPromise();        doBind0(regFuture, channel, localAddress, promise);        return promise;    } else {        // Registration future is almost always fulfilled already, but just in case it's not.        final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel);        regFuture.addListener(new ChannelFutureListener() {            //3. 添加监听器            @Override            public void operationComplete(ChannelFuture future) throws Exception {                Throwable cause = future.cause();                if (cause != null) {                    // Registration on the EventLoop failed so fail the ChannelPromise directly to not cause an                    // IllegalStateException once we try to access the EventLoop of the Channel.                    promise.setFailure(cause);                } else {                    // Registration was successful, so set the correct executor to use.                    // See https://github.com/netty/netty/issues/2586                    promise.registered();                    doBind0(regFuture, channel, localAddress, promise);                }            }        });        return promise;    }}


推荐阅读