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

相關文章
相關標籤/搜索