前端雙工通信的幾種方案詳細描述

前端實現雙工通信(全雙工或半雙工)的常見方案及詳細實現如下:


一、WebSocket(全雙工)

原理:基于 TCP 的持久化協議,客戶端與服務端建立雙向通信通道,支持實時雙向數據傳輸。

// 客戶端(瀏覽器)
const socket = new WebSocket('ws://your-server:port');// 監聽消息
socket.onmessage = (event) => {console.log('收到消息:', event.data);
};// 發送消息
socket.send('Hello Server');// 服務端(Node.js示例,使用 ws 庫)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {ws.on('message', (message) => {console.log('收到客戶端消息:', message);ws.send('Hello Client');});
});

適用場景:實時聊天、在線游戲、協同編輯等高頻雙向通信場景。
優點:低延遲、高效、支持二進制數據傳輸。
缺點:需服務端主動支持 WebSocket 協議。


二、Server-Sent Events (SSE) + HTTP(半雙工)

原理:SSE 允許服務器單向推送數據到客戶端,客戶端通過普通 HTTP 請求發送數據。

// 客戶端接收服務端推送
const eventSource = new EventSource('/sse-endpoint');
eventSource.onmessage = (e) => {console.log('收到服務端推送:', e.data);
};// 客戶端發送數據(通過 Fetch API)
fetch('/send-data', {method: 'POST',body: JSON.stringify({ msg: 'Hello Server' })
});// 服務端(Node.js示例)
app.get('/sse-endpoint', (req, res) => {res.setHeader('Content-Type', 'text/event-stream');setInterval(() => {res.write(`data: ${Date.now()}\n\n`); // 推送數據}, 1000);
});app.post('/send-data', (req, res) => {console.log('收到客戶端數據:', req.body.msg);res.sendStatus(200);
});

適用場景:股票行情、新聞推送等以服務端推送為主的場景。
優點:簡單、支持自動重連、兼容 HTTP 協議。
缺點:客戶端到服務端需額外 HTTP 請求,非真正全雙工。


三、長輪詢(Long Polling,半雙工模擬)

原理:客戶端發起請求后,服務端保持連接直到有數據或超時,客戶端收到響應后立即發起新請求。

// 客戶端輪詢
function longPoll() {fetch('/polling-endpoint').then(res => res.json()).then(data => {console.log('收到數據:', data);longPoll(); // 遞歸調用維持連接});
}
longPoll();// 服務端(Node.js示例)
const messages = [];
app.get('/polling-endpoint', (req, res) => {// 等待新消息或超時(如30秒)const waitForMessage = (resolve) => {if (messages.length > 0) {res.json(messages.shift());} else {setTimeout(() => waitForMessage(resolve), 30000);}};waitForMessage();
});

適用場景:兼容性要求高、低頻通信場景。
優點:兼容所有瀏覽器。
缺點:高延遲、服務端資源消耗大。


四、HTTP/2 Server Push(半雙工)

原理:HTTP/2 允許服務端主動推送資源,但需配合客戶端請求使用。

// 服務端(Node.js,使用 http2 模塊)
const http2 = require('http2');
const server = http2.createSecureServer({ cert, key });
server.on('stream', (stream, headers) => {if (headers[':path'] === '/') {stream.pushStream({ ':path': '/api/data' }, (err, pushStream) => {pushStream.respond({ ':status': 200 });pushStream.end(JSON.stringify({ data: 'Pushed Data' }));});stream.end('Main Response');}
});

適用場景:預加載資源、減少延遲。
優點:無需額外協議,利用 HTTP/2 特性。
缺點:不能直接用于動態數據推送,客戶端無法主動攔截。


五、WebRTC DataChannel(全雙工)

原理:基于 UDP 的點對點通信,適合瀏覽器間直接數據傳輸。

// 客戶端建立連接
const pc = new RTCPeerConnection();
const dataChannel = pc.createDataChannel('chat');dataChannel.onmessage = (e) => {console.log('收到消息:', e.data);
};
dataChannel.send('Hello Peer');// 需配合信令服務器交換 SDP 和 ICE 信息(代碼略)

適用場景:視頻會議、P2P 文件傳輸。
優點:低延遲、支持點對點通信。
缺點:需處理 NAT 穿透、需信令服務器。


六、WebTransport(實驗性,全雙工)

原理:基于 HTTP/3 的現代協議,支持雙向流和多路復用。

// 客戶端(需瀏覽器支持)
const transport = new WebTransport('https://server:port');
await transport.ready;
const stream = await transport.createBidirectionalStream();
const writer = stream.writable.getWriter();
writer.write(new TextEncoder().encode('Hello Server'));
const reader = stream.readable.getReader();
const { value } = await reader.read();
console.log('收到消息:', new TextDecoder().decode(value));

適用場景:未來替代 WebSocket 的高性能場景。
優點:基于 QUIC 協議,抗丟包能力強。
缺點:目前僅部分瀏覽器支持(如 Chrome 97+)。


對比總結

方案協議雙工類型延遲適用場景
WebSocketWS/WSS全雙工實時聊天、高頻交互
SSE + HTTPHTTP半雙工中等服務端主導的推送
長輪詢HTTP半雙工兼容性要求高的低頻場景
HTTP/2 PushHTTP/2半雙工資源預加載
WebRTCUDP全雙工極低P2P 通信、音視頻
WebTransportHTTP/3全雙工極低未來高性能應用

選擇建議

  • 需要 全雙工實時通信 ? WebSocket 或 WebTransport。
  • 服務端單向推送為主 ? SSE。
  • 兼容舊瀏覽器 ? 長輪詢。
  • 點對點低延遲 ? WebRTC。

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

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

相關文章

KUKA機器人快速啟動設置

KUKA機器人在首次開機啟動時,有時在示教器上需要進行投入運行等相關的設置。如以下相關的信息需要處理: 1、機器人系統開機后,選擇T1運行模式;2、顯示提示信息:“RDC 存儲器和控制系統不一致什么被更換了”時&#xf…

游戲代碼C

以下將結合不同編程語言的特點及游戲開發中的實際應用,展示多種語言的游戲代碼示例(以簡單游戲為例,展示代碼結構和邏輯差異)。由于代碼篇幅較長,我將分語言進行說明并引用相關來源: 1. C# Unity&#xff…

LangChain Agent核心解析:Zero-Shot-ReAct策略實現與實戰指南

引言 在LangChain的Agent框架中,zero-shot-react-description 是一種預定義的Agent類型,它結合了Zero-Shot(零樣本學習) 和 ReAct(推理行動) 策略,主要用于根據工具的描述動態選擇和執行工具&a…

PyQt 或 PySide6 進行 GUI 開發文檔與教程

一、官網文檔 Qt 官方文檔:Porting to Qt 6 | Qt 6.9Qt 維基:???????Qt WikiQt for Python (PySide6) :???????Qt for Python - Qt WikiPySide6 快速上手指南:???????Getting Started - Qt for Python PyS…

2024年第十五屆藍橋杯省賽B組Python【 簡潔易懂題解】

2024年第十五屆藍橋杯省賽B組Python題解 一、整體情況說明 2024年第十五屆藍橋杯省賽B組Python組考試共包含8道題目,分為結果填空題和程序設計題兩類。 考試時間:4小時編程環境:Python 3.x,禁止使用第三方庫,僅可使…

Go語言--語法基礎4--基本數據類型--類型轉換

Go 是一種強類型的語言,所以如果在賦值的時候兩邊類型不一致會報錯。一個類型的值可以被轉換成另一種類型的值。由于 Go 語言不存在隱式類型轉換,因此所有的類型轉換都必須顯式的聲明。 強制類型轉換語法 使用 type (a) 這種形式來進行強制類型轉換&am…

nginx 代理時怎么更改 Remote Address 請求頭

今天工作中遇到用 localhost 訪問網站能訪問后臺 api,但是用本機IP地址后就拒絕訪問,我懷疑是后臺獲取 Remote Address 然后設置白名單了只能 localhost 訪問。 想用 nginx 更改 Remote Address server {listen 8058;server_name localhost;loca…

LeetCode刷題鏈表

文章目錄 鏈表總結 常用技巧兩數相加題解代碼 兩兩交換鏈表中的節點題解代碼 重排鏈表題解代碼 合并k個升序鏈表題解代碼 K個一組翻轉鏈表題解代碼 鏈表總結 常用技巧 畫圖 直觀 形象 便于理解引入虛擬頭節點,便于處理邊界情況,方便我們對鏈表進行…

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法 文章目錄 ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法前言1、前期準備工作2、多固件燒錄方法3、單固件燒錄方法總結 前言 使用正點原子的ESP32S3 BOX開發板獨立燒錄編譯生成的xxx.bin固件無法正常運行起來&#…

Webug4.0靶場通關筆記10- 第14關鏈接注入

目錄 第14關 鏈接注入 1.打開靶場 2.源碼分析 3.滲透實戰 (1)方法1:跳轉外部網頁 (2)方法2:獲取cookie 4.漏洞防御 本文通過《webug靶場第14關 鏈接注入》來進行滲透實戰。 第14關 鏈接注入 鏈接注…

SpringBoot的汽車商城后臺管理系統源碼開發實現

概述 汽車商城后臺管理系統專為汽車4S店和經銷商設計,提供全面的汽車管理系統解決方案。 主要內容 1. 核心功能模塊 系統提供以下主要功能: ??銷售管理??:記錄銷售信息,跟蹤交易進度??客戶管理??:維護客戶…

VBA代碼解決方案第二十四講:EXCEL中,如何刪除重復數據行

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程,目前已經是第三版修訂了。這套教程定位于入門后的提高,在學習這套教程過程中,側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

日本IT行業|salesforce開發語言占據的地位

在日本的IT行業中,Salesforce 開發語言處于一個較為專業但穩步增長的細分領域,并不是主流開發語言(如 Java、Python、PHP),但其在某些行業和場景中地位越來越重要。 本篇以下是詳細分析: Salesforce開發語言…

前端開發,文件在鏡像服務器上不存在問題:Downloading binary from...Cannot download...

問題與處理策略 問題描述 在 Vue 項目中,執行 npm i 下載依賴時,報如下錯誤 Downloading binary from https://npm.taobao.org/mirrors/node-sass//v4.14.1/win32-x64-72_binding.node Cannot download "https://npm.taobao.org/mirrors/node-sa…

基于Vue2 + Element 實現任務列表管理功能的詳細教程

前言:本文介紹的是如何從0開始搭建Vue2項目到1實現對任務添加、刪除和篩選的功能,🔗 相關鏈接Vue 入門(安裝與應用超詳細教程) ? 【作者主頁—📚閱讀更多優質文章、獲取更多優質源碼】 目錄 一 . 項目搭建 1.1 安裝node.js 1.…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】1.4 數據庫與表的基本操作(DDL/DML語句)

👉 點擊關注不迷路 👉 點擊關注不迷路 👉 點擊關注不迷路 文章大綱 1.4 數據庫與表的基本操作(DDL/DML語句)1.4.1 數據庫生命周期管理(DDL核心)1.4.1.1 創建數據庫(CREATE DATABASE&…

Fabrice Bellard(個人網站:?bellard.org?)介紹

Fabrice Bellard 是法國人,國際著名程序員。1972年生于法國Grenoble,大學就讀于巴黎高等綜合理工學院,后在國立巴黎高等電信學院攻讀。 Fabrice Bellard(個人網站:?bellard.org?)是計算機領域最具影響力…

USB布局布線

1USB簡介 USB是通用串行總線的英文縮寫,是連接外部裝置的一個串口總線標準,也是一種輸入輸出接口的技術規范,被廣泛地應用于個人電腦和移動設備等信息通迅產品,并擴展到攝影器材,數字電視(機頂盒&#xff0…

【數據結構】線性表--鏈表

【數據結構】線性表--鏈表 一.前情回顧二.鏈表的概念三.鏈表的實現1.鏈表結點的結構:2.申請新結點函數:3.尾插函數:4.頭插函數:5.尾刪函數:6.頭刪函數:7.在指定結點之前插入:8.在指定結點之后插…

Mybatis-plus代碼生成器的創建使用與詳細解釋

Mybatis-plus代碼生成器的創建使用與詳細解釋 一、代碼生成器概述 1. 定義(什么是代碼生成器) 在軟件開發過程中,存在大量重復性的代碼編寫工作,例如實體類、Mapper 接口、Service 接口及實現類等。代碼生成器就是為了解決這類問題而誕生的工具。MyBa…