Netty源码:服务端Channel的建立

一.Netty服务端启动过程

    1.建立服务端Channeljava

    2.初始化服务端Channelide

    3.注册Selectorthis

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

 

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

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

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

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

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

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:it

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对象。

相关文章
相关标签/搜索