Netty Codec 编解码器
Netty 对于解决数据从一种特定协议格式到另一种格式的转换(如二进制字节和POJO之间地转换),提供了 codecs (编解码器) 组件来处理的。使用 Netty 的 codecs ,可以很方便地为各种不同地协议编写编解码器;
- 解码器:负责处理入站数据,将消息从字节或其他序列形式转成指定的消息对象;
- 编码器:负责处理出站数据,将消息对象转化为字节或其他序列形式;
消息被编码后解码后会自动通过
ReferenceCountUtil.release(message) 释放,如果不想释放消息可以使用
ReferenceCountUtil.retain(message),这将会使引用数量增加而没有消息发布,大多数时候不需要这么做。
Decoder 解码器
Decoder 主要用于入站处理,Netty 中的提供的 Decoder 分为以下 2 类:
- 字节到消息解码(byte-to-message):ByteToMessageDecoder 、ReplayingDecoder 等;
- 消息到消息解码(message-to-message):MessageToMessageDecoder 等;
Decoder 是 ChannelInboundHandler 的抽象实现,所以 Decoder 的使用方法类似于 ChannelInboundHandler ,可以在 ChannelPipeline 中直接加入 Decoder ,就是可实现入站信息的编码;
ByteToMessageDecoder
用于将字节转为消息(或其他字节序列),其中有 2 个需要覆盖的比较重要的方法如下:
decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) | 解码方法,将一个 BytedBuf 解码为一个 List<Object> 对象,并传递给下一个 ChannelHandler; |
decodeLast(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) | 当 Channel 处于 inactive 状态时,会触发该方法一次; |
以下示例中,每次从入站的 ByteBuf 中读取 4 个字节,编码为 int,并添加到一个 List,当decode方法执行结束后,out 包含的数据就会转发到下一个 ChannelInboundHandler 中;
public class ToIntegerDecoder extends ByteToMessageDecoder { //1
public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)
throws Exception {
if (in.readableBytes() >= 4) { //当可读字节达到 4 个时,读取这 4 个字节,并编码为一个 Integer,并添加到 out 传递到下一个 ChannelInboundHandler
out.add(in.readInt());
}
}
}