Netty - Codec

143 阅读1分钟

Codec

编解码器本质就是一些用于消息类型转换的Handler,Netty中有大量已经帮我们实现好的协议编解码器,例如:redishttp等,详细可以查看官方文档。我们当然也可以实现自定义的编解码器。

命名方式

  • Decode 解码器,管理入方向上的解码,例如: ByteBuf -> 对象
  • Encode 编码器,管理出方向上的编码,例如: 对象 -> ByteBuf
  • Codec 编解码器,以上两者的组合

粘包半包

Netty中ByteBuf作为信息接受缓冲区有大小限制,和TCP本身的滑动窗口机制,两者都会造成粘包半包现象。
本质上TCP这种流式协议并不管理消息内容的边界。
以下解码器可以解决该问题

  • FixedLengthFrameDecoder 定长消息,效率高,但消息长度固定
  • LineBasedFrameDecoder换行分隔符消息,需要检查消息内容所以效率低,但消息长度可变
  • DelimiterBasedFrameDecoder指定分隔符消息,同上
  • LengthFieldBasedFrameDecode带有长度域的消息,类似各种网络协议头,推荐

上面三种比较简单,详细看下LengthFieldBasedFrameDecode的参数

  • lengthFieldOffset 长度域的偏移量,使用协议头在长度域前还有别的域时
  • lengthFieldLength 长度域的长度,长度域中的值代表内容域的长度
  • lengthAdjustment 长度域后还有多少个字节才是内容域,不是长度域后就是内容域,这部分域的长度没包含在长度域里
  • initialBytesToStrip 从消息头开始,需要剥离多少个字节

自定义编解码器

作用子类是否可以共享
BytesToMessageCodec字节数组 <-> 对象X
MessageToMessageCodec对象 <-> 对象,对象也可以是ByteBuf