netty客户端连接服务端源代码流程分析

本文详细分析了Netty客户端Bootstrap的connect方法,从doconnect开始,包括initAndRegister方法中对NioSocketChannel的初始化和注册,再到doconnect0方法中的connect操作,涉及通道连接、事件注册和管道处理。讲解了从启动连接到实际调用AbstractNioUnsafe的connect方法,以及最终在NioSocketChannel中实现的doConnect方法,连接失败时如何处理的整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

客户端Bootstrap类的重载connect方法最终是调用doconnect方法

1、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、channel.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方法,否则就启动一个定时任务去连接,当超过超时时间就抛错。

下面继续doConnect方法

1.2.1.1.1.1  doConnect是AbstractNioChannel的抽象方法在其子类NioSocketChannel中实现,代码如下:

这里的localAddress是指本机起的服务端吗?假设走的是remoteAddress。

那么调用jdk提供的java.nio.channels.SocketChannel类提供的connect方法。连接失败就在

多路选择复用器上注册connect事件

到这里Bootstrap类中doconnect方法就执行完毕了。

下面最后说当1.2.1.1.1.1 连接失败后,在1.2.1.1.1 中启动的定时任务也只是判断连接的结果是否已成功,但是连接的事件触发是在NioEventLoop中触发并执行相应代码。

最后监听到connect事件后,调用finishConnect方法。这下面就先不看了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值