React + ts 中應用 Web Work 中集成 WebSocket

一、Web Work定義

 useEffect(() => {let webSocketIndex  = -1const websocketWorker = new Worker(new URL('./websocketWorker.worker.ts?worker',             import.meta.url),{type: 'module' // 必須聲明模塊類型});//初始化WEBSOCKET(多個服務器選擇最快建立連接的一個)const urls = (import.meta.env.VITE_WEB_SOCKET).split(',');for(const url of urls) {this.works.websocketWorker.postMessage({type: "INIT_WEBSOCKET", payload: {url: url}});}websocketWorker.onmessage = (e) => {//接收子線程消息//接收連接打開消息if(e.data.type === "OPEN") {//這里通過變量改變只使用一次opne選擇最快反饋的服務器if(webSocketIndex === -1) {webSocketIndex = e.data.index;websocketWorker.postMessage({type: "SELECT_SOCKET", payload:e.data.index});}}};return () => {if(websocketWorker ) {websocketWorker.postMessage({ type: "CLOSE_WEBSOCKET" });const str = setTimeout(() => {websocketWorker .terminate()clearTimeout(str);}, 500);}};}, []);

二、子線程中WebSocket 的啟動使用

let socket: WebSocket | null = null;
let sockets: WebSocket[] = [];
let pingTimer: NodeJS.Timeout | null = null;self.onmessage = (e) => {const message = e.data as MessageData;//webSocket 子進程switch(message.type) {//初始化webSocketcase "INIT_WEBSOCKET":const ws = new WebSocket(message.payload.url);sockets.push(ws);ws.onopen = () => self.postMessage({ type: 'OPEN', index: sockets.indexOf(ws) });return "";case "SELECT_SOCKET":socket = sockets[message.payload];// 發送Ping幀(心跳檢測)pingTimer = setInterval(() => {(socket as WebSocket).send(new Uint8Array([0x89, 0x00])); }, PING_TIME);//消息隊列先進先出const queue = new WebSocketQueue(socket);queue.listen((msg) => {console.log('SOCKET:', msg.timestamp, msg.data);});//其他socket連接關閉節省資源const otherSocket = sockets.filter((_, index) => index !== message.payload);for(const other of otherSocket) {other.close();}return "";   case "CLOSE_WEBSOCKET":if(socket) (socket as WebSocket).close();if(pingTimer) clearInterval(pingTimer);return "";     default:return "";         }};

三、補充(WebSocket 消息隊列實現)

/*** WebSocket消息隊列,先進先出*/
export class WebSocketQueue {private queue: {data: any, timestamp: number}[] = [];private messageHandler?: (msg: {data: any, timestamp: number}) => void;constructor(socket: WebSocket) {socket.onmessage = (ev) => {this.queue.push({data: ev.data, timestamp: Date.now()});this.messageHandler?.(this.queue.shift()!); // FIFO處理};}// 注冊消息處理器public listen(handler: (msg: {data: any, timestamp: number}) => void) {this.messageHandler = handler;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92551.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RabbitMQ面試精講 Day 3:Exchange類型與路由策略詳解

【RabbitMQ面試精講 Day 3】Exchange類型與路由策略詳解 文章標簽 RabbitMQ,消息隊列,Exchange,路由策略,AMQP,面試題,分布式系統 文章簡述 本文是"RabbitMQ面試精講"系列第3天內容,深入解析RabbitMQ的核心組件——Exchange及其路由策略。文章詳細剖析…

深入解析Hadoop MapReduce Shuffle過程:從環形緩沖區溢寫到Sort與Merge源碼

MapReduce與Shuffle過程概述在大數據處理的經典范式MapReduce中,Shuffle過程如同人體血液循環系統般連接著計算框架的各個組件。作為Hadoop最核心的分布式計算模型,MapReduce通過"分而治之"的思想將海量數據處理分解為Map和Reduce兩個階段&…

Kafka MQ 消費者

Kafka MQ 消費者 1 創建消費者 在讀取消息之前,需要先創建一個KafkaConsumer對象。創建KafkaConsumer對象與創建KafkaProducer對象非常相似—把想要傳給消費者的屬性放在Properties對象里。本章后續部分將深入介紹所有的配置屬性。為簡單起見,這里只提供3個必要的屬性:boo…

人工智能——Opencv圖像色彩空間轉換、灰度實驗、圖像二值化處理、仿射變化

一、圖像色彩空間轉換(一)顏色加法1、直接相加1、直接相加2、調用cv.add()函數進行飽和操作 在OpenCV中進行顏色的加法,我們說圖像即數組,所以從數據類型來說我們可以直接用numpy的知識來進行直接相加,但是存在…

【JToken】JToken == null 判斷無效的問題

if (innerNode null) {continue; }Debug.Log($"toNode type: {node["toNode"]?.GetType()}");發現這個JToken 無法正確的判斷 是否為 null,再排除邏輯問題后,我基本能確定的是 這個對象 不返回的不是真正的C# NULL 輸出類型后是 N…

C++基于libmodbus庫實現modbus TCP/RTU通信

今天看到了一個參考項目中用到了modbus庫,看著使用很是方便,于是記錄一下。后面有時間了或者用到了再詳細整理。 參考:基于libmodbus庫實現modbus TCP/RTU通信-CSDN博客 一、介紹 1.1庫文件包含 1.2最簡單的使用 本人在QT6.5下&#xff0…

【原創】微信小程序添加TDesign組件

前言 TDesign 是騰訊公司推出的一款UI界面庫,至于騰訊的實力嘛,也不用多說了。 官網:https://tdesign.tencent.com/ 源碼:https://github.com/Tencent/tdesign 目前處于活躍狀態,發文前5日,該庫仍在更新中… 遇到的問題 雖然騰訊為微信小程序開發提供了一個討論的論壇,…

Vue的路由模式的區別和原理

路由模式 Vue 的路由模式指的是 Vue Router 提供的 URL 處理方式,主要有兩種:Hash 模式和History 模式。 Hash模式 在 Vue Router 中,默認使用的是 hash 模式,即 mode: hash。如果想要使用 history 模式,可以設置 mode…

通過TPLink路由器進行用戶行為審計實戰

用戶行為審計是指對用戶在網絡平臺上的行為進行監控和記錄,以便對其行為進行分析和評估的過程。隨著互聯網的普及和發展,用戶行為審計在網絡安全和數據隱私保護方面起到了重要的作用。 用戶行為審計可以幫助發現和預防網絡安全威助。通過對用戶的行為進行…

MYSQL 第一次作業

新建產品庫mysql> CREATE DATABASE mydb6_product;使用產品庫mysql> USE mydb6_product;創建employess表mysql> CREATE TABLE employees (-> id INT PRIMARY KEY,-> name VARCHAR(50) NOT NULL,-> age INT,-> gender VARCHAR(10) NOT NULL DEFAULT unknow…

暑期前端訓練day7——有關vue-diff算法的思考

前言 今天分享一下我對vue的diff的探究,跟我一起深入底層,看一看vue是怎么進行diff的,它的復雜度如何,為什么性能這么高,diff的目標是盡可能的復用原來的真實dom,減少刪除真實dom和創建真實的dom的開銷&…

【Docker】Docker的初步認識以及Ubuntu下的Docker環境安裝、配置

前言 在當今快速迭代的軟件開發與部署領域,容器化技術已成為不可或缺的核心力量,而 Docker 作為容器化技術的杰出代表,正以其輕量、高效、可移植的特性深刻改變著開發與運維的模式。它有效解決了 “在我機器上能運行,在你那里卻不…

【密碼學】2. 古典密碼

目錄2. 古典密碼2.1 經典加密技術基礎2.2 代換技術2.2.1 算術密碼2.2.2 代換密碼(Substitution Cipher)2.3 置換技術2.4 乘積密碼2.5 歷史上的教訓2. 古典密碼 2.1 經典加密技術基礎 分類 代換(Substitution):明文內…

CSS3文本陰影特效全攻略

CSS3文本陰影效果實現 下面我將創建一個展示各種CSS3文本陰影效果的頁面&#xff0c;包含多種樣式示例和代碼實現。 設計思路 創建具有視覺吸引力的標題區域提供多種文本陰影效果實例顯示對應的CSS代碼以供參考添加交互元素讓用戶自定義效果 實現代碼 <!DOCTYPE html&g…

JavaScript 03 嚴格檢查模式Strict字符串類型詳解

2.4 嚴格檢查模式Strict在 JavaScript 里&#xff0c;也是 有 “作用域” 這個說法的。 所以說&#xff0c;變量 也分 全局變量 和 局部變量。 當我們 直接 把 代碼 寫在 script 雙標簽里面的時候&#xff0c;我們 JS 會認為 這只是 一個 沒有名字的 函數&#xff01;&#xff…

車載診斷ECU架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

使用vue-pdf-embed發現某些文件不顯示內容

在使用vue-pdf-embed過程中, 突然發現有些pdf文件可以正常打開, 有些文件只顯示了一些數字, 并且控制臺報出如下警告: Warning: loadFont - translateFont failed: “UnknownErrorException: Ensure that the cMapUrl and cMapPacked API parameters are provided.”. Warning…

【設計模式C#】狀態模式(用于解決解耦多種狀態之間的交互)

一種行為設計模式。特點是用類的方式去管理狀態。優點&#xff1a;對每個狀態進行了封裝&#xff0c;提高了代碼的可維護性&#xff1b;減少了條件判斷語句的使用&#xff0c;降低維護成本&#xff1b;易于擴展&#xff0c;每次新增狀態都無需大規模修改其他類&#xff0c;符合…

WebSocket數據通過splice保持現有DOM結構僅更新文本內容?【防閃爍】。

文章目錄 前言 一、DOM更新優化機制 ?1.虛擬DOM復用性 2.?響應式系統觸發 二、性能對比 三、WebSocket場景實踐 ?1.防閃爍原理 2.代碼實現示例 四、特殊注意事項 總結 前言 開發過程中渲染websocket返回的數據時&#xff0c;經常會遇到更新數據閃爍的問題&#xff0c;咱們可…

深入解析Hadoop的Block多副本同步機制與Pipeline復制

Hadoop分布式文件系統概述作為Hadoop生態的核心存儲組件&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;的設計哲學源于Google File System論文&#xff0c;其架構專門針對大規模數據集處理場景進行了優化。在理解Block多副本同步機制之前&#xff0c…