赣州新闻网

首页 / 科技

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

2020-03-23 · 赣州新闻网 · 科技

本文基于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事件

设置内容安远模式增加ACT经济流量互联网