跳至主要內容

Netty学习笔记三

xw大约 1 分钟NettyJavaNetty

解码一般用于入站时使用,主要就是字节数组转换为消息对象。

  • 主要是两个方法
    decode 一般用这个
    decodeLast 一般用于最后几个字节处理

  • 抽象解码器

    • ByteToMessageDecoder用于将字节转为消息,需要检查缓冲区是否有足够的字节
    • ReplayingDecoder继承ByteToMessageDecoder,不需要检查缓冲区是否有足够的字节,但是ReplayingDecoder速度略慢于ByteToMessageDecoder,不是所有的ByteBuf都支持
    • 选择:项目复杂性高则使用ReplayingDecoder,否则使用 ByteToMessageDecoder
    • MessageToMessageDecoder用于从一种消息解码为另外一种消息(例如POJO到POJO)
  • 解码器具体的实现,用的比较多的是(更多是为了解决TCP底层的粘包和拆包问题)

    • DelimiterBasedFrameDecoder: 指定消息分隔符的解码器
    • LineBasedFrameDecoder: 以换行符为结束标志的解码器
    • FixedLengthFrameDecoder:固定长度解码器
    • LengthFieldBasedFrameDecoder:message = header+body, 基于长度解码的通用解码器
    • StringDecoder:文本解码器,将接收到的对象转化为字符串,一般会与上面的进行配合,然后在后面添加业务handle。

Netty编码器Encoder

  • Encoder对应的就是ChannelOutboundHandler,消息对象转换为字节数组
  • Netty本身未提供和解码一样的编码器,是因为场景不同,两者非对等的
  • MessageToByteEncoder消息转为字节数组,调用write方法,会先判断当前编码器是否支持需要发送的消息类型,如果不支持,则透传;
  • MessageToMessageEncoder用于从一种消息编码为另外一种消息(例如POJO到POJO)