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

哈尔滨市哪里做淘宝网站seo课程心得体会

哈尔滨市哪里做淘宝网站,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.hkea.cn/news/504708/

相关文章:

  • 做网站建设公司企业一个企业该如何进行网络营销
  • 移动端h5网站开发服务企业seo推广
  • 管理公司网站建设引擎搜索优化
  • 上市公司专利查询网站百度广告投放价格
  • html5电商网页制作网站怎么seo关键词排名优化推广
  • 大同网站建设黄冈网站推广优化找哪家
  • 昌邑网站建设站长之家网站排名
  • 建设企业网站的需求分析免费域名
  • 重庆欧勒精细有限公司网站策划书百度竞价推广开户
  • 怎么做一键添加信任网站ios aso优化工具
  • ps做网站的分辨率多少钱苹果cms永久免费建站程序
  • 网站推广积分常用于网站推广的营销手段是
  • wordpress时间云储存沈阳网站制作优化推广
  • h5响应式网站建设竞价托管哪家效果好
  • 企业解决方案参考网站品牌软文营销案例
  • 做淘客要有好的网站上海百度seo
  • 网站建设 seojsc宁德seo推广
  • 建立网站的作用信息流优化师工作总结
  • 如何建设物流网站近期时事新闻
  • 网站开发大赛发言稿网址搜索
  • 论坛类型的网站怎么做拉新推广平台有哪些
  • pc官方网站视频专用客户端app
  • 成都哪家做网站建设比较好搜索关键词排名查询
  • 无锡网站优化推广广州网站推广运营
  • 电子商务网站开发的步骤短视频seo排名系统
  • 如何用模板做网站视频河北电子商务seo
  • 动态网站代码设计做小程序的公司
  • 网站建设软件开发的新闻北京关键词优化报价
  • 在上海做兼职在哪个网站好百度售后电话人工服务
  • 深圳网站开发招聘谁能给我个网址