[netty5: WebSocketFrame]-源码分析

WebSocketFrame

WebSocketFrame 是 Netty 中用于表示 WebSocket 消息帧的抽象基类,封装了帧的内容、分片标志和扩展位信息,供各类具体帧(如文本、二进制、控制帧)继承使用。

public abstract class WebSocketFrame extends BufferHolder<WebSocketFrame> {// 表示是否是当前 WebSocket 消息的最后一个分片(frame)。private final boolean finalFragment;// 表示 RSV1/RSV2/RSV3 位(协议保留字段),通常用于 WebSocket 扩展(如压缩、加密扩展等)。private final int rsv;protected WebSocketFrame(Buffer binaryData) {this(true, 0, binaryData);}protected WebSocketFrame(Send<Buffer> binaryData) {super(binaryData);finalFragment = true;rsv = 0;}protected WebSocketFrame(boolean finalFragment, int rsv, Buffer binaryData) {super(binaryData);this.finalFragment = finalFragment;this.rsv = rsv;}protected WebSocketFrame(WebSocketFrame copyFrom, Buffer binaryData) {super(binaryData);finalFragment = copyFrom.finalFragment;rsv = copyFrom.rsv;}// 标识当前帧是否是消息的最后一部分(WebSocket 支持帧分片)public boolean isFinalFragment() {return finalFragment;}// 返回 RSV(Reserved Bits),可用于判断是否启用 WebSocket 扩展,如压缩 (permessage-deflate)public int rsv() {return rsv;}public Buffer binaryData() {return getBuffer();}@Overridepublic String toString() {return StringUtil.simpleClassName(this) + "(data: " + getBuffer().toString(defaultCharset()) + ')';}
}

PingWebSocketFrame

PingWebSocketFrame 是 Netty 中表示 WebSocket Ping 控制帧的类,用于发送心跳检测数据,继承自 WebSocketFrame 并实现帧复制逻辑。

public class PingWebSocketFrame extends WebSocketFrame {public PingWebSocketFrame(Buffer binaryData) {super(binaryData);}public PingWebSocketFrame(boolean finalFragment, int rsv, Buffer binaryData) {super(finalFragment, rsv, binaryData);}private PingWebSocketFrame(PingWebSocketFrame copyFrom, Buffer data) {super(copyFrom, data);}@Overrideprotected WebSocketFrame receive(Buffer buf) {return new PingWebSocketFrame(this, buf);}
}

PongWebSocketFrame

PongWebSocketFrame 是 Netty 中用于响应 Ping 控制帧的 WebSocket Pong 帧实现,继承自 WebSocketFrame,支持数据内容和帧复制功能。

public class PongWebSocketFrame extends WebSocketFrame {public PongWebSocketFrame(Buffer binaryData) {super(binaryData);}public PongWebSocketFrame(Send<Buffer> binaryData) {super(binaryData);}public PongWebSocketFrame(boolean finalFragment, int rsv, Buffer binaryData) {super(finalFragment, rsv, binaryData);}private PongWebSocketFrame(PongWebSocketFrame copyFrom, Buffer data) {super(copyFrom, data);}@Overrideprotected WebSocketFrame receive(Buffer buf) {return new PongWebSocketFrame(this, buf);}
}

BinaryWebSocketFrame

BinaryWebSocketFrame 是 Netty 中用于传输二进制数据的 WebSocket 数据帧,支持设置是否为最后一帧以及协议扩展位。

public class BinaryWebSocketFrame extends WebSocketFrame {public BinaryWebSocketFrame(Buffer binaryData) {super(binaryData);}public BinaryWebSocketFrame(boolean finalFragment, int rsv, Buffer binaryData) {super(finalFragment, rsv, binaryData);}private BinaryWebSocketFrame(BinaryWebSocketFrame copyFrom, Buffer data) {super(copyFrom, data);}@Overrideprotected WebSocketFrame receive(Buffer buf) {return new BinaryWebSocketFrame(this, buf);}
}

TextWebSocketFrame

TextWebSocketFrame 是 Netty 中用于传输 UTF-8 编码文本的 WebSocket 数据帧,支持字符串构造、扩展位设置以及是否为最后一帧的标识。

public class TextWebSocketFrame extends WebSocketFrame {public TextWebSocketFrame(BufferAllocator allocator, String text) {super(fromText(allocator, text));}public TextWebSocketFrame(Buffer binaryData) {super(binaryData);}public TextWebSocketFrame(BufferAllocator allocator, boolean finalFragment, int rsv, String text) {super(finalFragment, rsv, fromText(allocator, text));}private TextWebSocketFrame(TextWebSocketFrame copyFrom, Buffer data) {super(copyFrom, data);}private static Buffer fromText(BufferAllocator allocator, String text) {if (text == null || text.isEmpty()) {return allocator.allocate(0);} else {return allocator.copyOf(text, UTF_8);}}public TextWebSocketFrame(boolean finalFragment, int rsv, Buffer binaryData) {super(finalFragment, rsv, binaryData);}/*** Returns the text data in this frame.*/public String text() {return binaryData().toString(UTF_8);}@Overrideprotected WebSocketFrame receive(Buffer buf) {return new TextWebSocketFrame(this, buf);}
}

ContinuationWebSocketFrame

ContinuationWebSocketFrame 是用于 WebSocket 消息分片场景的续帧类型,可承载文本或二进制数据,支持设置是否为最终帧和协议扩展位。

public class ContinuationWebSocketFrame extends WebSocketFrame {public ContinuationWebSocketFrame(Buffer binaryData) {super(binaryData);}public ContinuationWebSocketFrame(boolean finalFragment, int rsv, Buffer binaryData) {super(finalFragment, rsv, binaryData);}public ContinuationWebSocketFrame(BufferAllocator allocator, boolean finalFragment, int rsv, String text) {this(finalFragment, rsv, fromText(allocator, text));}private ContinuationWebSocketFrame(ContinuationWebSocketFrame copyFrom, Buffer data) {super(copyFrom, data);}public String text() {return binaryData().toString(StandardCharsets.UTF_8);}private static Buffer fromText(BufferAllocator allocator, String text) {if (text == null || text.isEmpty()) {return allocator.allocate(0);} else {return allocator.copyOf(text.getBytes(StandardCharsets.UTF_8));}}@Overrideprotected WebSocketFrame receive(Buffer buf) {return new ContinuationWebSocketFrame(this, buf);}
}

CloseWebSocketFrame

CloseWebSocketFrame 表示 WebSocket 连接关闭帧,包含关闭状态码和可选的关闭原因,用于优雅地关闭连接。

public class CloseWebSocketFrame extends WebSocketFrame {public CloseWebSocketFrame(BufferAllocator allocator, WebSocketCloseStatus status) {this(allocator, requireValidStatusCode(status.code()), status.reasonText());}public CloseWebSocketFrame(BufferAllocator allocator, WebSocketCloseStatus status, String reasonText) {this(allocator, requireValidStatusCode(status.code()), reasonText);}public CloseWebSocketFrame(BufferAllocator allocator, int statusCode, String reasonText) {this(allocator, true, 0, requireValidStatusCode(statusCode), reasonText);}public CloseWebSocketFrame(BufferAllocator allocator, boolean finalFragment, int rsv) {this(finalFragment, rsv, allocator.allocate(0));}public CloseWebSocketFrame(BufferAllocator allocator, boolean finalFragment, int rsv, int statusCode, String reasonText) {super(finalFragment, rsv, newBinaryData(allocator, requireValidStatusCode(statusCode), reasonText));}public CloseWebSocketFrame(boolean finalFragment, int rsv, Buffer binaryData) {super(finalFragment, rsv, binaryData);}private CloseWebSocketFrame(CloseWebSocketFrame copyFrom, Buffer data) {super(copyFrom, data);}// 构造符合 WebSocket Close 帧格式的二进制数据,包含状态码和 UTF-8 编码的关闭原因文本。private static Buffer newBinaryData(BufferAllocator allocator, short statusCode, String reasonText) {if (reasonText == null) {reasonText = StringUtil.EMPTY_STRING;}final Buffer binaryData;if (!reasonText.isEmpty()) {byte[] reasonTextBytes = reasonText.getBytes(StandardCharsets.UTF_8);binaryData = allocator.allocate(2 + reasonTextBytes.length);binaryData.writeShort(statusCode);binaryData.writeBytes(reasonTextBytes);} else {binaryData = allocator.allocate(2).writeShort(statusCode);}return binaryData;}public int statusCode() {Buffer binaryData = binaryData();if (binaryData == null || binaryData.readableBytes() < 2) {return -1;}return binaryData.getUnsignedShort(binaryData.readerOffset());}public String reasonText() {Buffer binaryData = binaryData();if (binaryData == null || binaryData.readableBytes() <= 2) {return "";}int base = binaryData.readerOffset();try {binaryData.skipReadableBytes(2);return binaryData.toString(StandardCharsets.UTF_8);} finally {binaryData.readerOffset(base);}}@Overrideprotected WebSocketFrame receive(Buffer buf) {return new CloseWebSocketFrame(this, buf);}static short requireValidStatusCode(int statusCode) {if (WebSocketCloseStatus.isValidStatusCode(statusCode)) {return (short) statusCode;} else {throw new IllegalArgumentException("WebSocket close status code does NOT comply with RFC-6455: " + statusCode);}}
}

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

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

相关文章

【加解密与C】非对称加解密(三)ECC椭圆曲线

ECC椭圆曲线的基本概念椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff0c;ECC&#xff09;是一种基于椭圆曲线数学的公钥密码体制。与传统的RSA相比&#xff0c;ECC在相同安全级别下使用更短的密钥&#xff0c;计算效率更高&#xff0c;适用于资源受限的环境。…

力扣网编程150题:加油站(贪心解法)

一. 简介 前面一篇文章使用暴力解法来解决力扣网150 题目&#xff1a;加油站。文章如下&#xff1a; 力扣网编程150题&#xff1a;加油站&#xff08;暴力解法&#xff09;-CSDN博客 暴力解法就是遍历了所有元素作为起始点的可能&#xff0c;算法时间复杂度为 O(n*n)&#x…

windwos 设置redis长久密码不生效

1、设置长久密码redis.windows.conf 文件修改对应的设置密码2、启动时设置对应的加载配置文件

物联网(IoT)领域存在多种协议

物联网&#xff08;IoT&#xff09;领域存在多种协议&#xff0c;主要是因为不同的应用场景对通信的需求差异很大&#xff0c;包括实时性、带宽、功耗、设备兼容性、安全性等。以下从协议多样性的原因和你提到的具体协议&#xff08;如 dc3-driver-* 模块&#xff09;展开说明&…

二、encoders

文章目录一、batch_encoder (用于 BFV)1. 概述2. 数学原理3. 使用方法4. 代码示例二、ckks_encoder (用于 CKKS)在 1. bfv_basics.cpp 中&#xff0c;我们展示了如何使用BFV方案执行非常简单的计算。计算是在 plain_modulus 参数的模下执行的&#xff0c;并且 只使用了 BFV 明文…

数据一致性解决方案总结

数据一致性解决方案总结 我们在系统中&#xff0c;主要进行了数据冗余&#xff0c;那么就会带来数据一致性的问题。常见的数据一致性问题有&#xff1a;数据库主从同步延迟导致的读数据不一致&#xff1b;数据库主主之间数据的不一致&#xff1b;缓存和数据库之间的数据不一致。…

17.Spring Boot的Bean详解(新手版)

文章目录1. 什么是Bean&#xff1f;从零开始理解1.1 Bean的定义1.2 为什么需要Bean&#xff1f;1.3 Bean vs 普通对象的区别2. Spring容器&#xff1a;Bean的家2.1 什么是Spring容器&#xff1f;2.2 容器的工作流程3. Bean的声明方式详解3.1 使用Component及其专门化注解3.1.1 …

cherryStudio electron因为环境问题无法安装解决方法或打包失败解决方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是关于electron安装失败的解决方法. 也可以通过到git上下面包,解压后,放到对应的目录下面,并把里面的build文件夹删除, b…

微服务架构中数据一致性保证机制深度解析

在微服务架构中&#xff0c;数据一致性是分布式系统设计的核心挑战。由于服务拆分后数据自治&#xff08;每个服务独立数据库&#xff09;&#xff0c;跨服务操作的一致性保障需突破传统单体事务的局限。本文从一致性模型、核心解决方案、技术实现及面试高频问题四个维度&#…

【Gin】HTTP 请求调试器

文章目录 项目概述代码功能详解1. 导入必要的包2. 主函数和路由设置3. 请求信息捕获4. 请求参数和头信息5. 请求体处理5.1 JSON 数据处理5.2 表单数据处理5.3 Multipart 表单数据处理5.4 其他类型数据处理6. 构造响应对象7. 返回 JSON 响应功能特点使用场景完整代码项目概述 这…

物联网(IoT)领域的协议

物联网&#xff08;IoT&#xff09;领域的通信协议种类繁多&#xff0c;不同协议适用于不同的应用场景&#xff08;如低功耗设备、工业自动化、家庭智能设备等&#xff09;。以下是主要物联网协议的分类及详细解释&#xff1a;一、物联网协议分类物联网协议通常分为两大类&…

专题一_双指针_四数之和

一&#xff1a;题目解析 题目链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 注&#xff1a;本题是在上题的基础上讲解的&#xff1a;专题一_双指针_三数之和-CSDN博客 解析&#xff1a;和三数之区别在于找四元组和为targe的数字 而不是0 二&#xff1a…

Spring Boot多数据源配置详解

Spring Boot多数据源配置详解 在实际企业开发中&#xff0c;随着业务复杂度提升&#xff0c;单一数据源已无法满足所有场景需求。比如&#xff1a;读写分离、分库分表、数据迁移、微服务整合等&#xff0c;这时就需要用到多数据源配置。本文将从原理、配置、常见问题和最佳实践…

项目进度严重依赖关键人,如何分散风险

项目进度严重依赖关键人的风险&#xff0c;可以通过建立知识共享机制、强化团队协作模式、实施交叉培训和培养后备人才、优化流程标准化等措施有效分散。其中&#xff0c;实施交叉培训和培养后备人才尤为重要&#xff0c;通过培养多个成员具备相似的关键技能&#xff0c;能够迅…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com)1.实验简介实验目的&#xff1a;完成 DDR3 的读写测试。实验环境&#xff1a;Window11 PDS2022.2-SP6.4芯片型号&#x…

《每日AI-人工智能-编程日报》--2025年7月9日

介绍:AI 方面1. Manus 通用智能体初成型&#xff0c;开启 AIAgent 新时代​中泰证券发布研报称&#xff0c;首款通用型 AI 智能体 Manus 已问世&#xff0c;能够将复杂任务拆解为可执行的步骤链&#xff0c;并在虚拟环境中灵活调用工具&#xff0c;标志着 AI 从 “Reasoner” 走…

MyBatis之数据操作增删改查基础全解

目录 1. ➕MyBatis添加数据 1.1. 持久层接口添加方法 1.2. 映射文件添加标签 1.3. 编写测试方法 2. ✏️MyBatis修改数据 2.1. 代码的优化 2.2. 持久层接口添加方法 2.3. 映射文件添加标签 2.4. 编写测试方法 3. &#x1f5d1;️MyBatis删除数据与根据Id查询 3.1. 删…

kbmMemTable Pro 7.82 Delphi 11 源代码

kbmMemTable Pro 7.82 Delphi 11 源代码KbmMemTable 是一个用于在 Win 32/64、Mac OS、Android 和 iOS 32/64 应用程序中存储临时数据的组件&#xff0c;这些应用程序可以使用 RAD Studio、Delphi、C Builder 或 FPC 等编程语言创建&#xff0c;同时您还可以高速访问存储在数据…

LeetCode Hot 100 除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法&#xff0c;且在 O(n) 时间复杂度内…

VC Code--常用的配置

原文网址&#xff1a;VC Code--常用的配置-CSDN博客 简介 本文介绍VC Cod常用的配置。 1.字体大小 整体字体大小 左下角齿轮> Settings> Windows> Window: Zoom Level> 改为&#xff1a;2 编辑器字体大小&#xff08;如果调整了整体字体大小&#xff0c;此处…