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中Class类的基础知识点及实例

    java中Class类的基础知识点及实例

    在本篇文章里小编给大家分享了关于java中Class类的基础知识点及实例内容,有兴趣的朋友们可以学习下。
    2021-05-05
  • 一文彻底搞懂java多线程和线程池

    一文彻底搞懂java多线程和线程池

    当一个服务器接受到大量短小线程的请求时,使用线程池技术是非常合适的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率,这篇文章主要给大家介绍了如何通过一文彻底搞懂java多线程和线程池的相关资料,需要的朋友可以参考下
    2021-09-09
  • Spring容器中添加bean的5种方式

    Spring容器中添加bean的5种方式

    我们知道平时在开发中使用Spring的时候,都是将对象交由Spring去管理,那么将一个对象加入到Spring容器中,有哪些方式呢,感兴趣的可以了解一下
    2021-07-07
  • 实例解析Java日期格式工具类DateUtil.java

    实例解析Java日期格式工具类DateUtil.java

    本文主要对Java日期格式工具类DateUtil.java进行实例解析。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • java中this关键字的详细使用介绍

    java中this关键字的详细使用介绍

    大家好,本篇文章主要讲的是java中this关键字的详细使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • SpringBoot3实现webclient的通用方法详解

    SpringBoot3实现webclient的通用方法详解

    Spring Boot WebClient 是 Spring Framework 5 中引入的一个新的响应式 Web 客户端,用于异步和响应式地与外部服务进行通信,下面我们就来看看SpringBoot3实现webclient的通用方法吧
    2024-04-04
  • 关于@ApiImplicitParams、ApiImplicitParam的使用说明

    关于@ApiImplicitParams、ApiImplicitParam的使用说明

    这篇文章主要介绍了关于@ApiImplicitParams、ApiImplicitParam的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java 数据结构进阶二叉树题集上

    Java 数据结构进阶二叉树题集上

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将带你通过实际题目来熟练掌握
    2022-04-04
  • Java C++题解leetcode1441用栈操作构建数组示例

    Java C++题解leetcode1441用栈操作构建数组示例

    这篇文章主要为大家介绍了Java C++题解leetcode1441用栈操作构建数组示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • SpringCloud注册中心之consul详细讲解使用方法

    SpringCloud注册中心之consul详细讲解使用方法

    Consul是一款由HashiCorp公司开源的,用于服务治理的软件,Spring Cloud Consul对其进行了封装,这篇文章主要介绍了springcloud组件consul服务治理,需要的朋友可以参考下
    2022-11-11

最新评论