LineBasedFrameDecoder

LineBasedFrameDecoder解码器教程

LineBasedFrameDecoder 是回车换行解码器,它会找接收到的消息里面是否有 \r\n 。如果有就认为这个标识之前的数据就是一段数据。

LineBasedFrameDecoder详解

行编码器,顾名思义就是一行数据一行数据的解析,那么怎么样判断数据就是一行呢?我们计算机键盘敲回车键的时候,字符编码就会识别到 \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,那么后面的数据也会按行的形式展现出来。

LineBasedFrameDecoder总结

如果用户发送的消息都是以回车换行符(以 \r\n 或者直接以 \n 结尾)作为消息结束的标志,我们就可以直接使用 LineBasedFrameDecoder 解码器,不需要重复造轮子。