采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
tooLongFrameLength为什么没有加minFrameLength + minDelimLength。也就是说处于丢弃状态下,本次查到了分隔符 这段区间没有累加到丢弃数量里面,但是确实是这一部分也丢弃了
在您提供的代码片段中,tooLongFrameLength 变量被用于跟踪由于帧过长而被丢弃的字节数。当检测到一个帧过长时,discardingTooLongFrame 被设置为 true,并且开始丢弃该帧。在丢弃帧的过程中,buffer.skipBytes(length - minFrameLength + minDelimLength) 被调用以跳过整个帧,包括帧头和帧体。
tooLongFrameLength
discardingTooLongFrame
true
buffer.skipBytes(length - minFrameLength + minDelimLength)
在丢弃帧之后,discardingTooLongFrame 被设置为 false,表示不再处于初始状态。此时,tooLongFrameLength 被设置为 this.tooLongFrameLength,即之前丢弃的帧长度。然后 this.tooLongFrameLength 被重置为 0,为下一次可能的丢弃做准备。
false
this.tooLongFrameLength
0
关于您的问题,tooLongFrameLength 没有加上 minFrameLength + minDelimLength 是因为 tooLongFrameLength 应该只跟踪由于帧过长而被丢弃的字节数,不包括帧头的长度。minFrameLength + minDelimLength 是帧的总长度,包括帧头和帧体。在丢弃帧时,您需要跳过整个帧,不仅仅是帧体。
minFrameLength + minDelimLength
如果 tooLongFrameLength 包括了帧头的长度,那么在下一次计算是否丢弃帧时可能会错误地包括帧头的长度,导致逻辑错误。
因此,正确的逻辑是:
buffer.skipBytes(length - minFrameLength + minDelimLength) 跳过整个帧,包括帧头和帧体。
tooLongFrameLength 只跟踪帧体被丢弃的字节数。
this.tooLongFrameLength 重置为 0 为下一次可能的丢弃做准备。
这样可以确保正确地跟踪和处理帧过长的情况,同时避免在下一次处理时错误地包括帧头的长度。
登录后可查看更多问答,登录/注册
解析netty各大组件细节,百万级性能调优,设计模式实际运用
2.3k 6
1.7k 6
1.4k 6
1.3k 5
1.5k 5
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号