引:上一篇博文讲了解码器对应了读事件,这次就讲一下编码器,对应了写事件。
编码器基类
在Netty中解码器的基类是MessageToByteEncoder ,然后我们要明白的是MessageToByteEncoder其实是一个ChannelOutboundHandlerAdapter。
我们在使用的过程中主要就是覆写它的encode方法:
1 | protected abstract void encode(ChannelHandlerContext ctx, I msg, ByteBuf out) throws Exception; |
一个编码器编码的过程主要有如下6个步骤:
- 匹配对象
- 分配内存
- 编码实现
- 释放对象
- 传播数据
- 释放内存
当我们知道MessageToByteEncoder是一个Handler的时候,我们就会去找它对事件的处理方法,主要是写事件,所以我们找到写事件处理方法:
1 | // step 1 |
write()
之前自己在ChannelPipeline那章分析到HeadContext的write方法,没有继续往下分析,我们在这里分析:
它主要有这么几个过程:
- direct化ByteBuf
- 插入写链表
- 设置写状态
1 | // step 1 |
flush()
write不能写了就需要flush了,我们同样也从HeadContext的flush方法开始分析:
它主要有这么几个步骤:
- 添加刷新标志并设置写状态
- 遍历buffer队列,过滤ByteBuf
- 调用JDK底层的API进行自旋写
1 | // step 1 |
知道write和flush那么就很容易理解writeAndFlush啦!!