ReplayingDecoder<S>和ByteToMessageDecoder

ReplayingDecoder< S >

该抽象类继承自ByteToMessageDecoder

< S > – the state type which is usually an Enum; use Void if state management is unused

出现Raw use of parameterized class 'ReplayingDecoder’警告信息时,是因为没有在后面跟泛型
利用其能够在阻塞I/O中实现非阻塞的解码

ReplayingDecoder和ByteToMessageDecoder的区别

ReplayingDecoder中的decode()和decodeLast()方法使用时可以忽略数据的接收,即可以看做所有的数据都已经接收完毕,你不用去考虑收到的数据是否是可用的.

下面分别使用ByteToMessageDecoder和ReplayingDecoder来实现同样功能的一段代码,代码来自文档

利用ByteToMessageDecoder的实现:

 public class IntegerHeaderFrameDecoder extends ByteToMessageDecoder {
  @Override
 protected void decode(ChannelHandlerContext ctx,
                         ByteBuf buf, List<Object> out) throws Exception {
   //没有足够的数据被接收
   if (buf.readableBytes() < 4) {
      return;
   }

   buf.markReaderIndex();
   int length = buf.readInt();

   if (buf.readableBytes() < length) {
      buf.resetReaderIndex();
      return;
   }

   out.add(buf.readBytes(length));
 } 
}

同样的实现,使用ReplayingDecoder来的更加简单:

public class IntegerHeaderFrameDecoder
    extends ReplayingDecoder<Void> {  
 protected void decode(ChannelHandlerContext ctx,
                         ByteBuf buf, List<Object> out) throws Exception {

   out.add(buf.readBytes(buf.readInt()));     
 } 
}

是不是简单多了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值