[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
英文地址,請注明出處:http://en.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;此處…