netty解码器LengthFieldBasedFrameDecoder用法详解

server/2025/1/11 10:01:54/

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语法
java">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 表示不跳过任何字节,最终解码结果将包含长度字段。

代码示例

http://www.ppmy.cn/server/157433.html

相关文章

OSPF - 影响OSPF邻居建立的因素

总结为这么10种 routerID 冲突区域id不一致认证MA网络掩码需一致区域类型(特殊区域)hello、dead时间MTU(如果开启检查)静默接口网络类型不匹配MA网络中路由器接口优先级全为0 如何建立邻居可以查看上一篇文章,可以直接专栏找(🤫挂链接会没流…

排序:插入、选择、交换、归并排序

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,…

代码管理助手-Git

前言 Git 是一个版本控制系统,可以帮助你记录文件的每一次修改。这样,如果你在编程时不小心把代码写错了,可以很容易地回退到之前的版本。最重要的是,Git 是完全免费的,用户可以在自己的计算机上安装和使用 Git&#x…

win10 ubuntu 使用Android ndk 问题:clang-14: Exec format error

1.问题 手头没有ubuntu,打算用一个轻量级ubuntu 安装Android ndk编译c程序,但是报错了,报错如下: clang-14: cannot execute binary file: Exec format error 2.原因 在某些情况下,可以使用 patchelf 工具来更改ELF…

Hadoop集群之间实现免密登录

实现虚拟机之间能够互相登录,比如可以在hadoop1上面登录hadoop2。 第一步:执行”ssh-keygen -t rsa”命令,生成该虚拟机的密钥 第二步:密钥文件存储在/root/.ssh目录,执行cd /root/.ssh命令进入存储密钥文件的目录&am…

Flink概念知识讲解之:Restart重启策略配置

Flink概念知识讲解之:Restart重启策略配置 当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以…

赛车微型配件订销管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 赛车微型配件行业通常具有产品多样性、需求不确定性、市场竞争激烈等特点。配件供应商需要根据市场需求及时调整产品结构和库存,同时要把握好供应链管理和销售渠道。传统的赛车微型配件订销管理往往依赖于人工经验和简单的数据分析,效率低下且容易…

vue项目封装api接口事项

vue项目封装api准备 vue项目vue项目目录对应的src文件夹 vue项目 本项目只提及一些修改的细节,如有错误,可在评论区指出交流。 vue项目目录对应的src文件夹 本章节针对src文件夹下操作: 封装api,需要先创建请求的request.js文件&#xff0…