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

netty解码器LengthFieldBasedFrameDecoder用法详解

Netty

Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。
在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和workerGroup。bossGroup负责接收客户端的连接请求,并将这些连接分配给workerGroup中的工作线程进行处理。每个工作线程都是一个独立的EventLoop,它负责处理分配给它的连接上的所有I/O事件。
由于Netty的EventLoop是非阻塞的,并且每个EventLoop都可以同时处理多个连接,因此Netty服务器能够高效地处理大量的并发连接。此外,Netty还提供了多种优化技术,如零拷贝、内存池等,以进一步提高性能。
基于Netty的TCP服务器是支持并发的,并且能够处理大量的并发连接。可以根据需要调整EventLoopGroup的线程数、优化处理器逻辑等,以满足应用程序的特定需求。

LengthFieldBasedFrameDecoder用法详解

以LengthFieldBasedFrameDecoder(1024, 0, 2, 0, 2)为例。

LengthFieldBasedFrameDecoder语法
LengthFieldBasedFrameDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip)
maxFrameLength

该参数表示允许的最大帧长度,在这里设置为 1024 字节。如果接收到的帧长度超过这个值,Netty 会抛出 TooLongFrameException 异常,以防止内存溢出或恶意攻击。

lengthFieldOffset

表示长度字段的偏移量,这里是 0。它指定了长度字段开始的位置,从帧的起始位置开始计算。例如,如果你的帧结构是 [长度字段][数据],长度字段就在帧的开头,那么偏移量就是 0。

lengthFieldLength

表示长度字段的长度,这里是 2 字节。这意味着长度字段占用 2 个字节。例如,如果长度字段的值是 0x000A(十六进制),则表示后续的数据长度是 10 字节。

lengthAdjustment

表示长度调整值,这里是 0。它用于在计算帧长度时对长度字段进行调整。例如,如果长度字段表示的是长度字段之后的数据长度,那么长度调整值为 0。但如果长度字段包含了长度字段本身,那么长度调整值可能为负数,以排除长度字段的长度。

initialBytesToStrip

表示从解码帧中要跳过的初始字节数,这里是 2。它指定了在解码后从帧的起始位置跳过的字节数。如果该值为 2,那么长度字段将被跳过,解码后的帧将不包含长度字段。

举例说明
协议数据格式
字段长度说明
cmdLen2json长度(高位优先)
cmdPayloadnjson内容
dataLen2数据长度(高位优先)
dataPayloadn文件二进制数据内容

假设有以下两种不同的帧结构:

示例一

帧结构:[长度字段 (2 字节)][数据]
例如,一个完整的帧可能是 0x000A 48656C6C6F(十六进制)。
解释:
0x000A 是长度字段,表示后续的数据长度为 10 字节(十六进制的 0x000A 等于十进制的 10)。
48656C6C6F 是数据部分,它是 Hello 的 ASCII 码表示。
在这种情况下,LengthFieldBasedFrameDecoder(1024, 0, 2, 0, 2) 的工作流程如下:
当接收到 0x000A 48656C6C6F 时:
首先,根据 lengthFieldOffset = 0 和 lengthFieldLength = 2,读取前 2 个字节 0x000A 作为长度字段。
然后,根据 lengthAdjustment = 0,不进行长度调整。
最后,根据 initialBytesToStrip = 2,将长度字段 0x000A 从解码结果中去掉,将 48656C6C6F 作为最终解码的数据。

示例二

帧结构:[数据][长度字段 (2 字节)]
例如,一个完整的帧可能是 48656C6C6F 0x000A(十六进制)。
解释:
48656C6C6F 是数据部分,它是 Hello 的 ASCII 码表示。
0x000A 是长度字段,表示数据部分的长度为 10 字节。
在这种情况下,LengthFieldBasedFrameDecoder(1024, 4, 2, -2, 0) 可能更合适:
当接收到 48656C6C6F 0x000A 时:
lengthFieldOffset = 4 表示长度字段从第 4 个字节开始。
lengthFieldLength = 2 表示长度字段长度为 2 字节。
lengthAdjustment = -2 表示长度字段包含自身,需要从长度中减去长度字段的长度,因为长度字段在数据之后。
initialBytesToStrip = 0 表示不跳过任何字节,最终解码结果将包含长度字段。

代码示例

相关文章:

netty解码器LengthFieldBasedFrameDecoder用法详解

Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…...

在循环链表中用头指针和用尾指针的好处

循环链表是一种特殊的链表结构,其中最后一个节点的指针指向链表的头部,形成一个环。这种结构在某些情况下可以提供便利,特别是在需要循环访问元素或者实现循环队列时。使用头指针和尾指针来操作循环链表各有其优势: 使用头指针的…...

java项目之网上租贸系统源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的网上租贸系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于Spring Boot的网上租贸…...

我用AI学Android Jetpack Compose之入门篇(3)

前一篇解释了代码,这一篇来解释脚本,gradle, compose脚本也推荐kotlin的,让Ai解释一下吧,以下答案来自 通义千问 1.解释一下下述脚本 这段代码是一个Gradle构建脚本的顶层配置文件,通常位于项目的根目录下…...

get和post有什么区别

GET和POST是HTTP协议中两种常用的请求方法,它们在用途、参数传递方式、缓存处理、安全性等方面存在显著差异。 以下是对GET和POST区别的详细讲解,并给出示例演示。 一、GET和POST的区别 用途 GET:主要用于获取信息,即进行查询操…...

编排式 Saga 模式

编排式 Saga 模式(Orchestrated Saga)是指由一个中央协调者(Orchestrator)控制多个服务间的事务执行。与协作式 Saga 模式不同,编排式 Saga 模式不依赖于事件驱动,而是通过协调者来控制整个 Saga 流程的执行…...

QT 下拉菜单设置参数 起始端口/结束端口/线程数量 端口扫描4

上篇文章QT实现 端口扫描暂停和继续功能 3-CSDN博客 双击 添加对话框类 界面设计 由于主体代码已经写完,只需要更改参数的获取即可 获取起始端口结束端口的输入 槽函数 给主界面类添加调用对话框类的功能 实现功能:点击菜单项可以弹出对话框窗体 增加槽…...

缓存-Redis-常见问题-缓存击穿-永不过期+逻辑过期(全面 易理解)

缓存击穿(Cache Breakdown) 是在高并发场景下,当某个热点数据在缓存中失效或不存在时,瞬间大量请求同时击中数据库,导致数据库压力骤增甚至崩溃的现象。为了解决这一问题,“永不过期” “逻辑过期” 的策略…...

137. 只出现一次的数字 II

137. 只出现一次的数字 II 题目-中等难度1. 位运算2. 位运算 题目-中等难度 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数…...

【力扣热题100】—— Day18.将有序数组转换为二叉搜索树

期末考试完毕,假期学习开始! —— 25.1.7 108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵平衡二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] …...

PyTorch 官方文档 中文版本

文档来源 https://pytorch.cadn.net.cn 大多数机器学习工作流都涉及处理数据、创建模型、优化模型 参数,并保存经过训练的模型。本教程向您介绍完整的 ML 工作流 在 PyTorch 中实现,并提供了用于了解有关每个概念的更多信息的链接。 我们将使用 Fashion…...

电力智能问答RAG: 多问题生成、思维链提示生成;混合编码和重排序策略

电力智能问答RAG 目录 电力智能问答RAG文档转换、元信息抽取与增强及文档解析模块多问题生成、思维链提示生成和指令微调数据集构建模块混合编码和重排序策略文档转换、元信息抽取与增强及文档解析模块 在电力领域的知识处理中,文档转换、元信息抽取与增强及文档解析模块发挥…...

C#高级:递归4-根据一颗树递归生成数据列表

一、目的 该程序展示了如何将树形结构的数据(例如家庭成员信息)转化为一维列表形式,以便于存储、展示或操作。 二、流程思路 创建树:首先通过 GetDemoTree 创建一个简单的家庭树,树的根节点是“爸爸”,然…...

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件,它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能,PDFelement Pro 提供了丰富的编辑功能,可以帮助用户直接在PDF文件中添加、删除、…...

云计算在医疗行业的应用

云计算在医疗行业的应用广泛而深入,为医疗服务带来了前所未有的变革。以下是对云计算在医疗行业应用的详细解析: ### 一、医疗数据共享与整合 云计算平台具有强大的数据存储和处理能力,使得医疗数据共享与整合成为可能。通过云计算平台&…...

(转)rabbitmq怎么保证消息不丢失?

RabbitMQ 可以通过以下多种机制来保证消息不丢失: 生产阶段 - 持久化队列和交换器: - 在声明队列和交换器时,将 durable 参数设置为 true ,确保它们是持久化的。这样,即使 RabbitMQ 节点重新启动,队列和交…...

每日一题:链表中环的入口结点

文章目录 判断链表环的入口节点描述数据范围:复杂度要求:输入输出 示例代码实现思路解析注意事项: 判断链表环的入口节点 描述 给定一个链表,判断该链表是否存在环。如果存在环,返回环的入口节点;如果不存…...

k8s里面etcd的作用

etcd 是 Kubernetes 集群中一个至关重要的组件,它是一个开源的分布式键值存储系统,主要用于存储和管理 Kubernetes 集群的配置和状态信息。以下是 etcd 在 Kubernetes 中的具体作用和功能: ### 1. **集群状态存储** etcd 是 Kubernetes 集群的持久化存储后端,负责存储和管…...

使用 uniapp 开发微信小程序遇到的坑

0. 每次修改代码时,都会触发微信开发工具重新编译 终极大坑,暂未找到解决方案 1. input 无法聚焦问题 问题:在小程序开发工具中,input 会突然无法聚焦,重启也不行。但是真机调试可以正常聚焦。 解决办法&#xff1a…...

AlphaPi相关硬件驱动提取

初涉硬件编程,在咸鱼上搞了几块AlphaPi和microbit的板鼓捣了一下,alphapi生态不完善,网上又无任何文档,搞封闭,可玩性实在有限,但貌似相关扩展板是可以插microbit的,于是想把这些扩展版用microb…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

OpenLayers 分屏对比(地图联动)

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...