外部接口
Channel,EventLoop,ChannelFuture
Channel接口
封装Socket
类,预定义的实现类包括:
1 | EmbeddedChannel |
EventLoop
EventLoop
: 只绑定一个专有线程。Channel
: 只注册于一个EventLoop
;
EventLoop
与线程: 1对1;EventLoop
与Channel
: 1对多;
因此:线程与Channel
:1对多。同一个Channel
的IO操作一定由同一个线程完成。
ChannelFuture接口
用于查询Channel
的操作结果。
ChannelHandler和ChannelPipeline
ChannelHandler接口
用来处理事件的方法。
子接口:ChannelInboundHandler
:入站事件接口ChannelOutboundHandler
:出站事件接口
ChannelPipeline接口
ChannelHandler
接口的容器,就像一个List<ChannelHandler>
。
是一个处理链。
在链上定义了入站和出站事件流。
ChannelHandler
安装过程:
1 | 1. 一个ChannelInitializer的实现注册到Bootstrap; |
ChannelHandlerContext
可以用于获取底层的Channel
。
两种写消息方式:
- 写到
ChannelHandlerContext
中: 传递给pipeline
中下一个handler
; - 直接写
channel
:跳过后续的handler
,直接到达尾端。
适配器
实际编写ChannelHandler
的时候,一般不会直接用ChannelInboundHandler
或者ChannelOutboundHandler
接口,而会直接用预定义的实现类,然后进行扩展,也就是直接继承extends
下列适配器类:
1 | ChannelHandlerAdapter |
好处是可以只重写自己关心的事件处理,其他的用默认的。
ChannelHandler的子类型: 编码器/解码器
编码解码: 入站出站时候字节和对象的数据转换。
抽象类SimpleChannelInboundHandler
1 | SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter |
要注意处理的数据类型。
由于上游可能有其他解码器,导致数据类型发生改变。