浅谈netty粘包/拆包(LengthFieldBasedFrameDecoder)

1、什么是粘包/拆包

       一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的消息数据,所以就会引发一次接收的数据无法满足消息的需要,导致粘包的存在。处理粘包的唯一方法就是制定应用层的数据通讯协议,通过协议来规范现有接收的数据是否满足消息数据的需要。

  Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果

  Netty有两个线程池,bossGroup和workGroup,bossGroup主要是处理TCP连接,workGroup处理io事件。

  在监听一个端口的情况下,一个NioEventLoop通过一个NioServerSocketChannel监听端口,处理TCP连接。后端多个工作线程NioEventLoop处理IO事件。每个Channel绑定一个NioEventLoop线程,1个NioEventLoop线程关联一个selector来为多个注册到它的Channel监听IO就绪事件。NioEventLoop是单线程执行,保证Channel的pipline在单线程中执行,保证了ChannelHandler的执行顺序。

下面这张图来之http://blog.csdn.net/xiaolang85/article/details/37873059, 基本能说清楚。


2、使用LengthFieldBasedFrameDecoder进行拆包,主要是以下四个参数

        lengthFieldOffset = 0;// 长度域的偏移量
  lengthFieldLength = 2;// 记录该帧数据长度的字段本身的长度
  lengthAdjustment = -2;// 该字段加长度字段等于数据帧的长度
  initialBytesToStrip = 0;// 从数据帧中跳过的字节数

怎么在没有达到一个完整包数据时去除非法数据,可以通过重写LengthFieldBasedFrameDecoder类,通过消息头部特殊属性来过滤。

猜你喜欢

转载自www.cnblogs.com/fypy/p/10112947.html