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 许可协议。转载请注明出处!