客户端Bootstrap类的重载connect方法最终是调用doconnect方法
1.1、首先调用initAndRegister方法,这个方式是它父类AbstractBootstrap声明的方法,方法如下:
注意这个方法在ServerBootStrap在bind和Bootstrapconnect时都会调用
createChannel是在Bootstrap.channel指定了NioSocketChannel参数
然后createChannel是由指定了class的工厂类创建出来。
1.1.1、init方法就是将一些attr和option赋给NioSocketChannel,主要是channel.unsafe.register方法,这个方法,是NioSocketChannel的父类的嵌套类AbstractNioUnsafe的父类中的方法
最后调用register0方法,该方法调用doRegister方法,当注册成功时,调用pipeLine中的fileChannelRegistered方法,和当链路active时,调用pipeline中的fileChannelActive方法。
这个pipeline是DefaultChannelPipeline的实例,这个pipeline在初始化时便会将HeadHandler和TailHandler加入pipeline中,TailHandler不对任何事件处理,只为了释放BtyeBuf。HeadHandler就是调用这个pipeline绑定的Channel中的unsafe类的各种方法。
1.1.1.1、下面继续看doRegister方法,这个方法在AbstractNioUnsafe中实现
就是在多路复用选择器上注册 0 (注册)对应事件,在注册成功后,pipeline,fireChannelActive事件会修改多路选择复用器感兴趣的事件。所以现在看一下register0()中调用fireChannelActive事件。这个方法最后就会调用到TailHandler的ChannelActive方法,这个方法是空实现,说明Bootstrap对于注册成功无所谓。下面就要说到Bootstrap的connect中最主要的部分——connect到服务端。
上面这些执行完了,就可以出栈返回到1中doconnect方法继续往下走。
1.2、可以看到当注册成功后就会调用doconnect0方法
主要是调用NioSocketChannel的connect方法
1.2.1.1 pipeline是DefaultChannelPipeline的实例,最后会调用到该类的这个connect方法并在pipeline中传递调用connect方法,最后就调用到了HeadHandler的connect方法
1.2.1.1.1 HeadHandler的connect方法主要是调用Channel嵌套类Unsafe的connect方法
调用到AbstractNioUnsafe的connect方法,代码如下:
首先调用doConnect连接服务端,连接成功了就调用fulfillConnectPromise方法,否则就启动一个定时任务去连接,当超过超时时间就抛错。
1.2.1.1.1.1 doConnect是AbstractNioChannel的抽象方法在其子类NioSocketChannel中实现,代码如下:
这里的localAddress是指本机起的服务端吗?假设走的是remoteAddress。
那么调用jdk提供的java.nio.channels.SocketChannel类提供的connect方法。连接失败就在
到这里Bootstrap类中doconnect方法就执行完毕了。
下面最后说当1.2.1.1.1.1 连接失败后,在1.2.1.1.1 中启动的定时任务也只是判断连接的结果是否已成功,但是连接的事件触发是在NioEventLoop中触发并执行相应代码。