| 
                         其源码为: 
- @Override 
 - protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { 
 -  Object decodedecoded = decode(ctx, in); 
 -  if (decoded != null) { 
 -  out.add(decoded); 
 -  } 
 - } 
 - protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { 
 -  // 当前的分割符是否是换行分割符(n或者rn) 
 -  if (lineBasedDecoder != null) { 
 -  return lineBasedDecoder.decode(ctx, buffer); 
 -  } 
 -  // Try all delimiters and choose the delimiter which yields the shortest frame. 
 -  int minFrameLength = Integer.MAX_VALUE; 
 -  ByteBuf minDelim = null; 
 -  // 其他分割符进行一次切分 
 -  for (ByteBuf delim: delimiters) { 
 -  int frameLength = indexOf(buffer, delim); 
 -  if (frameLength >= 0 && frameLength < minFrameLength) { 
 -  minFrameLength = frameLength; 
 -  minDelim = delim; 
 -  } 
 -  } 
 -  // 以下代码省略 
 
  
根据它的名字可以知道,分隔符才是它的核心。它将分割符分成两类,只有换行分割符(n或者rn)和其他。因此,需要注意的是,你可以定义多种分割符,它都是支持的。 
3. LengthFieldBasedFrameDecoder 
该类比较复杂,如果直接看方法容易把自己看混乱,因此我准备结合类上的解释,先看看其私有变量。 
- * BEFORE DECODE (16 bytes) AFTER DECODE (13 bytes) 
 - * +------+--------+------+----------------+ +------+----------------+ 
 - * | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content | 
 - * | 0xCA | 0x0010 | 0xFE | "HELLO, WORLD" | | 0xFE | "HELLO, WORLD" | 
 - * +------+--------+------+----------------+ +------+----------------+ 
 
  
    - lengthFieldOffset :该字段代表 Length  字段是从第几个字节开始的。上面的例子里,Length 字段是从第1个字节开始(HDR1 是第0个字节),因此该值即为0。
 
    - lengthFieldLength:该字段代表 Length 字段所占用的字节数。上面的例子里,Length 字段占用2个字节,因此该值为2。
 
    - lengthAdjustment:该字段代表 Length 字段结束位置到真正的内容开始位置的距离。上面例子里,因为 Length  字段的含义是整个消息(包括 HDR1、Length、HDR2、Actual Content,一般 Length 指的只是 Actual Content),所以  Length 末尾到真正的内容开始位置(HDR1的开始处),相当于减少3个字节,所以是-3。
 
    - initialBytesToStrip: 展示时需要从 Length 字段末尾开始跳过几个字节。上面例子里,因为真正的内容是从 HDR1 开始的,最终展示的内容是从 HDR2  开始的,所以中间差了3个字节,所以该值是3。
 
 
该类的解码方法比较复杂,有兴趣的同学可以试着自己分析一下。 
总结 
这一篇主要是结合 Netty 里的源代码讲解了 Netty 中封装成帧(Framing)的三种方式,相信你一定有了不一样的理解。 
                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |