丢弃数量个数

来源:8-5 基于分隔符解码器分析

金刚小猫咪

2024-02-28

图片描述
tooLongFrameLength为什么没有加minFrameLength + minDelimLength。也就是说处于丢弃状态下,本次查到了分隔符 这段区间没有累加到丢弃数量里面,但是确实是这一部分也丢弃了

写回答

1回答

好帮手慕小蓝

2025-02-11

在您提供的代码片段中,tooLongFrameLength 变量被用于跟踪由于帧过长而被丢弃的字节数。当检测到一个帧过长时,discardingTooLongFrame 被设置为 true,并且开始丢弃该帧。在丢弃帧的过程中,buffer.skipBytes(length - minFrameLength + minDelimLength) 被调用以跳过整个帧,包括帧头和帧体。

在丢弃帧之后,discardingTooLongFrame 被设置为 false,表示不再处于初始状态。此时,tooLongFrameLength 被设置为 this.tooLongFrameLength,即之前丢弃的帧长度。然后 this.tooLongFrameLength 被重置为 0,为下一次可能的丢弃做准备。

关于您的问题,tooLongFrameLength 没有加上 minFrameLength + minDelimLength 是因为 tooLongFrameLength 应该只跟踪由于帧过长而被丢弃的字节数,不包括帧头的长度。minFrameLength + minDelimLength 是帧的总长度,包括帧头和帧体。在丢弃帧时,您需要跳过整个帧,不仅仅是帧体。

如果 tooLongFrameLength 包括了帧头的长度,那么在下一次计算是否丢弃帧时可能会错误地包括帧头的长度,导致逻辑错误。

因此,正确的逻辑是:

  • buffer.skipBytes(length - minFrameLength + minDelimLength) 跳过整个帧,包括帧头和帧体。

  • tooLongFrameLength 只跟踪帧体被丢弃的字节数。

  • this.tooLongFrameLength 重置为 0 为下一次可能的丢弃做准备。

这样可以确保正确地跟踪和处理帧过长的情况,同时避免在下一次处理时错误地包括帧头的长度。


0
0

Java读源码之Netty深入剖析

解析netty各大组件细节,百万级性能调优,设计模式实际运用

2334 学习 · 283 问题

查看课程