加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Netty - 粘包和半包(下)

发布时间:2019-10-25 07:46:53 所属栏目:教程 来源:健健壮
导读:接上篇《TCP 粘包和半包 先容及办理(上)》 上一篇先容了粘包和半包及其通用的办理方案,本日重点来看一下 Netty 是怎样实现封装成帧(Framing)方案的。 解码焦点流程 之前先容过三种解码器FixedLengthFrameDecoder、DelimiterBasedFrameDecoder、LengthFiel

其源码为:

  1. @Override 
  2. protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { 
  3.  Object decodedecoded = decode(ctx, in); 
  4.  if (decoded != null) { 
  5.  out.add(decoded); 
  6.  } 
  7. protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { 
  8.  // 当前的支解符是否是换行支解符(n可能rn) 
  9.  if (lineBasedDecoder != null) { 
  10.  return lineBasedDecoder.decode(ctx, buffer); 
  11.  } 
  12.  // Try all delimiters and choose the delimiter which yields the shortest frame. 
  13.  int minFrameLength = Integer.MAX_VALUE; 
  14.  ByteBuf minDelim = null; 
  15.  // 其他支解符举办一次切分 
  16.  for (ByteBuf delim: delimiters) { 
  17.  int frameLength = indexOf(buffer, delim); 
  18.  if (frameLength >= 0 && frameLength < minFrameLength) { 
  19.  minFrameLength = frameLength; 
  20.  minDelim = delim; 
  21.  } 
  22.  } 
  23.  // 以下代码省略 

按照它的名字可以知道,脱离符才是它的焦点。它将支解符分成两类,只有换行支解符(n可能rn)和其他。因此,必要留意的是,你可以界说多种支解符,它都是支持的。

3. LengthFieldBasedFrameDecoder

该类较量伟大,假如直接看要领轻易把本身看紊乱,因此我筹备团结类上的表明,先看看其私有变量。

  1. * BEFORE DECODE (16 bytes) AFTER DECODE (13 bytes) 
  2. * +------+--------+------+----------------+ +------+----------------+ 
  3. * | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content | 
  4. * | 0xCA | 0x0010 | 0xFE | "HELLO, WORLD" | | 0xFE | "HELLO, WORLD" | 
  5. * +------+--------+------+----------------+ +------+----------------+ 
  • 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)的三种方法,信托你必然有了纷歧样的领略。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读