无名 发表于 2022-5-8 19:12:21

【HR】netty中的frame解码器的技术使用


netty中的frame解码器

http://cdn.u1.huluxia.com/g4/M01/E6/4F/rBAAdmJqU5eAcmm4AAA2GPhE2YQ201.jpg


接下来我们来详细介绍一下上面几个frame解码器的使用。

LineBasedFrameDecoder
LineBasedFrameDecoder从名字上看就是按行来进行frame的区分。根据操作系统的不同,换行可以有两种换行符,分别是 "\n" 和 "\r\n" 。

LineBasedFrameDecoder的核心逻辑是先找到行的分隔符的位置,然后根据这个位置读取到对应的frame信息,这里来看一下找到行分隔符的findEndOfLine方法:

    private int findEndOfLine(final ByteBuf buffer) {
      int totalLength = buffer.readableBytes();
      int i = buffer.forEachByte(buffer.readerIndex() + offset, totalLength - offset, ByteProcessor.FIND_LF);
      if (i >= 0) {
            offset = 0;
            if (i > 0 && buffer.getByte(i - 1) == '\r') {
                i--;
            }
      } else {
            offset = totalLength;
      }
      return i;
    }
这里使用了一个ByteBuf的forEachByte对ByteBuf进行遍历。我们要找的字符是:ByteProcessor.FIND_LF。

最后LineBasedFrameDecoder解码之后的对象还是一个ByteBuf。

传入的delimiter是一个ByteBuf,所以delimiter可能不止一个字符。

FixedLengthFrameDecoder也是继承自ByteToMessageDecoder,它的定义很简单,可以传入一个frame的长度:

    public FixedLengthFrameDecoder(int frameLength) {
      checkPositive(frameLength, "frameLength");
      this.frameLength = frameLength;
    }
然后调用ByteBuf的readRetainedSlice方法来读取固定长度的数据:

in.readRetainedSlice(frameLength)
最后将读取到的数据返回。

lengthFieldOffset指定了长度字段的开始位置,lengthFieldLength定义的是长度字段的长度,lengthAdjustment是对lengthFieldLength进行调整,initialBytesToStrip表示是否需要去掉长度字段。

这里4个属性的值是:

   lengthFieldOffset   = 0
   lengthFieldLength   = 2
   lengthAdjustment    = 0
   initialBytesToStrip = 0
表示的是长度字段从0开始,并且长度字段占有两个字节,长度不需要调整,也不需要对字段进行调整。

BEFORE DECODE (16 bytes)                     AFTER DECODE (13 bytes)
   +------+--------+------+----------------+      +------+----------------+
   | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content |
   | 0xCA | 0x000C | 0xFE | "HELLO, WORLD" |      | 0xFE | "HELLO, WORLD" |
   +------+--------+------+----------------+      +------+----------------+
上面的例子中长度字段是从第1个字节开始的(第0个字节是HDR1),长度字段占有2个字节,长度再调整一个字节,最终数据的开始位置就是1+2+1=4,然后再截取前3个字节的数据,得到了最后的结果。

页: [1]
查看完整版本: 【HR】netty中的frame解码器的技术使用