如何解决netty自定义协议粘包分包问题

2023-10-29

        又一次发现公司同事用netty竟然都不处理粘包分包的问题,出了问题都不知道怎么回事,呵呵哒。sp厂商反馈数据已推送至我方提供的地址,但未收到我方的应答,正常推送了一次,又重试三次,都没有收到我方应答。

        看了下代码,又跟踪了几条日志,发现sp数据确实有推送,只是我方解析失败。好多数据都是几条信息拼一起过来的,我方只按照头部长度解析了一条,导致许多数据都没有正常更新;还有部分数据是分两次过来的,本来应该放在一起解析一次,我方却解析了两次,自然失败了。

        看了下报文约定,基本是这个样子,头部是总长度+固定的命令+序列号+报文数据。

                在这里插入图片描述

        这种自定义的,我一般使用 ByteToMessageDecoder来处理,要注意结合自定义报文约定,这里主要判定头长度和指定命令。

/**
* 基本长度(4+4+12) 4:总长度 4:命令标识 12:序列号
*/
private static final int BASE_LENGTH = 20;

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
   LOG.info("decode channelId:{}",ctx.channel().id().asShortText());
   if (in.readableBytes() <= BASE_LENGTH) {
       LOG.info("readables:{} channelId:{}",in.readableBytes(),ctx.channel().id().asShortText());
       return;
   }
   int length, command;
   while (true) {
       in.markReaderIndex();
       length = in.readInt();
       command = in.readInt();
       LOG.info("length:{},command:{}, channelId:{}",length,command,ctx.channel().id().asShortText());
       if (length > BASE_LENGTH && command == 0xF) {
           LOG.info("find command:{},channelId:{}",command,ctx.channel().id().asShortText());
           break;
       }
       in.resetReaderIndex();
       byte temp = in.readByte();
       LOG.info("skip a byte:{},channelId:{}",temp,ctx.channel().id().asShortText());

       if (in.readableBytes() <= BASE_LENGTH) {
           LOG.info("length:{} less than 20,channelId:{}",in.readableBytes(),ctx.channel().id().asShortText());
           return;
       }
   }
   in.resetReaderIndex();
   if (in.readableBytes() < length) {
       LOG.info("can read:{} less than length:{},channelId:{}",in.readableBytes(),length,ctx.channel().id().asShortText());
       return;
   }
   byte[] data = new byte[length];
   in.readBytes(data);
   LOG.info("success,length:{} data:{},channelId:{}",length,data,ctx.channel().id().asShortText());
   out.add(data);
}

        比较简单,查看日志数据已经正常处理了,粘包数据会按报文约定分成多条数据处理,分包问题会等到数据到达指定长度时正确处理。netty用起来很简单,但数据还是要小心处理。

https://blog.csdn.net/weixin_43275277/article/details/106737320?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-5-106737320.nonecase

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决netty自定义协议粘包分包问题 的相关文章

  • Error -151 @ 0x0

    CCS出现以下错误提示 Error connecting to the target Error 151 0x0 One of the FTDI driver functions used during the connect return
  • Maven创建module出现Ignored pom.xml文件解决方案

    1 问题描述 在Maven创建module时 没有正确建好module所以把它删掉了 又创建了一个之前删除了的同名的module名称 但是 新创建的module中的pom xml文件出现Ignored pom xml的问题 如图 2 问题分
  • innodb_lock_wait_timeout 参数

    innodb lock wait timeout 参数 innodb lock wait timeout 参数指定了 InnoDB 引擎在等待行级锁或间隙锁的最长时间 以秒为单位 如果一个事务在超过该时间后仍然无法获取锁 那么该事务就会被取
  • upload-labs靶场 11-19关 详细教学 上传漏洞

    第11关 这关采用的防御手法是白名单过滤 只允许上传jpg png和gif类型 并且将上传的文件给重命名为了白名单中的后缀 这里我们用00截断 要求是php版本低于或等于5 3 4 这一关上传目录是可控的 所以可以先上传一个后缀名为 jpg
  • Vue-admin-template结合后端配置动态路由+动态侧边栏

    Vue admin template结合后端配置动态路由 动态菜单 在使用这个vue admin template的时候 发现其官方文档的推荐是使用动静结合的方法去配置动态路由 其官方大致过程就是 此处路由数组为通用跳转路径 意思是不需要权
  • C# 多线程笔记

    多线程 启动线程方式 new Thread Start 启动线程 Task Factory StartNew 启动线程 线程池启动TreadPool QueueUserWorkItem 启动工作线程 BackgroundWorker Run

随机推荐

  • 一款不错的基于WEB技术的文件服务器

    首先 让我感谢朋友ZHANGBIN给介绍的这个程序 一个不错的 只有500KB左右且免安装的小程序 说明 这是一款不错的基于WEB技术的文件服务器 能够使用它进行文件的上传和下载 呵呵 如果是进行一些小文件的INTERNET传输 或是较大文
  • 华为云计算之华为私有云初识

    华为云计算之华为私有云初识 一 huawei cloud stack私有云解决方案 二 华为云Stack功能介绍 三 华为FusionCloud典型部署 四 FusionCloud部署场景 五 双核心组网 Spine BL和SL合并拓扑图
  • MNE-Python工具箱使用raw.plot绘图时遇到问题

    使用MNE Python工具箱进行脑电数据分析时绘图的代码如下所示 import matplotlib import pathlib import mne matplotlib use Qt5Agg 加载原始数据及其路径 raw path
  • github里的默认域_渗透基础——域用户的密码永不过期属性

    0x00 前言 在域环境中 域用户的凭据是十分重要的信息 为了增强安全性 域组策略会设置所有域用户口令的最长有效时间 到达过期时间后强制用户更改口令 在实际环境中 有些域用户需要设置为密码永不过期 这可以通过添加密码永不过期属性来实现 在域
  • Linux系统中Qt程序指定位置加载库文件的四种方式

    这边提供四种方法 方法一 环境变量临时加载 export LD LIBRARY PATH home yjd code mylib 这种方式在终端退出后就会失效 方法二 配置环境变量到当前用户的 profile文件中 在 profile文件末
  • python 爬虫(一) requests+BeautifulSoup 爬取简单网页图片代码示例

    最近学习了Python 借助各个大神的文章 自己写了以下代码 来爬取网页图片 希望可以帮助到大家 工具是 idea coding utf 8 import requests from bs4 import BeautifulSoup imp
  • Linux虚拟机安装及其注意事项!

    Linux虚拟机安装及其注意事项 安装须知 装前必看 一 安装虚拟机 二 安装操作系统 总结 安装须知 装前必看 本次安装为运用VMware workstation虚拟机软件在物理机上进行安装 本次安装为RedHat Enterprise
  • Swift5.0 WKWebView中的JS交互

    好的团队离不开大家的默契合作 在开发中经常遇到H5和移动端合作的业务 在开发中JS交互是非常常见的 小萌现在的主打语言是Swift 所以封装一下Swift版的JS交互 完整代码 在此之前加入协议WKNavigationDelegate WK
  • C# winform流程图(功能超完整附下载链接)

    C winform流程图 功能超完整 工具箱 文件存储打开 画布放大缩小 图元操作 操作步骤 可撤销 图元属性调节 点我下载项目源码 1 工具箱创建图元 矩形 菱形 圆 直线 曲线 其他图形可以自行仿照开发 2 图元有六个操纵柄 四个连接点
  • vs2008编译live555源码

    1解决方案编译方式 1 1简介 Live555 是一个为流媒体提供解决方案的跨平台的C 开源项目 它实现了对标准流媒体传输协议如RTP RTCP RTSP SIP等的支持 Live555实现了对多种音视频编码格式的音视频数据的流化 接收和处
  • cudnn配置

    2019独角兽企业重金招聘Python工程师标准 gt gt gt cudnn cuda config sudo cp cuda include cudnn h usr local cuda include sudo cp cuda lib
  • L2-029 特立独行的幸福

    对一个十进制数的各位数字做一次平方和 称作一次迭代 如果一个十进制数能通过若干次迭代得到 1 就称该数为幸福数 1 是一个幸福数 此外 例如 19 经过 1 次迭代得到 82 2 次迭代后得到 68 3 次迭代后得到 100 最后得到 1
  • 使用python实现自动点击功能

    猜你感兴趣 使用Pyqt5玩转ChatGpt 内网文件共享服务 快速搭建私有pip镜像源 python设计模式 创建型模式 docker搭建私有git服务器 项目备份和迁移 redis持久化方案 被测点击界面 新建counter html添
  • CDH简介及CDH部署、原理和使用介绍( 版本6.3.1 )

    CDH简介及CDH部署 原理和使用介绍 版本6 3 1 第一章 CDH简介 CDH概念 CDH是Cloudera的100 开源平台发行版 包括Apache Hadoop 专为满足企业需求而构建 CDH提供开箱即用的企业使用所需的一切 通过将
  • python 模型 ORM简介

    Django之ORM Object Relational Mapping ORM 一 ORM介绍1 ORM概念 对象关系映射模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 2 ORM由来 让我们从O R开始 字母O起源于
  • 菜狗杯Misc你会异或吗wp

    题目给出提示 神秘数字0x50 下载附件后是一个打不开的png 用010打开看下内容 结合异或和0x50的提示 可以发现0xD9 0x50 0x89 0x00 0x50 0x50 0x1E 0x50 0x4E 所以很明显了文件开头应该恢复成
  • 【AI实战】开源可商用的中英文大语言模型baichuan-7B,从零开始搭建

    AI实战 开源可商用的中英文大语言模型baichuan 7B 从零开始搭建 baichuan 7B 简介 baichuan 7B 中文评测 baichuan 7B 搭建 参考 baichuan 7B 简介 baichuan 7B 是由百川智
  • Linux动态库(一)之同名符号

    万事皆有缘由 还是先从我遇到的这个问题说起 问 有一个主执行程序main 其中实现了函数foo 同时调用动态库liba so中的函数bar 而动态库liba so中也实现了foo 函数 那么在执行的时候如果在bar 中调用foo 会调用到哪
  • TypeScript(单独运行ts、webpack运行ts)

    TypeScript是一门编程语言 完全兼容JavaScript 是JavaScript的超集 引入类型系统 可以尽早的定位错误位置 提升开发效率 全局安装typescript环境 npm i g typescript 检查是否安装成功以及
  • 如何解决netty自定义协议粘包分包问题

    又一次发现公司同事用netty竟然都不处理粘包分包的问题 出了问题都不知道怎么回事 呵呵哒 sp厂商反馈数据已推送至我方提供的地址 但未收到我方的应答 正常推送了一次 又重试三次 都没有收到我方应答 看了下代码 又跟踪了几条日志 发现sp数