netty之粘包拆包bytetomessagedecoder(代码片段)

better_hui better_hui     2022-12-13     608

关键词:

目录

拆包粘包

处理的方式

netty的处理方式

netty实现编码解码

1、cumulator.cumulate() 拼接数据包

2、callDecode() 解析数据包

总结

LengthFieldBasedFrameDecoder


拆包粘包

粘包产生的原因:两个包小于缓存区的大小,传送数据会将两个包都放在缓冲区中一起发送,就会产生粘包的问题。 半包产生的原因:当某一个包的大于缓冲区的大小,会被发送多次,每次就收到的就是一个不完整的数据包。

处理的方式

netty的处理方式

netty实现编码解码

查看ByteToMessageDecoder,该类是解码器的实现类,查看其中的channelRead方法 1.调用了cumulator.cumulate()方法来实现数据包的拼接的操作 2.callDecode()方法解析数据包

1、cumulator.cumulate() 拼接数据包

跟进源码,发现他分为两步: 1.如果是第一个数据包,就直接返回该数据包 2.如果不是第一个数据包,就将最新的数据追加导员来已经接收的数据包内

2、callDecode() 解析数据包

核心实现方法,decodeRemovalReentryProtection就是callDecode中的核心步骤

跟进源码decodeRemovalReentryProtection的源码,其中核心方法是514行的decode方法,但是此方法是一个抽象方法,也就是说ByteToMessageDecoder只是一个模板类,具体的decode方法实现在子类中

于是我们查看ByteToMessageDecoder的一个子类FixedLengthFrameDecoder,FixedLengthFrameDecoder是固定长度的编码解码方式,如果数据不足会补充空格等数据,它的decode方法如下: 1.如果我们接受到的数据小于数据帧限制的长度,那么无法解析数据,直接返回null 2.否则调用readRetainedSlice方法进行解析,readRetainedSlice就是将ByteBuf切出frameLength长度的数据出来

总结

Netty提供了一个ByteToMessageDecoder模板类,数据包的拼接交给该类完成,但是数据包的解析decode是一个抽象方法,具体实现交给子类完成

LengthFieldBasedFrameDecoder

核心就是其中的四个参数: 1.lengthFieldOffset // length字段的偏移量 2.lengthFieldLength // legnth字段所占的长度 3.lengthAdjustment // 可能我们除了实际内容字段以外,还额外增加2个字段的其他信息,lengthAdjustment=2,那么需要读取的数据就是length+2 4.initialBytesToStrip // 我们解析出来的数据是从第几位开始的,如果我们不需要接收length字段,那么initialBytesToStrip=2,解析出来就只有内容部分

netty之粘包拆包bytetomessagedecoder(代码片段)

目录拆包粘包处理的方式netty的处理方式netty实现编码解码1、cumulator.cumulate()拼接数据包2、callDecode()解析数据包总结LengthFieldBasedFrameDecoder拆包粘包粘包产生的原因:两个包小于缓存区的大小,传送数据会将两个包都放在... 查看详情

面试官:什么是netty粘包拆包?怎么解决netty粘包拆包问题

哈喽!大家好,我是小奇,一位热爱分享的程序员小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧文章持续更新一、前言书接上回,昨天肯定是狗蛋通风报信,导致... 查看详情

12.netty中tcp粘包拆包问题及解决方法(代码片段)

...文源代码总结自B站《netty-尚硅谷》;2.本文介绍了tcp粘包拆包问题;3.本文po出了粘包拆包问题解决方案及源代码实现;【1】tcp粘包拆包问题refer2HowtodealwiththeproblemofpacketstickingandunpackingduringTCPtransmission?-编程知识【1.1... 查看详情

12.netty中tcp粘包拆包问题及解决方法(代码片段)

...文源代码总结自B站《netty-尚硅谷》;2.本文介绍了tcp粘包拆包问题;3.本文po出了粘包拆包问题解决方案及源代码实现;【1】tcp粘包拆包问题refer2HowtodealwiththeproblemofpacketstickingandunpackingduringTCPtransmission?-编程知识【1.1... 查看详情

netty之启动类编解码器等源码解析及粘包拆包问题(代码片段)

...析netty的启动类、以及编解码器、各种协议的支持、及tcp粘包拆包的解决Netty引导BootstrapBootStrap是Netty中负责引导服务器和 查看详情

tcp粘包拆包基本解决方案

上个小节我们浅析了在Netty的使用的时候TCP的粘包和拆包的现象,Netty对此问题提供了相对比较丰富的解决方案 Netty提供了几个常用的解码器,帮助我们解决这些问题,其实上述的粘包和拆包的问题,归根结底的解决方案就是... 查看详情

netty是如何解决tcp粘包拆包的?

点击关注公众号,Java干货及时送达作者:rickiyang出处:www.cnblogs.com/rickiyang/p/11074235.html我们都知道TCP是基于字节流的传输协议。那么数据在通信层传播其实就像河水一样并没有明显的分界线,而数据具体表示什么... 查看详情

十二.netty入门到超神系列-tcp粘包拆包处理(代码片段)

...别完整的数据包了(TCP无消息保护边界),可能会出现粘包拆包的问题。粘包拆包理解下面我用一个图来带大家理解什么是粘包和拆包解释一下第一次传输没有问题,数据1和数据2没有粘合,也没有拆分第二次传输,... 查看详情

netty框架之编解码机制一(bytebuf以及tcp粘包拆包)(代码片段)

...解码之前,我们先说一下netty的ByteBuf,以及tcp的粘包和拆包。ne 查看详情

netty框架之编解码机制一(bytebuf以及tcp粘包拆包)(代码片段)

...解码之前,我们先说一下netty的ByteBuf,以及tcp的粘包和拆包。ne 查看详情

什么是粘包和拆包,netty如何解决粘包拆包?(代码片段)

Netty粘包拆包TCP粘包拆包是指发送方发送的若干包数据到接收方接收时粘成一包或某个数据包被拆开接收。如下图所示,client发送了两个数据包D1和D2,但是server端可能会收到如下几种情况的数据。上图中演示了粘包和拆... 查看详情

tcp粘包拆包

一、什么是粘包拆包?粘包拆包是TCP协议传输中一种现象概念。TCP是传输层协议,他传输的是“流”式数据,TCP并不知道传输是哪种业务数据,或者说,并不关心。它只是根据缓冲区状况将数据进行包划分,然后进行传输... 查看详情

tcp粘包拆包

粘包、拆包发生原因:发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充,1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行... 查看详情

netty框架之编解码机制二(自定义协议)(代码片段)

...言自上篇文章Netty框架之编解码机制一(ByteBuf以及Tcp粘包拆包),小编将继续讲解netty中的编解码,以及tcp拆包粘包的解决方案代码实践,希望对大家理解有所帮助。好了话不多说进入正题。拆包粘包的解决方... 查看详情

netty框架之编解码机制二(自定义协议)(代码片段)

...言自上篇文章Netty框架之编解码机制一(ByteBuf以及Tcp粘包拆包),小编将继续讲解netty中的编解码,以及tcp拆包粘包的解决方案代码实践,希望对大家理解有所帮助。好了话不多说进入正题。拆包粘包的解决方... 查看详情

tcp的粘包拆包问题+解决方案

 为什么TCP有而UDP没有粘包❓1️⃣因为udp的数据包有保护边界。2️⃣tcp是以字节流的形式,也就是没有边界,所以应用层的数据在传输层的时候就可能会出现粘包和拆包问题。出现这种问题的原因图解 查看详情

粘包拆包(分包)半包

粘包、拆包、半包理解TCP是一种面向流的网络层传输协议,在使用TCP作为传输层协议时,可保证数据的顺序性和可靠性。应用层在使用TCP协议传输数据时,可采取两种方式:短链接:客户端同服务端完成一次通信(客户端只发送... 查看详情

tcp粘包拆包原因与解决方案

文章目录TCP粘包和拆包问题背景举例说明产生原因解决方案思考:UDP会不会产生粘包问题呢?TCP粘包和拆包问题背景TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP作为传输层协议并不了解... 查看详情