一、Codec类型
- 解码器和编码器是分开实现的,但往往要搭配使用,且具有相反逻辑。再加入流水线时往往需要两次添加。
- 相互配套的解码器和编码器可以放在同一个类中,netty的新类型-Codec类型。
- 完成POJO到ByteBuf数据包的配套的编码器和解码器的基类,叫作ByteToMessageCodec<I>,它是一个抽象类。从功能上说,继承它,就等同于继承了ByteToMessageDecoder解码器和MessageToByteEncoder编码器这两个基类。
- 对于POJO之间进行转换的编码和解码,Netty将MessageToMessageEncoder编码器和MessageToMessageDecoder解码器进行了简单的整合,整合出一个新的基类——MessageToMessageCodec(编解码器)。这个基类同时包含了编码encode和解码decode两个抽象方法,用于完成pojo-to-pojo的双向转换。
二、组合器
- 前面的编码器和解码器相结合是通过继承完成的。继承的方式有其不足,在于:将编码器和解码器的逻辑强制性地放在同一个类中,在只需要编码或者解码单边操作的流水线上,逻辑上不大合适。
- 编码器和解码器如果要结合起来,除了继承的方法之外,还可以通过组合的方式实现。与继承相比,组合会带来更大的灵活性:编码器和解码器可以捆绑使用,也可以单独使用。
- Netty提供了一个新的组合器——CombinedChannelDuplexHandler基类。
//... public class IntegerDuplexHandler extends CombinedChannelDuplexHandler< Byte2IntegerDecoder, Integer2ByteEncoder> { public IntegerDuplexHandler() { super(new Byte2IntegerDecoder(), new Integer2ByteEncoder()); } }