Netty的ChannelHandler在ChannelPipeline中运行,这给予了切面编程的可能。
Codes包涵了encode与decode两样操作。Netty提供了一套Api骨架,他们大多继承自ChannelHandler,由用户实现自定义的Codes, 在ChannelHandler运行时处理数据前后,进行decode与encode操作。
Decodes:
byte-to-message
message-to-message
message-to-byte
对于decode, netty提供了几个抽象类,由我们继承实现:
ByteToMessageDecoder 提供decode 跟 docodeLast操作。
样例代码:
public class ToIntegerDecoder extends ByteToMessageDecoder { #1 @Override public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() >= 4) { #2 out.add(in.readInt()); #3 } } }
执行过程 :
ReplayingDecoder 是一个特殊的byte-to-message的Decoder。他一是个可重复进行的Decoder,貌似比较难编写,对于读取的数据,当读取到有数据时就进行decode操作,所以每次ByteBuf.readableByte()得到的长度并不是我们预期的。重复的对ByteBuf的数据进行转码,最后得到我们期望的东西。改写上面ToInDecoder,使用ReplayingDecoder的实现如下:
public class ToIntegerDecoder2 extends ReplayingDecoder<Void> { #1 @Override public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { out.add(in.readInt()); #2 } }
MessageToMessageDecoder 同样有docode方法跟docodeLast方法,他允许我们将"消息"对象进行转换。下面是一个Integer 转成 String的例子:
public class IntegerToStringDecoder extends MessageToMessageDecoder<Integer> { #1 @Override public void decode(ChannelHandlerContext ctx, Integer msg List<Object> out) throws Exception { out.add(String.valueOf(msg)); #2 }
Encodes
message-message
message-byte
MessageToByteEncoder 是一个message-to-type的编码器。编写一个Integer到Byte的编写器:
public class IntegerToByteEncoder extends MessageToByteEncoder<Short> { #1 @Override public void encode(ChannelHandlerContext ctx, Short msg, ByteBuf out) throws Exception { out.writeShort(msg); #2 }执行过程:
MessageToMessageEncoder 是一个message-to-message的编码器,同样有Encode操作。下面是将Integer解码成String的例子:
public class IntegerToStringEncoder extends MessageToMessageEncoder<Integer> { #1 @Override public void encode(ChannelHandlerContext ctx, Integer msg List<Object> out) throws Exception { out.add(String.valueOf(msg)); #2 } }
Codes
byte-to-message ==> encoding and decoding
byte-to-byte ==> encoding and decoding
ByteToByteCodec 是一个byte-byte的解码跟编码器,有encode, decode, decodeLast方法。
ByteToMessageCodec 是一个byte-messate的解码跟编码器, 有encode, decode, decodeLast方法。
MessageToMessageCodec 是一个messate-to-messate的解码器跟编码器,有encode, decode, decodeLast方法。
CombinedChannelDuplexHandler 一个让我们结合设置Encode跟Decode成对的绑定在Handler中
public class CharCodec extends CombinedChannelDuplexHandler<ByteToCharDecoder, CharToByteEncoder> { #1 public CharCodec() { super(new ByteToCharDecoder(), new CharToByteEncoder()); #2 } }