Netty -- 拆包粘包 -- LengthFieldBasedFrameDecoder

1、参数说明

new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4)

1024: 发送的数据包最大长度
0:    长度域位于整个数据包字节数组中的下标
4:    长度域的自己的字节数长度
0:    长度域的偏移量矫正
4:    丢弃的起始字节数

偏移量矫正计算方法:
包长 - 长度域的值 – 长度域偏移 – 长度域长

1、场景1

  数据长度(单纯数据内容长度) +  数据内容

String str = "QUERY TIME ORDER" + i + "$_$";
byte[] bytes = str.getBytes("UTF-8");
ByteBuf message = Unpooled.buffer();

message.writeInt(bytes.length);
message.writeBytes(bytes);
ctx.writeAndFlush(message);
new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4)
长度域下标0,长度域字节4,偏移量0,丢弃字节数4

偏移量矫正计算方法:
包长 - 长度域的值 – 长度域偏移 – 长度域长

偏移量矫正计算,假设长度域值为 N
N+4 - N - 0 - 4 = 0;

2、场景2

  数据长度(包含数据长度本身) +  数据内容

String str = "QUERY TIME ORDER" + i + "$_$";
byte[] bytes = str.getBytes("UTF-8");
ByteBuf message = Unpooled.buffer();

message.writeInt(bytes.length+4);
message.writeBytes(bytes);
ctx.writeAndFlush(message);
new LengthFieldBasedFrameDecoder(1024, 0, 4, -4, 4)
长度域下标0,长度域字节4,偏移量-4,丢弃字节数4

偏移量矫正计算方法:
包长 - 长度域的值 – 长度域偏移 – 长度域长

偏移量矫正计算,假设长度域值为 N
N - N - 0 - 4 = -4;

3、场景3

  头信息 + 数据长度(单纯数据内容长度)+ 数据内容

String str = "QUERY TIME ORDER" + i + "$_$";
byte[] bytes = str.getBytes("UTF-8");
ByteBuf message = Unpooled.buffer();

message.writeInt(10);

message.writeInt(bytes.length);
message.writeBytes(bytes);
ctx.writeAndFlush(message);
new LengthFieldBasedFrameDecoder(1024, 4, 4, 0, 8)
长度域下标4,长度域字节4,偏移量0,丢弃字节数8

偏移量矫正计算方法:
包长 - 长度域的值 – 长度域偏移 – 长度域长

偏移量矫正计算,假设长度域值为 N
N+8 - N - 4 - 4 = 0;

4、场景4

  数据长度(单纯数据内容长度)+ 头信息 + 数据内容

String str = "QUERY TIME ORDER" + i + "$_$";
byte[] bytes = str.getBytes("UTF-8");
ByteBuf message = Unpooled.buffer();

message.writeInt(bytes.length);
message.writeInt(10);
message.writeBytes(bytes);
ctx.writeAndFlush(message);
new LengthFieldBasedFrameDecoder(1024, 0, 4, 4, 8)
长度域下标0,长度域字节4,偏移量4,丢弃字节数8

偏移量矫正计算方法:
包长 - 长度域的值 – 长度域偏移 – 长度域长

偏移量矫正计算,假设长度域值为 N
N+8 - N - 0 - 4 = 4;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值