SocketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024);
SocketChannel.pipeline().addLast(new StringDecoder());
LineBaseFrameDecoder的工作原理是它依次遍历ByteBuf中的可读字节,判断看是否有"\n"或者"\r\n",如果有,就以此位置为结束位置,从可读索引到结束位置区间的字节就组成了一行。它是以换行符为结束标志的解码器,支持携带结束符或者不携带结束符两种解码方式,同时支持配置单行的最大长度。如果连续取到最大长度后仍然没有发现换行符,就会抛出异常,同时忽略掉之前读到的异常码流。
StringDecoder的功能非常简单,就是将接受到的对象转换成字符串,然后继续调用后面的Handler。
LineBasedFrameDecoder+StringDecoder的组合就是按行切换的文本解码器,它被设计用来支持TCP的粘包和拆包。
Netty提供了多种支持TCP粘包/拆包的解码器,用来满足用户不同的诉求。