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

释放双眼,带上耳机,听听看~!

 

Netty源码分析第六章: 解码器

 

第二节: 固定长度解码器

 

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

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

看其类的定义:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1public class FixedLengthFrameDecoder extends ByteToMessageDecoder {
2    //长度大小
3    private final int frameLength;
4    public FixedLengthFrameDecoder(int frameLength) {
5        if (frameLength <= 0) {
6            throw new IllegalArgumentException(
7                    "frameLength must be a positive integer: " + frameLength);
8        }
9        //保存当前frameLength
10        this.frameLength = frameLength;
11    }
12    @Override
13    protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
14        //通过ByteBuf去解码.解码到对象之后添加到out上
15        Object decoded = decode(ctx, in);
16        if (decoded != null) {
17            //将解析到byteBuf添加到对象里面
18            out.add(decoded);
19        }
20    }
21    protected Object decode(
22            @SuppressWarnings("UnusedParameters") ChannelHandlerContext ctx, ByteBuf in) throws Exception {
23        //字节是否小于这个固定长度
24        if (in.readableBytes() < frameLength) {
25            return null;
26        } else {
27            //当前累加器中截取这个长度的数值
28            return in.readRetainedSlice(frameLength);
29        }
30    }
31}
32

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

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

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

再看重载的decode方法:

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

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

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

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

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

 

上一节: ByteToMessageDecoder

下一节: 行解码器

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Http模块(2) CNodejs爬虫实现

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索