首页 > 其他分享 >netty 使用ByteToMessage解决半包粘包

netty 使用ByteToMessage解决半包粘包

时间:2022-10-28 16:35:09浏览次数:51  
标签:netty ByteToMessage 报文 offset 粘包 长度 半包

其实netty所有自带的decoder内置类都是继承与ByteToMessage的。

我们想要自定义自己的decoder就继承ByteToMessgae类就可以了。

前提:一般发送报文 报文中都会有数据的长度,或者规定了开头和结尾为特殊字符。

首先我们要知道netty发送和接收报文,都是事件驱动的,然后报文会读取到内核内存,后面再读取到用户内存,成为java可用的用户态。

在这个读取过程中,可能就会出现半包和粘包。

我们可以通过报文获取应该有的数据长度

 1 int len = in.writerIndex();//获取写入byteBuf的报文长度
 2 offset = //数据长度的位置,这个是协议中规定好的
 3 if (len > 最大报文长度) {
 4     in.skipByte() //如果超过最大报文长度还没找到数据位,就是垃圾报文
 5     return null;
 6 }
 7 if (len < offset) {
 8     in.resetReaderIndex();//重置读报文位置
 9     return null;
10 }        
11 if (offset < 0) {
12        ctx.close(); //异常数据 停止连接
13    }
14 
15 if (offset > in.readableBytes()) {
16      in.resetReaderIndex(); //没有到达数据位说的报文长度 重置读报文位置
17      return;
18 }
19 
20 //后面就可以写数据处理了
21 //如果分析完数据长度还有剩余的报文 会自动累计到下一次的 所有不用怕粘包

 

标签:netty,ByteToMessage,报文,offset,粘包,长度,半包
From: https://www.cnblogs.com/fromzore/p/16836414.html

相关文章

  • Netty入门
    NettyChannelEvent某一事件ChannelPipeline管道、传输途径。控制ChannelEvent事件传递和分发ChannelHandler站点处理业务逻辑Channel协调总部门EventLoopGroup......
  • Netty介绍、BIO与NIO基础知识
    第1章Netty介绍和应用场景1.1Netty介绍Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty是一个异步的、基于事件驱动的网络应用框架,用以快速开......
  • Netty进阶-黏包半包分析
    Netty进阶1、黏包服务端//测试黏包服务端@Slf4jpublicclassTestNianbaoServer{publicstaticvoidmain(String[]args){NioEventLoopGroupboss=......
  • Netty进阶-黏包半包解决方案
    4、解决方案4.1、短连接以解决黏包为例。服务端同上,客户端如下//短连接处理黏包,发送后关闭publicclassTestSloveNianbaoClient{publicstaticvoidmain(Strin......
  • Netty进阶-协议
    5.1、Redis协议//redis协议测试publicclassTestRedis{publicstaticvoidmain(String[]args){finalbyte[]line={13,10};NioEventLoop......
  • Netty入门-ButeBuf
    3.5、ByteBuf3.5.1、创建//结果:初始容量256,扩容到512//PooledUnsafeDirectByteBuf(ridx:0,widx:0,cap:256)//PooledUnsafeDirectByteBuf(ridx:0,widx:300,cap......
  • Netty入门-Future & Promise
    3.3、Future&PromiseNetty中的Future与Jdk中Future同名,但是是两个接口,继承关系:Promise---extends-->Future(Netty)-----extend--->Future(JDK)区别:jdkFuture只能......
  • Netty入门-Handler & Pipeline
    3.4、Handler&PipelineChannelHandler用来处理Channel上的各种事件,分为入站、出站两种。所有ChannelHandler被连成一串,就是Pipeline入站处理器通常是ChannelIn......
  • Netty入门-Hello World
    Netty入门1、Netty优势NettyVSNIO,工作量大,bug多需要自己构建协议解决TCP传输问题,如黏包,半包epoll空轮询导致cpu100%对API进行增强,ThreadLocal-->FastThreadLocal......
  • Netty Reactor模型
      1、netty抽象出两个线程池:BossGroup负责监听和建立连接;WorkerGroup负责网络IO的读写2、BossGroup和WorkerGroup类型都是NioEventLoopGroup,相当于一个事件......