Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析

在netty启动前,serverBootstrap基本上都要调用channel方法:

题外话:class文件是反射的起源,反射必定是通过class对象来实现的。

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第1张图片

 进入channel方法:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第2张图片

无参构造:通过该方法传入的class对象,创建一个channel实例

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第3张图片

 有参构造的话使用channelFactory:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第4张图片

 class对象传入到类ReflectiveChannelFactory中

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第5张图片

通过调用默认的反射构造方法来创建channel对象

查看方法:只是将传进来的class对象赋值给了ReflectiveChannelFactory中的clazz变量

instantiate:实例化(动词)

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第6张图片

 整体来说就是将ReflectiveChannelFactory(只是对class对象赋值给内部的clazz变量)这个对象传入到channelFactory方法中:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第7张图片

进入到channelFactory方法发现,它又调用了channelFactory方法 :

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第8张图片

简单描述:问调用bind()的时候ChannelFactory工厂将会创建channel实例的

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第9张图片

进一步跟进channelFactory这个方法中:

描述:不建议使用该方法,但是我们已经进入到这里了,那就分析它吧

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第10张图片

 仔细一看发现还是在赋值:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第11张图片

现在我们简单来看一下传进来的这个NioServerSocketChannel方法

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第12张图片

它跟nio中selectionChannel是一样,不断的等待连接 :

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第13张图片

接下来就是我们自己定义 的子处理器:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第14张图片

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第15张图片

我们看一下childHandler的源码:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第16张图片

设置channelHandler用于服务于channel的请求

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第17张图片

到现在我们服务器的准备工作都完毕了

通过serverBootstrap的bind()方法来启动服务器:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第18张图片

创建一个新的channel以及通过端口号绑定它

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第19张图片

进入跟进查看bind()方法:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第20张图片

validate():验证参数是否被设置好了

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第21张图片

查看doBind()方法:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第22张图片

查看源码

题外话:一般以do开头命名的方法都是私有方法

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第23张图片

我们先了解一下ChannelFuture:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第24张图片

它是一个接口,继承了FutureNetty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第25张图片

 而它又继承于并发包下的Future

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第26张图片

对于这个Future 将会在后面用一个大章节进行详细说明:

对于channelFuture在下一章和Future一起 进行详细说明,我们回到之前:

分析initAndRegister

进入到initAndRegister中

这里channelFactory就是之前的传入class对象那个

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第27张图片

 查看newChannel,发现跳转到一个接口上面:

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第28张图片

很显然我们要找到真正的实现类

Netty的深入浅出--40.serverBootstrap中channel方法和childHandler方法以及bind方法分析_第29张图片

 

你可能感兴趣的:(Netty网络编程)