Netty实战第三章-外部接口笔记

外部接口

Channel,EventLoop,ChannelFuture

Channel接口

封装Socket类,预定义的实现类包括:

1
2
3
4
5
6
EmbeddedChannel
LocalServerChannel
NioDatagramChannel
NioSctpChannel
NioSocketChannel
...

EventLoop

EventLoop: 只绑定一个专有线程。
Channel: 只注册于一个EventLoop

EventLoop与线程: 1对1;
EventLoopChannel: 1对多;
因此:线程与Channel:1对多。同一个Channel的IO操作一定由同一个线程完成。

ChannelFuture接口

用于查询Channel的操作结果。

ChannelHandler和ChannelPipeline

ChannelHandler接口

用来处理事件的方法。
子接口:
ChannelInboundHandler:入站事件接口
ChannelOutboundHandler:出站事件接口

ChannelPipeline接口

ChannelHandler接口的容器,就像一个List<ChannelHandler>
是一个处理链。
在链上定义了入站和出站事件流。

ChannelHandler安装过程:

1
2
3
4
1. 一个ChannelInitializer的实现注册到Bootstrap;
2. 调用initChannel,在pipeline中安装一组自定义的ChannelHandler;
(2.1)ChannelHandler被安装时,分配一个ChannelHandlerContext给它,保存它与pipeline之间的绑定。
3. ChannelInitializer将自己从pipeline中移除。

ChannelHandlerContext

可以用于获取底层的Channel
两种写消息方式:

  1. 写到ChannelHandlerContext中: 传递给pipeline中下一个handler;
  2. 直接写channel:跳过后续的handler,直接到达尾端。

适配器

实际编写ChannelHandler的时候,一般不会直接用ChannelInboundHandler或者ChannelOutboundHandler接口,而会直接用预定义的实现类,然后进行扩展,也就是直接继承extends下列适配器类:

1
2
3
4
ChannelHandlerAdapter
ChannelInboundHandlerAdapter
ChannelOutboundHandlerAdapter
ChannelDuplexHandler

好处是可以只重写自己关心的事件处理,其他的用默认的。

ChannelHandler的子类型: 编码器/解码器

编码解码: 入站出站时候字节和对象的数据转换。

抽象类SimpleChannelInboundHandler

1
SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter

要注意处理的数据类型。
由于上游可能有其他解码器,导致数据类型发生改变。

推荐文章