Netty服务端启动流程
NIO是一个IO多路复用的一个概念,我们看到的epoll,kqueue是不同操作系统对nio不同的实现
EventLoop :事件循环,简单来说就是 某个地方产生事件(也可以是eventLoop自己),然后他自己又去消费事件,造成了一个事件循环,简单实现就是 产生的事件放入一个队列,然后一个线程不断的从队列里面去事件执行(这也就是为什么所有操作都异步,因为每个操作都可以变成一个可执行事件放入事件队列,扔进去一个ChannelFuture进行回调获取执行结果)
NioEventLoopGroup 这个东西是用来选择一个EventLoop的用于channel注册的
1  | 
  | 
NioServerSocketChannel初始化
1  | private static final SelectorProvider DEFAULT_SELECTOR_PROVIDER = SelectorProvider.provider();  | 
UnSafe
1  | 
  | 
Pipeline
1  | 
  | 
pipeline的添加handler
1  | 
  | 
EventLoopGroup的初始化
1  | NioEventLoopGroup(1)  | 
EventLoopGroup注册
1  | MultithreadEventLoopGroup  | 
NioEventLoop初始化
1  | 
  | 
ServerBootstrap
1  | 
  | 
init()
这个方法主要是对Channel的初始化
1  | 
  | 
initAndRegister()
1  | 
  | 
bind(8080)
1  | 
  | 
doBind0
1  | 
  | 
Netty服务端接待流程
NioEventLoop的run
1  | 
  | 
processSelectedKeys();
1  | 
  | 
processSelectedKey
1  | 
  | 
服务端接待客户端
1  | 
  | 
ServerBootstrapAcceptor
这是一个服务端的Hanlder
初始化
1  | 
  | 
执行服务端接待事件
1  | 
  | 
客户端流程
启动就是注册事件循环组,然后connect到指定服务器
客户端读取
1  | 
  | 
写消息
1  | 
  | 
客户端连接操作
1  | if ((readyOps & SelectionKey.OP_CONNECT) != 0) {  | 
pipeline和ChannelHandlerContext的事件传播
1  | 
  | 
入站事件
从pipeline的head开始,直到tail,注意入站事件 netty默认处理器不处理
注册事件传播
1  | 
  | 
Channel活跃状态事件传播
就是可以与客户端或者服务端进行连接了
1  | 
  | 
Channel可读事件传播
1  | DefaultChannelPipeline  | 
读取完成事件传播
1  | ChannelPipeline  | 
出站事件
从pipeline的tail开始,直到head,出站处理器一定要记得发射对应事件,除非已经处理过了,netty默认会处理
绑定事件传播
1  | AbstractChannel  | 
对读取感兴趣事件传播
1  | AbstractChannel  | 
- 本文作者: 忘忧症
 - 本文链接: https://NepenthesZGW.github.io/2020/06/20/framework/Netty/Netty源码流程/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
 
		