在上一篇文章中,讨论了netty服务端启动的大概流程,这篇文章将会继续看下客户端启动流程。
总览
一般的客户端长这样,真正的入口要从bootstrap.connect看起。
分析
进入connect方法的最终调用在这里:
如果已经看过服务端启动流程,会发现这里和服务端的代码神似,都是先initAndRegister,如果注册成功,则直接执行doResolveAndConnect0,否则就添加一个监听器,当监听器触发的时候执行doResolveAndConnect0. 事实上initAndRegister的逻辑都是一样的,因为都是走的都是Bootstrap.initAndRegister(). 我们只需要关注doResolveAndConnect0做了什么即可。
doResolveAndConnect0
这里熟悉的异步操作又又又又来了:首先异步执行resolver.resovle(),并返回一个future,后续会根据future来判断resolve动作是否完成。如果它完成了,则执行doConnect,否则给future注册一个listener,等到resovle完成的时候会触发这个listener,进而执行doConnect.
最终的connect走的是pipeline的connect方法
继续,
这个tail是个ChannelHandlerContext,也就是pipeline的主要内容,