Netty源码-08-ChannelInitializer
一 回顾几个时机点
- pipeline的初始化
- 用户向pipeline添加ChannelInitializer辅助实例
- Channel注册到复用器之后回调
1 pipeline的初始化
初始化Channel的时候触发了pipeline的初始化
java
1 |
|
java
1 |
|
java
1 |
|
此时pipeline中只有两个处理器:
- head
- tail
2 向pipeline中添加ChannelInitializer实例
java
1 |
|
java
1 |
|
在Channel创建好了对其进行初始化,以NioServerSocketChannel为例,Netty向pipline中添加了一个handler,就是ChannelInitializer实例。
- pipeline中添加handler就是双链表的insert操作
- 添加到双链表
- 此刻Channel还在初始化环节 Channel还没注册到复用器上
- ChannelInitializer的方法等待时机被回调
3 Channel注册之后发布事件触发ChannelInitializer方法回调
java
1 |
|
java
1 |
|
java
1 |
|
java
1 |
|
java
1 |
|
java
1 |
|
java
1 |
|
java
1 |
|
调用链终于走到了ChannelInitializer中了。
二 ChannelInitializer源码
1 handlerAdded
java
1 |
|
java
1 |
|
2 initChannel
这个方法是ChannelInitializer提供的抽象方法,供用户自定具体实现。
列举几个例子:
2.1 SerberBootstrap的init方法
java
1 |
|
假设bossHandler没有传,那么此时pipeline中有3个handler:
- head
- ServerBootstrapAcceptor
- tail
2.2 EchoServer的ServerBootstrap初始化
java
1 |
|
2.3 EchoClient的Bootstrap初始化
java
1 |
|
Netty源码-08-ChannelInitializer
https://bannirui.github.io/2023/03/06/Netty源码-08-ChannelInitializer/