本文基于Netty 4.1.49源码分析ServerBootstrap绑定端口的流程,本文只是自己整理的流水式的流程,不适合学习之用。
使用例子
先用官方的DiscardServer作为例子,部分源码截图如下:
红框bind方法就是我们要分析的内容
步骤一 创建NioServerSocketChannel实例
- 创建ServerSocketChannel实例
- 保存感兴趣的Select事件: SelectionKey.OP_ACCEPT(只是保存还没注册Select)
- 设置ServerSocketChannel非阻塞模式
- 创建一个唯一的channel ID
- 创建一个Unsafe实例
- 创建一个ChannelPipeline
步骤二 配置NioServerSocketChannel实例
- 增加一个 ServerBootstrapAcceptor (ChannelHandler)
步骤三 绑定一个NioEventLoop实例
- 从NioEventGroup选择一个 NioEventLoop 绑定到channel中
步骤四 注册Select
- 把ServerSocketChannel实例注册到NioEventLoop的Select实例中,不注册任何事件。
步骤五 绑定端口
- 委托给channel.bind方法
- 委托给channel的pipeline.bind方法
- 委托给pipeline的tail.bind方法(TailContext)
- 委托给pipeline的head.bind方法(HeadContext)
- 委托给channel的unsafe.bind方法
- 委托给channel的doBind方法,此处才调用ServerSocketChannel实例绑定端口。
步骤六 向Select注册 OP_ACCEPT事件
- 绑定端口后,传播channelActive 事件: pipeline.fireChannelActive()
- pipeline的head节点被触发channelActive方法
- 调用readIfIsAutoRead方法
- 委托给 channel.read方法
- 委托给 pipeline.read(); 传播read事件
- cong tail.read();传播read事件
- head.read 处理read事件(HeadContext节点)
- 委托给unsafe.beginRead();
- 委托给channel.doBeginRead(); 此次才把SelectionKey.OP_ACCEPT注册到Select中
总结
整个流程比较绕。不过主要关注几点即可。
- 绑定eventLoop
- 注册select
- 绑定端口
- 注册OP_ACCEPT事件
本文系本站编辑转载,文章版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请与本站联系,本站将在第一时间删除内容!