Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

在上一篇文章中,讨论了netty服务端启动的大概流程,这篇文章将会继续看下客户端启动流程。

总览

一般的客户端长这样,真正的入口要从bootstrap.connect看起。

image

分析

进入connect方法的最终调用在这里:

image-20220404105736798

如果已经看过服务端启动流程,会发现这里和服务端的代码神似,都是先initAndRegister,如果注册成功,则直接执行doResolveAndConnect0,否则就添加一个监听器,当监听器触发的时候执行doResolveAndConnect0. 事实上initAndRegister的逻辑都是一样的,因为都是走的都是Bootstrap.initAndRegister(). 我们只需要关注doResolveAndConnect0做了什么即可。

doResolveAndConnect0

image-20220404111042034

这里熟悉的异步操作又又又又来了:首先异步执行resolver.resovle(),并返回一个future,后续会根据future来判断resolve动作是否完成。如果它完成了,则执行doConnect,否则给future注册一个listener,等到resovle完成的时候会触发这个listener,进而执行doConnect.

image

最终的connect走的是pipelineconnect方法

image

继续,

image

这个tail是个ChannelHandlerContext,也就是pipeline的主要内容,

image

评论