Netty源码:服务端Channel的创建

这一生的挚爱 提交于 2021-01-25 03:51:10

一.Netty服务端启动过程

    1.创建服务端Channel

    2.初始化服务端Channel

    3.注册Selector

    4.端口绑定:我们分析源码的入口从端口绑定开始, ServerBootstrap 的 bind(int inetPort) 方法,实际上是 AbstractBootstrap 的 bind(int inetPort) 方法 --- ServerBootstrap继承了AbstractBootstrap。

 

二.分析服务端创建Channel的过程

(1)bind()    【分析入口,端口绑定】

    在 bind() 方法中,有一个 doBind() 方法,处理端口绑定:

    public ChannelFuture bind(SocketAddress localAddress) {
        validate();
        if (localAddress == null) {
            throw new NullPointerException("localAddress");
        }
        return doBind(localAddress);// 实际绑定
    }

    在 doBind() 方法中,调用initAndRegister来处理初始化和注册:

    private ChannelFuture doBind(final SocketAddress localAddress) {
        final ChannelFuture regFuture = initAndRegister();// 初始化与注册
        // ...
    }

 

(2)initAndRegister()    【初始化并注册】

    进去 initAndRegister() 方法里面,发现是调用了 channelFactory(Channel工厂) 的 newChannel() 来创建 channel:

    final ChannelFuture initAndRegister() {
        Channel channel = null;
        try {
            channel = channelFactory.newChannel();// channelFactory创建Channel
            init(channel);
        }
        //...
   }

 

(3)newChannel()    【创建服务端channel】

    进去 newChannel() 方法,就能看到,实际上是通过反射 Class.newInstance() 来创建 Channel 对象的:

    public T newChannel() {
        try {
            return clazz.newInstance();// Channel工厂通过反射,来创建Channel
        } catch (Throwable t) {
            throw new ChannelException("Unable to create Channel from class " + clazz, t);
        }
    }

    那么,这个class到底是啥呢,什么时候传递进来的?

 

(4)ChannelFactory的初始化    【接收服务端Channel的Class,通过反射生成Channel】

    还记得之前我们的第一个Demo里面有一个 channel() 方法,我们传递了一个参数 - NioServerSocketChannel.class:

            ServerBootstrap serverBoot = new ServerBootstrap();
            serverBoot.group(bossGroup,workGroup)
                    .channel(NioServerSocketChannel.class)// 设置服务端Channel
                    //...
            );

    进去 channel() 方法中:

    public B channel(Class<? extends C> channelClass) {
        if (channelClass == null) {
            throw new NullPointerException("channelClass");
        }
        return channelFactory(new ReflectiveChannelFactory<C>
            (channelClass));// 传递class给ChannelFactory的构造方法
    }

    然后,我们进去 ChannelFactory 的构造方法里面:

   public ReflectiveChannelFactory(Class<? extends T> clazz) {
        if (clazz == null) {
            throw new NullPointerException("clazz");
        }
        this.clazz = clazz;// 接收传递进来的Channel的Class
    }
    @Override
    public T newChannel() {
        try {
            return clazz.newInstance();// 通过Channel的Class反射生成Channel对象
        } catch (Throwable t) {
            throw new ChannelException("Unable to create Channel from class " + clazz, t);
        }
    }

   

    到此,Channel的创建过程就出来了,一句话总结就是:通过我们在ServerBootstrap的 channel(clazz) 方法里面设置的Class,通过Java反射,Class.newInstance来生成最终的Channel对象。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!