netty源码:(40)ReplayingDecoder

在这里插入图片描述

ReplayingDecoder是ByteToMessageDecoder的子类,我们继承这个类时,也要实现decode方法,示例如下:

package cn.edu.tju;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.nio.charset.Charset;
import java.util.List;

public class MyLongReplayingDecoder extends ReplayingDecoder<Void> {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {

        int readIndex = in.readerIndex();
        int writerIndex = in.writerIndex();

        int readableBytes = in.readableBytes();
        long result = in.readLong();
        
        out.add(result);
    }
}

在从in中读取数据(readLong)时,不需要判断所读取的字节是否够用,不会报错,会等到字节够用了才返回。
在这里插入图片描述
上述代码用两种方式读取一条消息,消息分为消息头(定义消息体的长度)和消息体两部分。
第一种方式是使用普通的ByteToMessageDecoder,需要在读取之前判断ByteBuf中是否有足够的字节。
第二种方式使用ReplayingDecoder,读取之前不需要判断ByteBuf中是否有足够的字节,具体的实现原理是:当要读的字节不够时,抛出一个错误,捕获这个错误的时候重置readerIndex,然后进行下一次尝试,实质上就是一种重试机制。

相关推荐

  1. netty:(6) Future接口

    2023-12-28 11:32:05       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-28 11:32:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-28 11:32:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-28 11:32:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-28 11:32:05       20 阅读

热门阅读

  1. pnpm、npm、yarn是什么?怎么选择?

    2023-12-28 11:32:05       39 阅读
  2. 解决服务器Tab键不能补全问题

    2023-12-28 11:32:05       28 阅读
  3. vue3 ajax

    2023-12-28 11:32:05       39 阅读
  4. 深入理解C语言中冒泡排序(优化)

    2023-12-28 11:32:05       35 阅读
  5. A Prompt Learning Framework for Source Code Summarization

    2023-12-28 11:32:05       34 阅读
  6. vue跑马灯

    2023-12-28 11:32:05       35 阅读
  7. 计算机基础面试题总结

    2023-12-28 11:32:05       30 阅读
  8. SpringBoot实用开发(四)-- RedisTemplate 常用API

    2023-12-28 11:32:05       40 阅读