安卓开发从源码看后端技术——ServerBootstrap

2,681 阅读2分钟

「我正在参与掘金会员专属活动-源码共读第一期,点击参与

前言

上一篇(安卓开发从源码看后端技术——搭建环境与断点调试 - 掘金 (juejin.cn))我们看了搭建环境以及Netty中ServerSocketChannelImpl的bind方法,使用了断点调试看调用堆栈的方法。今天就来完成源码共读的第二个任务(源码共读第一期|掘金会员专属活动 - 赵小饼 - 掘金课程 (juejin.cn)),就是:

image.png

接下来我们来看源码分析过程。

正篇

首先我们在我们的项目主文件MyServer中找到ServerBootstrap对象:

image.png 我们点进去看看源代码:

image.png 结合注释和继承关系,我们得知了ServerBootstrap是Bootstrap的子类,它可以方便的引导 ServerChannel即服务端Channel,我们可以简单的理解:Bootstrap意思是引导,而一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Bootstrap类就是Netty客户端程序的启动引导类,那么自然而然的,ServerBootstrap 就是服务端启动引导类(该解释来自博客服务端 ServerBootstrap_芒骁的博客-CSDN博客_serverbootstrap) 结构上我们可以看到ServerBootstrap继承了AbstractBootstrap<ServerBootstrap, ServerChannel>

image.png

image.png

image.png 而AbstractBootstrap<B, C>则实现了一个可克隆接口(Cloneable)对应的B则是继承自己的对象,C则是继承自Channel接口 ,所以继承关系可以归结如下:

image.png 任务中给的图其实打断点可以最终回溯到我们MyServer文件的ServerBootstrap的bind方法用于绑定接口

image.png

image.png 而我们往下跳的时候可以看到好几次异步堆栈,从注册到绑定:

image.png

image.png

image.png initAndRegister方法: 根据之前准备的组件ReflectiveChannelFactory创建Channel,初始化: image.png 该方法再向Selector注册Channel:

image.png 这一块的注释也说明了流程:

image.png 大意为:
如果我们运行到这里,承诺没有失败,则是出现了以下情况之一:
1)如果我们尝试从事件循环注册,则此时注册已完成。
i.e. 现在尝试bind()或connect()是安全的,因为通道已经注册。
2) 如果我们尝试从另一个线程注册,则注册请求已成功添加到事件循环的任务队列中,以便稍后执行。
i.e. 现在尝试bind()或connect()是安全的:
因为在执行计划的注册任务之后,bind(()或connect()将被执行,
因为register()、bind(和connect)都绑定到同一个线程

总结

以上就是本篇分析的过程,还是通过断点查看该方法的调试堆栈,回溯到源头,但本人这方面基础知识较薄弱,所以很多具体细节无法解释分析,在以后如果有机会了解这方面知识,会更新这块的具体行为描述,如有错误,欢迎指正!