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

 更新时间:2022年03月29日 09:57:43   作者:向南是个万人迷  
这篇文章主要为大家介绍了Netty分布式固定长度解码器原理剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

固定长度解码器

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

我们了解到, 解码器需要继承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分布式固定长度解码器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中Calendar日期类常用方法演示

    Java中Calendar日期类常用方法演示

    这篇文章主要给大家介绍了关于Java中Calendar日期类用法详细介绍的相关资料,Calendar类是 Java 中用于处理日期和时间的抽象类,它提供了一种独立于特定日历系统的方式来处理日期和时间,需要的朋友可以参考下
    2023-12-12
  • Java常用加密算法实例总结

    Java常用加密算法实例总结

    这篇文章主要介绍了Java常用加密算法,结合实例形式总结分析了base64、md5、sha、rsa、des等加密算法实现技巧,需要的朋友可以参考下
    2017-10-10
  • Java数组与堆栈相关知识总结

    Java数组与堆栈相关知识总结

    今天给大家带来的是关于Java的相关知识,文章围绕着Java数组与堆栈展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 滴滴二面之Kafka如何读写副本消息的

    滴滴二面之Kafka如何读写副本消息的

    这篇文章主要给大家介绍了关于滴滴二面之Kafka如何读写副本消息的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Java注释和关键字实例详解

    Java注释和关键字实例详解

    注释是对程序语言的说明,有助于开发者和用户之间的交流,方便理解程序,注释不是编程语句,因此被编译器忽略,下面这篇文章主要给大家介绍了关于Java注释和关键字的相关资料,需要的朋友可以参考下
    2023-01-01
  • 一文搞懂Java中的反射机制

    一文搞懂Java中的反射机制

    Java的反射机制是在运行状态中,对于任何一个类,都可以知道这个类的所有属性和方法,对于任何一个对象,都可以调用它所有的方法和属性,修改部分类型信息。本文就来详细讲讲Java反射机制的使用
    2022-07-07
  • SpringBoot整合Dubbo框架,实现RPC服务远程调用

    SpringBoot整合Dubbo框架,实现RPC服务远程调用

    Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。今天就来看下SpringBoot整合Dubbo框架的步骤
    2021-06-06
  • log4j.properties 配置(实例讲解)

    log4j.properties 配置(实例讲解)

    下面小编就为大家带来一篇log4j.properties 配置(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java内部类使用总结

    java内部类使用总结

    本文主要介绍了java内部类使用总结。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java 之类型转换与多态详情

    Java 之类型转换与多态详情

    Java使用类创造新的类型(type),并使用继承来便利我们创建类。再深一层讲类型,并是多态(polymorphism)的概念。本文将给大家介绍Java 的类型转换与多态,需要的小伙伴可以参考下面文章的具体内容
    2021-09-09

最新评论