netty-编码解码器
1.基本介绍
- 当Netty发送或者接受一个消息的时候,就将会发生一次数据转换。入站消息会被解码:从字节转换为另一种格式(比如java对象);如果是出站消息,它会被编码成字节。
- Netty提供一系列实用的编解码器,他们都实现了ChannelInboundHadnler或者ChannelOutboundHandler接口。在这些类中,channelRead方法已经被重写了。以入站为例,对于每个从入站Channel读取的消息,这个方法会被调用。随后,它将调用由解码器所提供的decode()方法进行解码,并将已经解码的字节转发给ChannelPipeline中的下一个ChannelInboundHandler。
2.解码器-ByteToMessageDecoder
实例分析
public class ByteDeco extends ByteToMessageDecoder { /** * * decode 会根据接收的数据,被调用多次, 直到确定没有新的元素被添加到list * , 或者是ByteBuf 没有更多的可读字节为止 * 如果list out 不为空,就会将list的内容传递给下一个 channelinboundhandler处理, 该处理器的方法也会被调用多次 * * @param ctx 上下文对象 * @param in 入站的 ByteBuf * @param out List 集合,将解码后的数据传给下一个handler * @throws Exception */ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { System.out.println("ByteToMessageDecode解码器被调用了......"); //因为 long 8个字节, 需要判断有8个字节,才能读取一个long if(in.readableBytes() >= 8) { out.add(in.readLong()); } } }
3.解码器-ReplayingDecoder
实例分析
public class RepDeco extends ReplayingDecoder<Void> { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { System.out.println("ReplayingDecoder解码器被调用了......"); //在 ReplayingDecoder 不需要判断数据是否足够读取,内部会进行处理判断 out.add(in.readLong()); } }
4.MessageToByteEncoder编码器
实例分析
public class MTBEnco extends MessageToByteEncoder<Long> { //编码方法 @Override protected void encode(ChannelHandlerContext ctx, Long msg, ByteBuf out) throws Exception { System.out.println("MessageToByteEncoder编码器被调用,即将编码:"+msg); out.writeLong(msg); } }