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