Netty分布式固定长度解码器实现原理剖析

 更新时间:2022年3月29日 14:03  点击:595 作者:向南是个万人迷

固定长度解码器

上一小节:解码器读取数据不完整的逻辑剖析

我们了解到, 解码器需要继承ByteToMessageDecoder, 并重写decode方法, 将解析出来的对象放入集合中集合, ByteToMessageDecoder中可以将解析出来的对象向下进行传播, 这一小节带大家剖析一个最简单的解码器FixedLengthFrameDecoder, 从它入手了解码器的相关原理

FixedLengthFrameDecoder是一个固定长度的解码器, 功能就是根据固定长度, 截取固定大小的字节数进行解码

看其类的定义

public class FixedLengthFrameDecoder extends ByteToMessageDecoder {
    //长度大小
    private final int frameLength;
    public FixedLengthFrameDecoder(int frameLength) {
        if (frameLength <= 0) {
            throw new IllegalArgumentException(
                    "frameLength must be a positive integer: " + frameLength);
        }
        //保存当前frameLength
        this.frameLength = frameLength;
    }
    @Override
    protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        //通过ByteBuf去解码.解码到对象之后添加到out上
        Object decoded = decode(ctx, in);
        if (decoded != null) {
            //将解析到byteBuf添加到对象里面
            out.add(decoded);
        }
    }
    protected Object decode(
            @SuppressWarnings("UnusedParameters") ChannelHandlerContext ctx, ByteBuf in) throws Exception {
        //字节是否小于这个固定长度
        if (in.readableBytes() < frameLength) {
            return null;
        } else {
            //当前累加器中截取这个长度的数值
            return in.readRetainedSlice(frameLength);
        }
    }
}

我们看到这个类继承了ByteToMessageDecoder, 重写了decode方法

这个类只有一个属性叫frameLength, 并在构造方法中初始化了该属性

再看decode方法, 在decode方法中又调用了自身另一个重载的decode方法进行解析, 解析出来之后将解析后的数据放在集合out中

再看重载的decode方法

重载的decode方法中首先判断累加器的字节数是否小于固定长度, 如果小于固定长度则返回null, 代表不是一个完整的数据包, 直接返回null

如果大于等于固定长度, 则直接从累加器中截取这个长度的数值

 in.readRetainedSlice(frameLength) 会返回一个新的截取后的ByteBuf, 并将原来的累加器读指针后移frameLength个字节

如果累计器中还有数据, 则会通过ByteToMessageDecoder中callDecode方法里while循环的方式, 继续进行解码

这样, 就是实现了固定长度的解码工作

到此这篇关于Netty分布式固定长度解码器实现原理剖析的文章就介绍到这了,更多相关Netty分布式固定长度解码器内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://www.cnblogs.com/xiangnan6122/p/10206405.html

[!--infotagslink--]

相关文章

  • 支持python的分布式计算框架Ray详解

    Ray是一种分布式执行框架,便于大规模应用程序和利用先进的机器学习库,今天给大家分享支持python的分布式计算框架Ray详解,感兴趣的朋友一起看看吧...2021-07-29
  • 详解GaussDB(DWS) explain分布式执行计划的示例

    这篇文章主要介绍了详解GaussDB(DWS) explain分布式执行计划,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-12-08
  • 分布式文档存储数据库之MongoDB备份与恢复的实践详解

    这篇文章主要介绍了分布式文档存储数据库之MongoDB备份与恢复,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-12-08
  • C++实现的分布式游戏服务端引擎KBEngine详解

    这篇文章主要详细介绍了C++实现的分布式游戏服务端引擎KBEngine的概念以及使用方法,非常的实用,有需要的小伙伴可以参考下...2020-04-25
  • 分布式监控系统之Zabbix 使用SNMP、JMX信道采集数据的原理解析

    这篇文章主要介绍了分布式监控系统之Zabbix 使用SNMP、JMX信道采集数据,本文给大家介绍的非常详细,对大家的学习或工作就有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • 详解分布式系统中如何用python实现Paxos

    提到分布式算法,就不得不提 Paxos 算法,在过去几十年里,它基本上是分布式共识的代 名词,因为当前最常用的一批共识算法都是基于它改进的。比如,Fast Paxos 算法、 Cheap Paxos 算法、Raft 算法、ZAB 协议等等。...2021-05-19
  • 分布式文档存储数据库之MongoDB访问控制的操作方法

    这篇文章主要介绍了分布式文档存储数据库之MongoDB访问控制的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-12-08
  • 详解Java分布式事务的 6 种解决方案

    在分布式系统、微服务架构大行其道的今天,服务间互相调用出现失败已经成为常态,本文侧重于其他几项,关于 2PC、3PC 传统事务,网上资料已经非常多了,这里不多做重复,本文通过示例给大家介绍Java分布式事务的 6 种解决方案,一起看看吧...2021-06-26
  • docker compose 一键部署分布式配置中心Apollo的过程详解

    这篇文章主要介绍了docker compose 一键部署分布式配置中心Apollo,今天我们使用Docker来进行搭建,毕竟Docker对于开发者来说更友好一些,需要的朋友可以参考下...2021-09-19
  • 详解三分钟快速搭建分布式高可用的Redis集群

    这篇文章主要介绍了详解三分钟快速搭建分布式高可用的Redis集群,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
  • springboot cloud使用eureka整合分布式事务组件Seata 的方法

    这篇文章主要介绍了springboot cloud使用eureka整合分布式事务组件Seata 的方法 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
  • ASP.NET通过分布式Session提升性能

    我们将会谈到的是ASP.NET通过分布式Session来构建高性能可扩展的ASP.NET网站...2021-09-22
  • 深入了解MongoDB 分布式集群

    这篇文章主要介绍了MongoDB 分布式集群的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-12-08
  • 基于python分布式爬虫并解决假死的问题

    这篇文章主要介绍了基于python分布式爬虫并解决假死的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-15
  • 分布式监控系统之Zabbix主动、被动及web监控的过程详解

    这篇文章主要介绍了分布式监控系统之Zabbix主动、被动及web监控的过程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • Netty结合Protobuf进行编解码的方法

    这篇文章主要介绍了Netty结合Protobuf进行编解码,通过文档表述和代码实例充分说明了如何进行使用和操作,需要的朋友可以参考下...2021-06-26
  • Netty 轻松实现文件上传功能

    今天我们来完成一个使用netty进行文件传输的任务。在实际项目中,文件传输通常采用FTP或者HTTP附件的方式,对Netty 文件上传功能感兴趣的朋友一起看看吧...2021-07-07
  • 关于注解式的分布式Elasticsearch的封装案例

    这篇文章主要介绍了关于注解式的分布式Elasticsearch的封装案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-26
  • .net core 使用阿里云分布式日志的配置方法

    本文给大家分享.net core 使用阿里云分布式日志的实现代码,简单查询阿里云日志的工具使用,通过实例代码介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • ASP.NET Core利用Jaeger实现分布式追踪详解

    这篇文章主要给大家介绍了关于ASP.NET Core利用Jaeger实现分布式追踪的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-09-22