首页 > 编程语言 >netty源码:(40)ReplayingDecoder

netty源码:(40)ReplayingDecoder

时间:2024-01-02 12:35:44浏览次数:36  
标签:netty 字节 40 源码 ByteBuf ReplayingDecoder import 读取


netty源码:(40)ReplayingDecoder_java

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)时,不需要判断所读取的字节是否够用,不会报错,会等到字节够用了才返回。

netty源码:(40)ReplayingDecoder_java_02


上述代码用两种方式读取一条消息,消息分为消息头(定义消息体的长度)和消息体两部分。

第一种方式是使用普通的ByteToMessageDecoder,需要在读取之前判断ByteBuf中是否有足够的字节。

第二种方式使用ReplayingDecoder,读取之前不需要判断ByteBuf中是否有足够的字节,具体的实现原理是:当要读的字节不够时,抛出一个错误,捕获这个错误的时候重置readerIndex,然后进行下一次尝试,实质上就是一种重试机制。


标签:netty,字节,40,源码,ByteBuf,ReplayingDecoder,import,读取
From: https://blog.51cto.com/amadeusliu/9067603

相关文章

  • 记录 | ubuntu源码编译python3.7.3(指定版本)
    一、安装依赖包sudoapt-getinstall-ymakebuild-essentiallibssl-devzlib1g-devsudoapt-getinstall-ylibbz2-devlibreadline-devlibsqlite3-devwgetcurlllvmsudoapt-getinstall-ylibncurses5-devlibncursesw5-devxz-utilstk-dev二、从Python网页中找......
  • Python 爬虫,eccoid 网站作品信息采集爬虫源码!
    一个比较简单的爬虫,适合练手学习使用,主要是爬取和采集网站的作品信息,包括标题、内容及图片,其中图片采用了多线程爬取,算是比较简单的参考和学习案例,协议头的获取也做了随机处理,如果你正在找练手网站,不妨尝试爬取下载数据。考虑到外网爬取,存在访问超时以及出错的情况发生,所以采用了三......
  • Bmwgroupdesignworks爬虫,网站作品信息多线程采集爬虫源码!
    一个比较简单国外设计站点,作品信息采集爬虫源码,比较简单,采集的内容包括标题、内容及图片信息,适合新人学习参考使用。网站作品信息采集中,关于图片的采集下载使用了重试以及多线程的方式爬取采集下载,适合Python爬虫新人练手使用和学习,如果你正在找练手网站,不妨尝试爬取下载数据。三......
  • 【练习】爬虫-基础2 - GlidedSky 源码参考!
    前面本渣渣分享过爬虫-基础1-GlidedSky,这篇就来分享爬虫-基础2,希望对你有帮助吧,当然仅记录分享,为了更有帮助,这里升级了一下爬虫难度,采用了多线程。本身相对于基础1,基础2提升了一下难度,从单页爬取提升到分页爬取,分成了1000个页面,需要请求一千次,而网页结构没有变化,很典型的Boo......
  • 【JDK源码】String源码学习笔记
    代码运行环境:JDK8首先思考几个问题:String对象在不同的JDK中是如何实现的?String对象的不可变性是什么样的?下面这段代码的输出结果是什么?Strings1=newString("aaa")+newString("");s1.intern();Strings2="aaa";System.out.println(s1==s2);Strings3=newString("bbb......
  • 【JDK源码】Java中LinkedList的实现
    JDK版本:1.8.0_271基础介绍LinkedList底层数据结构是一个双向链表:链表的每个节点叫做Node,在Node中,prev属性表示前一个节点的位置,next属性表示后一个节点的位置first是双向链表的头节点,它的前一个节点是nulllast是双向链表的尾节点,它的后一个节点是null当链表中没有数据时,fi......
  • 【JDK源码】Java包装类的缓存是怎么回事
    JDK版本:1.8.0_271基础介绍缓存机制包装类是对Java中基本类型的封装,在JDK5中引入了包装类的缓存机制,有助于节省内存。实现方式是在类初始化的时,提前创建好会频繁使用的包装类对象,当需要使用某个类的包装类对象时,如果该对象包装的值在缓存的范围内,就返回缓存的对象,否则就创建新的......
  • 【JDK源码】ArrayList的代码实现
    JDK版本:1.8.0_271基础介绍ArrayList底层数据结构就是一个数组:index表示数组下标,从0开始计数,elementDatda表示数组本身DEFAULT_CAPACITY表示数组的初始化大小,默认是10size表示数组的大小,int类型,没有使用volatile修饰,非线程安全modCount统计当前数组被修改的版本次数,数......
  • Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码
    UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波,而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据,从而具有GHz量级的带宽。UWB(超宽带)高精度定位系统是一种利用超宽带技术实现精确定位的解决方案。该系统使用高......
  • java中小微医疗机构云服务(云HIS)平台源码
    云HIS(Cloud-BasedHealthcareInformationSystem)重新定义了HIS,目标是为中小型医疗卫生机构提供优质经济的医疗卫生信息化产品及服务;是以健康档案为主线、以电子病历为核心、以云计算技术为基础的医疗卫生系统。云HIS作为基于云计算的B/S构架的HIS系统,为基层医疗机构(包括诊所、社区......