【能用】springboot集成netty,解码器处理数据过长的问题

netty解码器处理数据过长的问题

处理数据过长的详细流程

当第一次 decode 调用时,如果数据不完整,decode 方法会直接返回,Netty 会保留 ByteBuf 中的数据。后续数据到达时,会再次调用 decode 方法,ByteBuf 会累积新到达的数据。
一旦 ByteBuf 中的数据足够完整解析,就会成功解析出 CustomMessage 并添加到 out 列表中,传递给后续的 YourBusinessLogicHandler 进行处理。
这样,通过检查数据的完整性并利用 Netty 的数据累积特性,就可以实现当数据过长时等待全部数据到达后再进行解码操作。你可以根据具体的协议和需求调整 CustomDataDecoder 中的长度检查逻辑,确保对不同长度的数据都能正确处理。
请注意,在实际应用中,可能需要考虑长时间等待数据不到达的情况,可以添加超时机制或其他错误处理机制,以避免资源的无限占用。例如,可以在 ChannelHandlerContext 上使用 channel().close() 关闭连接,或者使用 ctx.fireExceptionCaught() 抛出异常进行异常处理。

解决思路

明确协议格式

确定 dataLen 在数据中的具体位置。假设 dataLen 在 cmdLen 和 cmdPayload 之后,并且 cmdPayload 的长度是由 cmdLen 确定的。
需要先读取 cmdLen,然后读取 cmdPayload,接着根据 cmdPayload 的长度找到 dataLen 的位置。

逐步解析数据

按照协议规定的顺序和长度,逐步从 ByteBuf 中读取相应的数据。

示例代码(Java 和 Netty):

public class TcpMessageDecoderHandler extends ByteToMessageDecoder {private static final Logger logger = LoggerFactory.getLogger(TcpHandleServiceImpl.class);@Overrideprotected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {try {// 检查是否有足够的字节读取 cmdLenif (in.readableBytes() < 2) {// 等待更多数据,因为 cmdLen 占 2 字节return;}// 读取 cmdLen(大端序)int cmdLen = in.readUnsignedShort();// 检查是否有足够的字节读取 cmdPayloadif (in.readableBytes() < cmdLen) {// 数据不完整,重置读指针,等待更多数据in.resetReaderIndex();return;}// 读取 cmdPayloadbyte[] cmdPayload = new byte[cmdLen];in.readBytes(cmdPayload);String cmd = new String(cmdPayload, StandardCharsets.UTF_8);// 检查是否有足够的字节读取 dataLenif (in.readableBytes() < 2) {// 等待更多数据,因为 dataLen 占 2 字节in.resetReaderIndex();return;}// 读取 dataLen(大端序)int dataLen = in.readUnsignedShort();logger.info("可读字节:" + in.readableBytes());// 检查是否有足够的字节读取 dataPayloadif (in.readableBytes() < dataLen) {// 数据不完整,重置读指针,等待更多数据in.resetReaderIndex();return;}// 读取 dataPayloadbyte[] dataPayload = new byte[dataLen];in.readBytes(dataPayload);// 在这里可以将 cmd 和 dataPayload 封装到自定义对象中,例如 CustomMessageTcpMessage tcpMessage = new TcpMessage(cmd, dataPayload);out.add(tcpMessage);} catch (Exception e){logger.error("读取字节流出错:" + e.getMessage());// 重置读指针in.resetReaderIndex();}}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {logger.error("error:" + cause.getMessage());}
}
代码解释

首先检查 ByteBuf 中是否有足够的字节读取 cmdLen,如果不足 2 字节,等待更多数据。
读取 cmdLen,它是 2 字节的大端序数据。
检查是否有足够的字节读取 cmdPayload,如果不足,重置读指针等待更多数据。
读取 cmdPayload 并将其转换为字符串(假设是 UTF-8 编码)。
检查是否有足够的字节读取 dataLen,如果不足,重置读指针等待更多数据。
读取 dataLen,它是 2 字节的大端序数据。
检查是否有足够的字节读取 dataPayload,如果不足,重置读指针等待更多数据。
读取 dataPayload 并存储在字节数组中。
创建 CustomMessage 对象,将 cmd 和 dataPayload 作为成员变量,并将其添加到 out 列表中。

问题

1.如果始终没有接收到足够长度的数据,会卡住

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论&#xff0c;切勿用于违法途径&#xff0c;所有渗透都需获取授权&#xff0c;违者后果自行承担&#xff0c;与本号及作者无关&#xff0c;请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台&#xff01;&#xff0…

Python下载包缓慢时怎么修改镜像源

前言 在使用Python下载第三方包时&#xff0c;有时会比较缓慢&#xff0c;与Linux环境中下载软件一样可以替换软件源一样&#xff0c;Python下载源也可以进行修改&#xff0c;因为总是记不住镜像地址&#xff0c;特此记录一下。 常用镜像 豆瓣镜像&#xff1a; https://pypi.…

df.groupby(pd.Grouper(level=1)).sum()

df.groupby(pd.Grouper(level1)).sum() 在 Python 中的作用是根据 DataFrame 的某一索引级别进行分组&#xff0c;并计算每个分组的总和。具体来说&#xff1a; df.groupby(...)&#xff1a;这是 pandas 的分组操作&#xff0c;按照指定的规则将 DataFrame 分组。 pd.Grouper(…

CentOS修改docker镜像存储位置并进行数据迁移

在 CentOS 上修改 Docker 镜像存储位置并进行数据迁移是一个常见的需求。以下是一个详细的步骤指南&#xff0c;帮助你完成这个任务。 1. 停止 Docker 服务 首先&#xff0c;确保 Docker 服务已经停止&#xff0c;以避免在迁移过程中出现数据损坏。 sudo systemctl stop doc…

node.js之---事件循环机制

事件循环机制 Node.js 事件循环机制&#xff08;Event Loop&#xff09;是其核心特性之一&#xff0c;它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O&#xff0c;使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础&…

基于深度学习的视觉检测小项目(二) 环境和框架搭建

一、环境和框架要求 SAM的环境要求&#xff1a; Python>3.7 PyTorch>1.7 torchvision>0.8 YOLO V8的环境要求&#xff1a;YOLO集成在ultralytics库中&#xff0c;ultralytics库的环境要求&#xff1a; Python>3.7 PyTorch>1.10.0 1、确定pytorch版本…

MySQL 06 章——多表查询

多表查询&#xff0c;也称为关联查询&#xff0c;是指两个表或多个表一起完成查询操作 前提条件&#xff0c;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段的。这个关联字段可能建立了外键&#xff0c;也可能没…

ubuntu初始配置

ubuntu初始配置 vm下ubuntu安装vmtools安装常用工具ubuntu终端美化安装ssh使用apt安装时出现错误解决办法 vm下ubuntu安装vmtools //安装vmtools sudo apt-get install open-vm-tools //桌面组件提供了更好的集成体验&#xff0c;包括拖放文件和共享剪贴板等功能 sudo apt-get…

Web前端基础知识(五)

盒子模型 盒子模型是CSS中一种常用于布局的基本概念。描述了 文档中的每个元素都可以看成是一个矩形的盒子&#xff0c;包含了内容、内边距、文本边距、外边距。 ---------------------------------------------------------------------------------------------------------…

人工智能之机器学习算法

所有的机器学习算法都是要优化的&#xff0c;优化的必要条件是确定优化的目标函数(损失函数)&#xff0c;目标函数是根据实际问题(数据)转成的数学公式。 一.线性回归原理推导 &#xff08;1&#xff09;回归问题概述 在机器学习的有监督算法中&#xff0c;分类与回归二种情…

使用Clion在ubuntu上进行交叉编译,并在Linux上远程编译五子棋

目录 1.工具以及概念介绍 &#xff08;1&#xff09;Clion软件简介 &#xff08;2&#xff09;交叉编译 &#xff08;3&#xff09;远程编译 2.操作原理 3.详细操作步骤 &#xff08;1&#xff09;配置Clion与虚拟机ubuntu的ssh连接 CLion远程开发Ubuntu&#xff0c;并显…

前端访问一个图片URL时,浏览器默认会尝试下载文件而不是直接显示它

当你在前端访问一个图片URL时&#xff0c;浏览器默认会尝试下载文件而不是直接显示它&#xff0c;这通常是由于服务器设置了ContentDisposition: attachment头或者文件本身是一个压缩包或其他格式。为了支持在网页上预览图片&#xff0c;可以使用以下方法&#xff1a; 1. 检查服…

Java(四十四)file

Java中的file类:代表文件或者文件夹(目录)类,也就是说将文件或者文件夹通过File类来封装成对象。 一:常用的构造方法: 使用file类,需要通过构造方法创建一个file对象。 1:public File(String pathname) public static void main(String[] args) {File fl = new File(&…

我的博客年度之旅:感恩、成长与展望

目录 感恩有你 技能满点 新年新征程 嘿&#xff0c;各位技术大佬、数码潮咖还有屏幕前超爱学习的小伙伴们&#xff01;当新年的钟声即将敲响&#xff0c;我们站在时光的交汇点上&#xff0c;回首过往&#xff0c;满心感慨&#xff1b;展望未来&#xff0c;豪情满怀。过去的这…

STM32-笔记22-sg90舵机

一、接线 二、实验实现 动手让 SG90 每秒转动一下&#xff0c;0 -> 20 -> 40 -> 100 -> 180 如此循环。 舵机接A6 复制18-呼吸灯&#xff0c;重命名24-sg90舵机 把PWM重命名sg90 打开项目文件 在魔术棒和品上把PWM都去掉&#xff0c;加载sg90文件夹 加载之后…

【SQL】进阶知识 -- 随机取数的几种方式

在很多数据库开发和数据分析中&#xff0c;我们经常需要从大量数据中随机抽取一定数量的记录。比如&#xff0c;从一个客户表中随机选取4个客户进行抽奖&#xff0c;或者在进行数据分析时&#xff0c;想随机挑选几条数据进行查看。那么&#xff0c;如何在不同的数据库系统中实现…

MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MarkDown 的 mermaid gantt、mermaid sequenceDiagram 语法解析和应用前言mermaid gan…

GO:复用对象和协程资源

避免频繁分配相同类型临时对象的开销 问题 &#xff1a; 不停地创建临时对象&#xff0c;Golang 运行时的哪些操作会消耗 CPU 资源&#xff1f; 1. 首先是内存分配。我们不停地创建对象时&#xff0c;就得不断地在堆里面找空闲的内存块&#xff0c;然后进行分配。这就像是在一个…

大模型理解力探讨:LeCun认为,大模型(LLM)并不真正理解这个世界,尤其是物理世界,它们只是“本能般地吐出一个又一个单词”。而Hinton则持相反观点。

大模型理解力探讨&#xff1a;从LeCun与Hinton的观点看LLM的“理解”本质 关键词&#xff1a; #大模型理解力 Large Model Understanding #LLM Large Language Model #特征交互 Feature Interaction #视频学习 Video Learning #语言学习 Language Learning 具体实例与推演 考…

Pygame - 俄罗斯方块游戏开发教程

本教程将带你一步步制作一个简单的俄罗斯方块游戏&#xff0c;使用Python和pygame库。我们将逐步了解如何创建游戏窗口、实现方块控制、碰撞检测、行消除、计分等功能&#xff0c;最后完成一个基本的俄罗斯方块游戏。 1. 准备工作 首先&#xff0c;你需要确保已安装pygame库。…