前端開發之WebSocket通信

WebSocket

WebSocket是一種在單個TCP連接上進行全雙工通信(雙向同時通信)的協議,它允許服務器和客戶端之間自由地交換數據,無需反復建立連接。其特點包括:

  • 雙向通信:實時性強,支持服務器向客戶端推送數據,也支持客戶端向服務器發送數據。
  • 輕量級數據格式:減少傳輸開銷,提高通信效率。
  • 基于TCP:確保數據傳輸的可靠性。
  • 無同源限制:可以跨域通信。
  • 協議標識:ws(非加密)或wss(加密)。
  • 兼容性:現代瀏覽器廣泛支持,但老版本瀏覽器可能需要降級方案。

應用場景:在線聊天、實時游戲、協同編輯等對實時性要求高的場景。

客戶端(JavaScript):

var socket = new WebSocket('ws://yourserver.com/socket');
socket.onopen = function() {socket.send('Hello Server!');
};
socket.onmessage = function(event) {console.log('Received:', event.data);
};
socket.onclose = function() {console.log('Connection closed');
};

服務器端(Node.js + ws庫):

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', ws => {ws.on('message', message => {console.log('Received:', message);ws.send('Hello Client!');});
});
即時通訊的其他實現方式:
1.短輪詢
  • 原理:客戶端定時向服務器發送請求查詢是否有新數據。
  • 優點:實現簡單。
  • 缺點:頻繁請求造成資源浪費,實時性差。

應用場景:實時性要求不高的簡單應用。

setInterval(function() {fetch('/api/data').then(response => response.json()).then(data => console.log('Data:', data));
}, 2000); // 每2秒輪詢一次
2.長輪詢
  • 原理:客戶端發起請求,服務器無新數據則掛起連接,直到有新數據才響應。
  • 優點:相較于短輪詢減少請求次數,提升效率。
  • 缺點:服務器端資源占用較高,長時間連接可能導致資源泄露。

應用場景:實時性要求較高,但可以接受一定延遲的場景。

簡化版代碼如下:

function longPoll() {fetch('/api/longPoll').then(response => response.json()).then(data => {if (data.updated) {console.log('Update:', data);} else {setTimeout(longPoll, 5000); // 無更新,5秒后再次輪詢}});
}
longPoll();
3.SSE (Server-Sent Events)

允許服務器向瀏覽器推送更新,單向通信。

  • 原理:基于HTTP的單向通信,服務器通過事件流向瀏覽器推送數據。
  • 優點:簡單易用,瀏覽器支持良好(不包括舊版IE)。
  • 缺點:僅支持服務器到客戶端的通信,不支持客戶端向服務器發送數據。

客戶端(JavaScript):

var es = new EventSource('/api/sse');
es.onmessage = function(event) {console.log('Received:', event.data);
};

服務器端(Node.js + Express):

const express = require('express');
const app = express();app.get('/api/sse', (req, res) => {res.setHeader('Content-Type', 'text/event-stream');res.setHeader('Cache-Control', 'no-cache');setInterval(() => {res.write(`data: ${new Date().toISOString()}\n\n`);}, 5000);
});app.listen(3000);

即時通訊的實現:短輪詢、長輪詢、SSE 和 WebSocket 間的區別?

技術描述特點適用場景
WebSocket基于TCP的全雙工通信協議,實現雙向實時數據傳輸。實時性強,雙向通信,低延遲,高效率。支持二進制數據。實時交互應用,如在線游戲、即時聊天、協同編輯。
短輪詢定時向服務器發送請求檢查數據更新。實現簡單,資源消耗大,實時性較差。實時性要求不高的場景,需要高度兼容性。
長輪詢客戶端請求后,服務器無更新則掛起連接,有更新即響應。相較短輪詢減少請求次數,提高效率,服務器端資源占用較高。實時性要求較高,可接受短暫延遲的應用。
Server-Sent Events (SSE)服務器單向推送更新至瀏覽器。瀏覽器原生支持,實現簡單,適合服務器推送數據。僅支持文本數據。實時數據推送,如新聞、股票、實時日志。

性能與兼容性權衡

  • 性能排序(高到低):WebSocket > SSE > 長輪詢 > 短輪詢
  • 兼容性排序(低到高):WebSocket > SSE > 長輪詢 > 短輪詢

以上,每種技術都有其適用場景和局限性,開我們需根據實際需求選擇最合適的技術方案。WebSocket由于其全雙工和低延遲的特性,成為現代實時應用的首選方案,但在考慮兼容性和實現簡易性時,短輪詢、長輪詢和SSE仍有其價值。

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

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

相關文章

移動端前端開發遇到過的Andorid和IOS的差異記錄

移動端前端開發遇到過的安卓和蘋果的差異記錄 1. 引入外部資源,最好用https2. IOS時間戳獲取NaN問題3. 金額三位分節顯示方式4. .webp圖片支持問題 1. 引入外部資源,最好用https ios處于安全性的考慮,不大支持http引入外部資源,所…

【kubernetes】探索k8s集群的配置資源(secret和configma)

目錄 一、Secret 1.1Secret 有四種類型 1.2Pod 有 3 種方式來使用 secret 1.3應用場景:憑據 1.4創建 Secret 1.4.1用kubectl create secret命令創建Secret 1.4.2內容用 base64 編碼,創建Secret 1.4.2.1Base64編碼 1.4.2.2創建YAML文件 1.4.2.3…

《計算機網絡》

計算題【33】 題目:假設一個有噪聲信道的帶寬為3KHz,信噪比為30dB,則該信道的最大數據傳輸速率是多少? C = W log2(1+S/N)(bit/s)=3000Hz* log2(1+30)= 29.9kbps 題目:一個網絡中,設定的IP地址范圍是:172.88.32.1至172.88.32.254,試確定其合適的子網掩碼。 分析第…

「前端+鴻蒙」鴻蒙應用開發預覽模擬器運行

在鴻蒙應用開發中,預覽和模擬器運行是開發流程中的重要環節,它們允許開發者在不使用實體設備的情況下測試應用的界面和功能。以下是如何使用華為DevEco Studio進行預覽和在模擬器上運行鴻蒙應用的詳細步驟,以及相應的示例代碼。 快速體驗-預覽…

277 基于MATLAB GUI火災檢測系統

基于MATLAB GUI火災檢測系統,可以實現圖片和視頻的火苗檢測。火焰識別的三個特征:1個顏色特征,2個幾何特征顏色特征:HSV顏色空間下,對三個通道值進行閾值濾波,幾何特征1:長寬比,幾何…

用 Python 擼一個 Web 服務器-第3章:使用 MVC 構建程序

Todo List 程序介紹 我們將要編寫的 Todo List 程序包含四個頁面,分別是注冊頁面、登錄頁面、首頁、編輯頁面。以下分別為四個頁面的截圖。 注冊頁面: 注冊 登錄頁面: 登錄 首頁: 首頁 編輯頁面: 編輯 程序頁面非…

程序員搞副業一些會用到的工具

微信號采集(爬蟲)技術的選型 那么,我們應該使用什么技術來從龐大的網頁內容中自動篩選和提取微信號呢?答案就是:數據采集技術,也就是爬蟲技術。 然而,數據采集技術種類繁多,我們具體應該采用哪一個呢&…

【Linux】—— 線程控制的基本介紹

目錄 (一)POSIX線程庫 (二)創建線程 2.1 線程ID及進程地址空間布局 (三)線程終止 (四)分離線程 (一)POSIX線程庫 POSIX線程庫(POSIX Thread…

Node.js后端構建指南:MongoDB與Express的集成

安裝express 安裝 Express 并將其保存到依賴列表中: $ cnpm install express --save 以上命令會將 Express 框架安裝在當前目錄的 node_modules 目錄中, node_modules 目錄下會自動創建 express 目錄。以下幾個重要的模塊是需要與 express 框架一起安…

nss刷題(4)

1、[SWPUCTF 2021 新生賽]easyrce <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET[url])) { eval($_GET[url]); } ?> if(isset($_GET[url])) isset函數用來檢測url變量是否存在&#xff1b;$_GET函數獲取變量數據 eval($_GET[url]); eval函數用…

【GIS矢量切片】tippecanoe在Windows和CentOS中的安裝

組件安裝記錄 背景介紹Windows下安裝1、下載工具2、存放安裝包3、進入DOS終端4、在終端執行命令5、下載程序6、放置源碼7、修改配置信息8、編譯9、測試10、參數說明瓦片輸出瓦片描述和權屬信息輸入文件和圖層名輸入文件的并行處理輸入文件的投影縮放級別瓦片分辨率CentOS 7安裝…

嘗試用 GPT-4o 寫 2024高考語文作文

文章目錄 新課標I卷科技進步與問題的演變 新課標II卷抵達未知之境&#xff1a;探索與成長的旅程 全國甲卷坦誠交流&#xff1a;構建真正相遇的橋梁 北京卷歷久彌新 天津卷定義與自定義&#xff1a;在世界的繽紛中前行 上海卷認可度的思考與反思 新課標I卷 閱讀下面的材料&#…

Mongodb---java篇

一、導入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency> 二、編寫配置文件連接Mongodb 我的認證數據庫是admin&#xff0c;你們可能不一樣 sp…

第三篇——大數據思維的科學基礎

目錄 一、背景介紹二、思路&方案三、過程1.思維導圖2.文章中經典的句子理解3.學習之后對于投資市場的理解4.通過這篇文章結合我知道的東西我能想到什么&#xff1f; 四、總結五、升華 一、背景介紹 大數據時代&#xff0c;大數據思維的重要性不言而喻&#xff1b;而信息在…

Elasticsearch搜索優化-自定義路由規劃(routing)

在es的實踐學習中&#xff0c;我覺得它的文檔是最好的老師&#xff0c;所以先把這部分鏈接貼出來&#xff0c;本文只是引導&#xff0c;文檔全是細節&#xff0c;還是推薦大家事后認真看看文檔 Metadata fields-routing 在es搜索中&#xff0c;請求是先分發到所有分片&#x…

6月26~28日,2024北京國際消防展即將開幕!

隨著社會的快速發展&#xff0c;消防安全日益受到廣大民眾的高度關注。為了進一步推動消防科技的創新與發展&#xff0c;提升全民消防安全意識&#xff0c;2024年北京消防展將于6月26日在北京國家會議中心盛大開展。目前:觀眾預登記已全面啟動&#xff0c;廣大市民和業界人士可…

馬爾科夫性質-舉例簡單說明,馬爾科夫模型和隱馬爾科夫模型在自然語言處理方面應用是什么

目錄 馬爾科夫模型應用 馬爾科夫性質,舉例簡單說明 馬爾科夫模型 馬爾科夫鏈 馬爾科夫決策過程(Markov Decision Process, MDP) 例子 隱馬爾科夫模型(Hidden Markov Model, HMM) 馬爾科夫模型和隱馬爾科夫模型在自然語言處理方面應用是什么 馬爾科夫模型在自然語言…

SQLite3(1):介紹安裝與測試

目錄 1、SQLite3介紹 2、SQLite3的優勢和特性 3、SQLite3安裝與測試 3.1 SQLite3安裝 3.2 SQLite3測試 4、SQLite3簡單使用 4.1 連接數據庫文件 4.2 創建信息表 4.3 插入三個學生信息 4.4 確認信息 5、總結 1、SQLite3介紹 SQLite3是一種輕量級的關系型數據庫管理系…

論文閱讀 A Distributional Framework for Data Valuation

本論文解決的問題 量化數據價值&#xff08;機器學習模型訓練中各個數據點的貢獻&#xff09; 避免數據價值受到其所處數據集的影響&#xff0c;使數據點的估值更加穩定、一致 變量假設 假設 D 表示一個在全集 Z 上的數據分布。對于監督學習問題&#xff0c;我們通常認為 Z…

jvm學習筆記(一) ----- JAVA 內存

JAVA 內存 一、程序計數器二、虛擬機棧三、本地方法棧四、堆五、非JAVA內存(堆外內存)1.元空間(Metaspace)2.直接內存 鏈接: jvm學習筆記(二) ----- 垃圾回收 鏈接: jvm學習筆記(三) ----- 垃圾回收器 一、程序計數器 虛擬機需要通過『程序計數器』記錄指令執行到哪了。線程要…