分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Netty源码分析第6章(解码器)---->第2节: 固定长度解码器

发布时间:2023-09-06 02:28责任编辑:傅花花关键词:暂无标签

 

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源码分析第6章(解码器)---->第2节: 固定长度解码器

原文地址:https://www.cnblogs.com/xiangnan6122/p/10206405.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved