引言
在入门篇的学习中,我们曾经阐述过工作于 TCP 协议的应用出现的粘包和拆包现象。当时我们介绍了 Netty 用于解决拆包粘包问题的三种常见的解码器实现:
处理定长协议的
FixedLengthFrameDecoder
。处理固定消息分隔符的
DelimiterBasedFrameDecoder
。处理报文头 + 报文体模式协议的
LengthFieldBasedFrameDecoder
。
今天这篇文章,我们不再介绍更多编解码器的使用,而是从这些解码器的背后实现入手,弄明白他们的处理机制,以及其在 Netty 整个读写流程中所处的地位。
解码
将 socket 上读取到的二进制数据转换为后端业务可以理解的消息实体,这个过程我们称之为解码,执行这个任务的组件,我们称之为解码器。而在 Netty 当中,有非常多内建的解码支持,涵盖了各种市面上的协议。每一种协议的解码需求,都有一个特定的解码器来承担,解码器都位于 io.netty.handler.codec
包路径下。而所有的解码器都继承了 ByteToMessageDecoder
,该类是解码器的顶级父类,定义了这个解码过程中的模板动作。首先来看下该类的类视图,如下