当前位置: 首页 > news >正文

本溪网站开发公司电话百度搜索app免费下载

本溪网站开发公司电话,百度搜索app免费下载,台州手机端建站模板,网站建设 流程Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8:ByteBuf使用介绍 Netty笔记9:粘包半包 Netty笔记10:LengthFieldBasedFrameDec…

Netty笔记1:线程模型

Netty笔记2:零拷贝

Netty笔记3:NIO编程

Netty笔记4:Epoll

Netty笔记5:Netty开发实例

Netty笔记6:Netty组件

Netty笔记7:ChannelPromise通知处理

Netty笔记8:ByteBuf使用介绍

Netty笔记9:粘包半包

Netty笔记10:LengthFieldBasedFrameDecoder

Netty笔记11:编解码器

Netty笔记12:模拟Web服务器

Netty笔记13:序列化

文章目录

  • 前言
  • 什么是`LengthFieldBasedFrameDecoder`
  • 理论
  • 实践验证
    • 粘包
    • 半包
  • 补充

前言

本部只是LengthFieldBasedFrameDecoder的理论总结,和理论验证。

什么是LengthFieldBasedFrameDecoder

LengthFieldBasedFrameDecoder处理基于长度字段的协议。它能够根据数据包中的长度字段来解析数据流,并将数据流分割成独立的帧;

因其能对数据包边界的识别,而应用于粘包和半包的处理;

理论

应用层协议都是基于TCP/IP进行开发的,传输数据时就会有协议特征,就是数据头,它不作为我们真正的有效数据;

那么在解码时,需要考虑,数据包长度,数据头长度,和数据体长度;

public LengthFieldBasedFrameDecoder(// 允许的最大数据长度(以字节为单位),就是你的一个数据最大多大,超过报异常int maxFrameLength,// 长度字段的开始索引下标int lengthFieldOffset, // 长度字段占用的字节数int lengthFieldLength,// 长度字段之后,开始读取的索引下标偏移量int lengthAdjustment, // 接收到的发送数据包,丢弃多少位int initialBytesToStrip) {

lengthFieldOffset、lengthFieldLength:这两个字段很好理解,就是解码器,要确定读取多少字节长度的数据,就必须先读取我们指定的长度字段,那么这两个字段就可以确定从哪一个索引下标开始,读取多少字节,以此来获取数据长度(底层读取方式:ByteBuf.getUnsignedInt(lengthFieldOffset));

lengthAdjustment:就是待读取数据的开始索引下标与长度字段结束索引的差值(带读取数据的开始索引 - 长度字段结束索引),或者是以长度字段结束索引为坐标0点,待读取数据的开始索引到0点的距离(左负右正);

那么,怎么判断待读取的开始位置?

从数据结构右边的尾部,向左移动长度字段值的位置就是开始索引位置,如长度字段(length)值是33,那么,从右边尾部向左移动33个索引位置就是开始位置,也或是看长度字段包含了哪些部分(长度字段包发的部分应是连续的数据块);

假设协议如下:

| header | length  | header | 数据体1		  4         8        x长度如上:448x(未知)

画出坐标如下:

image-20240706220345137

取值规则如下:

length值:数据体长度

image-20240706221403046

取值:

lengthFieldOffset=4 -> 长度字段开始索引下标
lengthFieldLength=4 -> 长度字段长度
lengthAdjustment=8 -> 长度字段与待读取数据的开始索引差值

length值:包含8字节的header,数据体

image-20240706221432597

lengthFieldOffset=4 -> 长度字段开始索引下标
lengthFieldLength=4 -> 长度字段长度
lengthAdjustment=0 -> 长度字段与待读取数据的开始索引差值

length值:包含本身长度,以及8字节的header,数据体

image-20240706221600356

lengthFieldOffset=4 -> 长度字段开始索引下标
lengthFieldLength=4 -> 长度字段长度
lengthAdjustment=-4 -> 长度字段与待读取数据的开始索引差值

length值:包含1字节的header,本身长度,以及8字节的header

image-20240706221652625

lengthFieldOffset=4 -> 长度字段开始索引下标
lengthFieldLength=4 -> 长度字段长度
lengthAdjustment=-5 -> 长度字段与待读取数据的开始索引差值

感觉画图不够清晰,下面是文字版的:

| header | length  | header | 数据体1		  4         8        x长度如上:4,4,8,x(未知)length值:数据体长度
| header | length  | header | 数据体1		  4         8        x^        ^|        |0        从这开始读
则:
lengthFieldOffset=4  -> 长度字段开始索引下标
lengthFieldLength=4  -> 长度字段长度
lengthAdjustment=8   -> 长度字段与待读取数据的开始索引差值length值:包含8字节的header,数据体| header | length  | header | 数据体1		  4         8        x^        |        0 从这开始读lengthFieldOffset=4  -> 长度字段开始索引下标
lengthFieldLength=4  -> 长度字段长度
lengthAdjustment=0   -> 长度字段与待读取数据的开始索引差值length值:包含本身长度,以及8字节的header,数据体| header | length  | header | 数据体1		  4         8        x^		   ^        |		   |        从这开始读	0 lengthFieldOffset=4  -> 长度字段开始索引下标
lengthFieldLength=4  -> 长度字段长度
lengthAdjustment=-4  -> 长度字段与待读取数据的开始索引差值length值:包含1字节的header,本身长度,以及8字节的header| header | length  | header | 数据体1		  4         8        x
^   	 		   ^        
|    	 		   |        
从这开始读    		0 lengthFieldOffset=4  -> 长度字段开始索引下标
lengthFieldLength=4  -> 长度字段长度
lengthAdjustment=-5  -> 长度字段与待读取数据的开始索引差值

实践验证

LengthFieldBasedFrameDecoder要做数据流解析验证用的,所以放在第一个,待它根据我们指定的规则解析数据流后,将独立的帧(数据头、长度字段、数据体等)作为一个完整的数据包传给下一个handler

粘包

步骤:

  1. 创建一个MessageToByteEncoder,消息写入时,将消息组装各部分帧:长度字段,数据头,和数据体;

  2. 客户端发送多次数据,或者一次将多个消息数据合并为一个ByteBuf发送(模拟粘包);

  3. 服务端第一个添加LengthFieldBasedFrameDecoder,第二个添加我们自定义的handler用来获取数据和判断读取次数;

  4. 出站handler,连续写入两个数据包,但只发送一次

    public class MBHandler extends MessageToByteEncoder<UserInfo> {private static final long serializable = 123456789;private static final int type = 1;@Overrideprotected void encode(ChannelHandlerContext ctx,
http://www.hkea.cn/news/606130/

相关文章:

  • 中国建设承包商网站创建软件平台该怎么做
  • 中小企业网站建设费用海外推广服务
  • 企业名称的英文做网站名seo是怎么优化推广的
  • 手机在线建站西安seo服务公司
  • 网站开发有前途吗我也要投放广告
  • 备案 网站名称怎么写crm软件
  • 扁平式网站模板b2b网站推广优化
  • 做外贸网站网络营销咨询服务
  • 江门网站建设方案报价淘宝seo优化怎么做
  • 盘龙城做网站推广网站推广
  • 如何做电子书网站域名站长工具
  • 物联网平台有哪些排名优化外包公司
  • 秦皇岛汽车网站制作数字营销工具
  • 培训教育的网站怎么做东莞做网站的联系电话
  • 云南做网站的公司外贸谷歌优化
  • 网页设计学徒培训可试学巢湖seo推广
  • 让顾客心动的句子seo模拟点击软件源码
  • 设计类专业包括哪些kj6699的seo综合查询
  • 手机网站制作哪家好查关键词
  • 米拓企业网站管理系统电商培训机构排名前十
  • 做效果图有哪些网站seo点击排名
  • 网络营销推广网站收录seo推广排名平台有哪些
  • 产品经理如何看待网站开发广州软件系统开发seo推广
  • wordpress 忘记管理员如何做网站seo
  • app和网站哪个有优势淘宝关键词排名
  • wordpress该域名宁波网站seo公司
  • 建购物网站怎么建呀简单的网站建设
  • 江苏省建设教育协会网站首页百度知道合伙人答题兼职入口
  • 做优化的网站平台搭建
  • 做网站需要多久网络推广是什么专业