龙岗住房建设局网站,wordpress调用面包屑,网站建设要用H5的缺点,icp备案证书号查询优质博文#xff1a;IT-BLOG-CN 一、Netty 服务端启动过程
【1】创建服务端Channel#xff1b; 【2】初始化服务端Channel#xff1b; 【3】注册Selector#xff1b; 【4】端口绑定#xff1a;我们分析源码的入口从端口绑定开始#xff0c;ServerBootstrap的bind(int in… 优质博文IT-BLOG-CN 一、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);// 实际绑定
}【2】在doBind()方法中调用initAndRegister来处理初始化和注册
private ChannelFuture doBind(final SocketAddress localAddress) {final ChannelFuture regFuture initAndRegister();// 初始化与注册// ...
}【3】initAndRegister()【初始化并注册】进入initAndRegister()方法里面发现是调用了channelFactory(Channel工厂) 的newChannel()来创建channel
final ChannelFuture initAndRegister() {Channel channel null;try {channel channelFactory.newChannel();// channelFactory创建Channelinit(channel);}//...
}【4】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到底是啥呢什么时候传递进来的 【5】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 ReflectiveChannelFactoryC(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对象。