前端双工通信的几种方案详细描述

前端实现双工通信(全双工或半双工)的常见方案及详细实现如下:


一、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.mzph.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…