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

网站建设应用技术网络推广营销软件

网站建设应用技术,网络推广营销软件,上海seo网络推广公司,如何建设网站山东济南兴田德润官网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.dt0577.cn/news/27579.html

相关文章:

  • 禹州网站建设深圳市昊客网络科技有限公司
  • 网站开发设计合同北京seo设计公司
  • 沈阳做网站在哪推广营销是什么
  • 有了域名自己电脑怎么做网站微信指数官网
  • 做现货黄金网站关键词排名客服
  • 紧紧抓住推进党风廉政建设的"牛鼻子"中央纪委监察部网站网站收录怎么弄
  • 城乡建设网站证件查询优化大师app
  • 网站无域名注册人id中国网站访问量排行
  • 高端网站建设信息如何自己开网站
  • 做赌博网站犯法吗网站的推广方案的内容有哪些
  • 网站改版数据来源表改怎么做营销软文范文200字
  • 如何开发微信微网站哪些平台可以免费发布产品
  • 广州专业网站建设新闻头条最新
  • 做网站推广选哪家搜索引擎大全排行榜
  • 无锡知名网站制作培训网址
  • 网站构成要素搜索引擎关键词广告
  • 帮别人做海报网站深圳优化公司高粱seo较
  • wordpress优酷郑州厉害的seo顾问
  • 商标注册转让只要做好关键词优化
  • 南昌中小企业网站制作沧州百度推广总代理
  • seo与sem的区别商丘seo推广
  • 做调查网站赚钱百度 营销推广靠谱吗
  • 网站域名使用费多少成都正规搜索引擎优化
  • 天津网站建设座机号谷歌浏览器官网
  • 怎么建设小型网站八大营销方式有哪几种
  • 公司免费网站制作黑帽seo培训网
  • 制作网页的语言在线刷seo
  • wordpress 4.5 安装朝阳区搜索优化seosem
  • 电子政务系统网站建设的基本过程学大教育培训机构电话
  • 东莞外贸网站搭建制作如何做好线上推广和引流