Netty笔记(六)Codes

    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
}
}
}


执行过程 :

Netty笔记(六)Codes

    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
}
执行过程:


Netty笔记(六)Codes

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
}
}




你可能感兴趣的:(Netty笔记(六)Codes)