LineBasedFrameDecoder 是回车换行解码器,它会找接收到的消息里面是否有 \r\n
。如果有就认为这个标识之前的数据就是一段数据。
行编码器,顾名思义就是一行数据一行数据的解析,那么怎么样判断数据就是一行呢?我们计算机键盘敲回车键的时候,字符编码就会识别到 \r
而用户数据在换行的时候识别到 \n
。所以 LineBasedFrameDecoder 的工作原理是它依次遍历 ByteBuf 中的可读字节,判断是有有 \n
或者 \r\n
,如果有,就以此位置为结束位置,从可以读的索引到结束位置区间的字节就组成一行数据。
LineBasedFrameDecoder 支持携带结束符或者不携带结束符两种解码方式,不携结束符就是识别 \r\n
或者 \n
。也支持配置单行的最大程度。如果连续读取到最大长度后仍然没有发现换行符,就会抛出异常,并且把之前读取到的数据丢弃,防止数据积压,引起系统内存溢出。
如果我们定义回车换行解码器,那么有如下效果:
解码前:
接收到的数据:
“Hello Haicoder,I am your fans.\r\n 改天喝一杯”
解码后:
解码后得到的数据:
“Hello Haicoder,I am your fans.”
我们可以看到,由于识别到了 \r\n
,所以它只会读取到该换行之前到数据,如果后面再有 \r\n
或者 \n
,那么后面的数据也会按行的形式展现出来。
如果用户发送的消息都是以回车换行符(以 \r\n
或者直接以 \n
结尾)作为消息结束的标志,我们就可以直接使用 LineBasedFrameDecoder 解码器,不需要重复造轮子。