1.建立服務端Channeljava
2.初始化服務端Channelide
3.註冊Selectorthis
4.端口綁定:咱們分析源碼的入口從端口綁定開始, ServerBootstrap 的 bind(int inetPort) 方法,其實是 AbstractBootstrap 的 bind(int inetPort) 方法 --- ServerBootstrap繼承了AbstractBootstrap。spa
在 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();// 初始化與註冊 // ... }
進去 initAndRegister() 方法裏面,發現是調用了 channelFactory(Channel工廠) 的 newChannel() 來建立 channel:對象
final ChannelFuture initAndRegister() { Channel channel = null; try { channel = channelFactory.newChannel();// channelFactory建立Channel init(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究竟是啥呢,何時傳遞進來的?源碼
還記得以前咱們的第一個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對象。