前言
Netty 自带多个粘包拆包解码器。今天介绍 LineBasedFrameDecoder,换行符解码器。
属性分析
- maxLength (每个完整的包的最大长度)
- failFast (是否快速失败,默认 false)
- discarding (是否进入丢弃模式)
- discardedBytes 丢弃字节数(用于抛出异常时提醒)
- offset 用于优化每次读取效率(bug 就是这里)
- stripDelimiter 是否应该剔除分隔符,默认剔除
decode 方法解析(包括 findEndOfLine())
虽然官方注释标注此解码器为换行符解码器,但我认为这是一个“换行符+最大长度”的一个解码器。
说下此解码器的逻辑:
首先限制单个包的大小,也是说,换行符和换行符之间的数据包的大小是用户配置的。超过最大则抛出异常。
每当有数据到来时,都会遍历缓冲区,找换行符,如果找到了,就返回数据;如果没找到,就记录此次读取到下标 offset,下次继续找。
如果找的过程中,长度超过用户设置的 maxLength,就进入丢弃模式:丢弃之前读取的所有字节,并根据 failFast 的属性决定什么时候抛出异常(如果是 true,则不等找到换行符,就抛出异常,反之,等找到换行符了,才抛出异常,这个异常是可以被用户的 exceptionCaught 方法捕获到的)。
整个流程大概如下图: