文章目录
  1. 1. LineBasedFrameDecoder详解
  2. 2. StringDecoderr详解

LineBasedFrameDecoder详解

LineBasedFrameDecoder的工作原理是依次遍历ByteBuf中的可读字节,判断是否有“\n”或者“\r\n”,如果有就以此为结束为止,从可读索引到结束位置区间的字节组成了一行。它是以换行符为结束标志的解码器,支持携带结束符或者不携带结束符两种解码方式,同时支持单行的最大长度。如果连续读取到最大长度后仍然没有发现换行符,就回抛出异常,同时忽略掉之前读到的异常码流。

关键实现代码:

  private static int findEndOfLine(final ByteBuf buffer) {
    final int n = buffer.writerIndex();
    for (int i = buffer.readerIndex(); i < n; i ++) {
        final byte b = buffer.getByte(i);
        if (b == '\n') {
            return i;
        } else if (b == '\r' && i < n - 1 && buffer.getByte(i + 1) == '\n') {
            return i;  // \r\n
        }
    }
    return -1;  // Not found.
}

StringDecoderr详解

StringDecoder的功能非常简单,就是将接收到的对象转换成字符串,然后继续调用后面的handler。

关键代码:

   public String toString(int index, int length, Charset charset) {
    if (length == 0) {
        return "";
    }

    ByteBuffer nioBuffer;
    if (nioBufferCount() == 1) {
        nioBuffer = nioBuffer(index, length);
    } else {
        nioBuffer = ByteBuffer.allocate(length);
        getBytes(index, nioBuffer);
        nioBuffer.flip();
    }

    return ByteBufUtil.decodeString(nioBuffer, charset);
}
文章目录
  1. 1. LineBasedFrameDecoder详解
  2. 2. StringDecoderr详解