互联网从“流量经济”到“注意力经济”

本文基于Netty 4.1.49源码分析ServerBootstrap绑定端口的流程,本文只是自己整理的流水式的流程,不适合学习之用。

使用例子

先用官方的DiscardServer作为例子,部分源码截图如下:

Netty ServerBootstrap 绑定端口流程分析

红框bind方法就是我们要分析的内容

步骤一 创建NioServerSocketChannel实例

  1. 创建ServerSocketChannel实例
  2. 保存感兴趣的Select事件: SelectionKey.OP_ACCEPT(只是保存还没注册Select)
  3. 设置ServerSocketChannel非阻塞模式
  4. 创建一个唯一的channel ID
  5. 创建一个Unsafe实例
  6. 创建一个ChannelPipeline

步骤二 配置NioServerSocketChannel实例

  1. 增加一个 ServerBootstrapAcceptor (ChannelHandler)

步骤三 绑定一个NioEventLoop实例

  1. 从NioEventGroup选择一个 NioEventLoop 绑定到channel中

步骤四 注册Select

  1. 把ServerSocketChannel实例注册到NioEventLoop的Select实例中,不注册任何事件。

步骤五 绑定端口

  1. 委托给channel.bind方法
  2. 委托给channel的pipeline.bind方法
  3. 委托给pipeline的tail.bind方法(TailContext)
  4. 委托给pipeline的head.bind方法(HeadContext)
  5. 委托给channel的unsafe.bind方法
  6. 委托给channel的doBind方法,此处才调用ServerSocketChannel实例绑定端口。

步骤六 向Select注册 OP_ACCEPT事件

  1. 绑定端口后,传播channelActive 事件: pipeline.fireChannelActive()
  2. pipeline的head节点被触发channelActive方法
  3. 调用readIfIsAutoRead方法
  4. 委托给 channel.read方法
  5. 委托给 pipeline.read(); 传播read事件
  6. cong tail.read();传播read事件
  7. head.read 处理read事件(HeadContext节点)
  8. 委托给unsafe.beginRead();
  9. 委托给channel.doBeginRead(); 此次才把SelectionKey.OP_ACCEPT注册到Select中

总结

整个流程比较绕。不过主要关注几点即可。

  1. 绑定eventLoop
  2. 注册select
  3. 绑定端口
  4. 注册OP_ACCEPT事件
上一篇

宋祖儿挑战在卧蚕上点痣,本以为会丑,成品造型意外让人心动!

下一篇

范冰冰和霍思燕同穿粉色大衣,网友:贵妇和村妇的差距一目了然!

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部