【前端】有时候你可能需要SSE而不是WebSocket

深度解析:轮询、SSE 和 WebSocket

在构建实时应用时,开发者面临多种选择,其中最常见的是轮询(Polling)、服务器推送事件(Server-Sent Events,SSE)和 WebSocket。本文将深入解析这三种技术的特点、适用场景及其兼容性,帮助您选择最合适的方案。
在这里插入图片描述


轮询 (Polling)
工作原理

轮询是一种简单直接的实现实时更新的方法,客户端通过定期发送 HTTP 请求到服务器,检查是否有新数据。这种方法易于实现,但其效率和延迟表现并不理想。

特点
  • 实现简单:客户端发送 HTTP 请求,服务器返回数据。
  • 延迟较高:由于客户端需要等待下一次轮询才能获取新数据。
  • 服务器负载高:频繁的请求增加了服务器的压力和带宽使用。
实例
function poll() {setInterval(function() {fetch('/data').then(response => response.json()).then(data => {// 处理数据});}, 5000); // 每5秒请求一次
}
poll();
适用场景

轮询适用于不需要实时更新且数据更新频率较低的场景,如定期状态检查或后台数据同步。

兼容性
  • 浏览器支持:所有现代浏览器和旧版浏览器都支持。
  • 服务器支持:任何支持 HTTP 的服务器都可以使用轮询。

服务器推送事件 (Server-Sent Events, SSE)
工作原理

SSE 允许服务器通过 HTTP 将实时更新的数据推送到客户端。客户端使用 EventSource 接口来接收这些更新。

特点
  • 单向通信:服务器向客户端推送数据。
  • 实现简单:基于 HTTP 协议,只需设置正确的 HTTP 头和响应格式。
  • 低延迟:服务器在数据更新时立即推送给客户端。
  • 自动重连:浏览器会自动处理重连机制。
实例

服务器端(Python Flask):

from flask import Flask, Response
import timeapp = Flask(__name__)@app.route('/stream')
def stream():def generate():while True:yield f"data: The time is {time.ctime()}\n\n"time.sleep(1)return Response(generate(), mimetype='text/event-stream')if __name__ == '__main__':app.run(debug=True, threaded=True)

客户端(HTML + JavaScript):

<!DOCTYPE html>
<html>
<body><div id="result"></div><script>var source = new EventSource('/stream');source.onmessage = function(event) {document.getElementById('result').innerHTML += event.data + '<br>';};</script>
</body>
</html>
适用场景

SSE 适用于需要实时更新但不需要双向通信的场景,如新闻推送、股票价格更新等。

兼容性
  • 浏览器支持
    • 支持:Chrome 6+, Firefox 6+, Safari 5+, Opera 11+
    • 不支持:Internet Explorer,Edge 需 16+ 版本
  • 服务器支持:任何支持 HTTP 的服务器都可以实现 SSE。

WebSocket
工作原理

WebSocket 提供了一个持久化的连接,允许客户端和服务器之间进行实时的双向通信。相比于轮询和 SSE,WebSocket 具有更低的延迟和更高的效率。

特点
  • 双向通信:客户端和服务器之间可以实时传输数据。
  • 低延迟:通过保持持久连接,数据可以实时传输。
  • 复杂度高:需要额外的协议支持和更多的实现细节。
  • 资源效率高:相比轮询,WebSocket 的带宽和资源使用更高效。
实例

服务器端(Node.js):

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function connection(ws) {ws.on('message', function incoming(message) {console.log('received: %s', message);});ws.send('something');
});

客户端(HTML + JavaScript):

<!DOCTYPE html>
<html>
<body><script>var socket = new WebSocket('ws://localhost:8080');socket.onmessage = function(event) {console.log('Message from server ', event.data);};socket.onopen = function(event) {socket.send('Hello Server!');};</script>
</body>
</html>
适用场景

WebSocket 适用于需要实时双向通信的复杂应用,如在线游戏、即时聊天应用等。

兼容性
  • 浏览器支持
    • 支持:Chrome 16+, Firefox 11+, Safari 6+, Edge 12+, Opera 12.1+
    • 不支持:较老版本的浏览器(如 IE 10 以下)
  • 服务器支持:需要专门的 WebSocket 服务器或支持 WebSocket 协议的服务器。

总结一下

  • 轮询:实现简单、兼容性好,但效率低。适用于不需要实时更新的场景。
  • SSE:实现简单、单向通信、低延迟,但不支持 IE 浏览器。适用于需要实时更新的单向数据推送。
  • WebSocket:双向通信、低延迟、高效率,但实现复杂,对较旧的浏览器支持不佳。适用于需要实时双向通信的复杂应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kind kubernetes(k8s虚拟环境)使用本地docker的镜像

kubernetes中&#xff0c;虽然下载镜像使用docker&#xff0c;但是存储在docker image里的镜像是不能被k8s直接使用的&#xff0c;但是kind不同&#xff0c;可以使用下面的方法&#xff0c;让kind kubernetes环境使用docker image里的镜像。 kind – Quick Start 例如&#x…

M12电源分配器:高效率与可靠性的工业解决方案

关键词&#xff1a;M12电源分配器、M12电源接线盒、M12电源分线盒 摘要 M12电源分配器是工业环境中实现高效与可靠电源管理的现代化解决方案。该设备采用坚固的金属外壳和封闭式设计&#xff0c;保证了在严苛工业条件下的稳定运行&#xff0c;达到IP67等级的防护性能&#xf…

FastAPI 学习之路(三十八)Static Files

如果使用前后台不分离的开发方式&#xff0c;那么模版文件中使用的静态文件&#xff0c;比如css/js等文件的目录需要在后台进行配置&#xff0c;以便模版渲染是能够正确读取到这些静态文件的。那么我们如何处理呢&#xff1f; 首先安装依赖 pip install aiofiles 我们看下如何…

蓝队必备技能--yara-让自己编写AVVT

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

51单片机STC89C52RC——16.1 五线四相步进电机

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 2.2.1 步进电机驱动板 静态参数 动态参数 2.2.2 五线四相 单相激励步进 双相激励步进 混合激励驱动 2.3 细分驱动 2.4 通过数字信号控制旋转位置和转速。 2…

基于Java+Vue的场馆预约系统源码体育馆羽毛球馆篮球馆预约

市场前景 市场需求持续增长&#xff1a;近年来&#xff0c;随着人们生活水平的提高和休闲娱乐需求的多样化&#xff0c;各类场馆&#xff08;如体育馆、图书馆、博物馆、剧院等&#xff09;的访问量不断增加。然而&#xff0c;传统的预约方式往往存在效率低下、信息不透明等问…

AI算力中心研究分析

中国 AI 算力中心研究报告 算力产业稳健发展&#xff0c;算力创新能力持续增强&#xff0c;推动我国数字经济量质齐升。 2022 年我国算力规模稳步扩张&#xff0c;算力发展为拉动我国 GDP 增长做出突出贡献&#xff0c;在 2016-2022 年期间&#xff0c;我国算力规模平均每年增…

[计算机网络] VPN技术

VPN技术 1. 概述 虚拟专用网络&#xff08;VPN&#xff09;技术利用互联网服务提供商&#xff08;ISP&#xff09;和网络服务提供商&#xff08;NSP&#xff09;的网络基础设备&#xff0c;在公用网络中建立专用的数据通信通道。VPN的主要优点包括节约成本和提供安全保障。 优…

IT专业入门,高考假期预习指南(C++学习路线)

目录 IT专业入门&#xff0c;高考假期预习指南 一、V C的学习内容: 二、C学习书籍: 三、学习网站: 四、技术学习路线图&#xff1a; IT专业入门&#xff0c;高考假期预习指南 七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而…

程序设计与问题求解 实验二 循环结构程序设计

目录 引言 一&#xff0e;实验目的&#xff1a; 二、实验内容和步骤: 1. 分析并修改下面程序错误&#xff0c;使之能够正常运行。 2. 编写程序实现以下功能 三、实验小结 引言 我想把大学期间写的材料挑选一些发上来保存一下&#xff0c;这是本人大学期间做的一次实验作业…

小型内衣裤洗衣机哪个牌子好?五大卓越臻品不容错过!

随着科技的发展&#xff0c;市面上也出现许多便利的小家电。其中被多次讨论起来的莫过于是内衣洗衣机&#xff0c;选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;随着内衣洗衣机的爆火&#xff0c;…

Python机器学习推理工程化落地步骤指南

目录 一、引言 二、数据准备 2.1 数据收集 2.2 数据清洗 2.3 特征工程 2.4 数据分割 三、模型训练 3.1 选择算法 3.2 训练模型 3.3 模型评估 3.4 模型调优 四、模型部署 4.1 模型序列化 4.2 构建推理服务 4.3 部署与监控 五、总结 在当今科技飞速发展的时代…

【SD教程】全网最详细的AI绘画提示词语法讲解!(附提示词插件包)

AI绘画提示词如何写&#xff1f;对于入门的小伙伴来说这是一个大问题&#xff0c;提示词写的好&#xff0c;才能有高质量的作品&#xff0c;那今天给大家详细讲解一下&#xff0c;建议点赞收藏&#xff01; 文末附提示词插件 一、SD提示词基础 AI绘画提示词基本规则 1、提示…

AI时代的产品经理的成长之路:可能是小宇宙最全的产品经理指南

2019年&#xff5e;2021年期间&#xff0c;我在做智能写作项目创业的时候&#xff0c;由于当时市场相关产品较少&#xff0c;遇到了问题没有可以参考的竞品。 我们只能一路探索&#xff0c;一路踩坑&#xff0c;一路修正。随着产品的迭代&#xff0c;我也在不断地迭代自己的认…

牛刀小试--三元对角矩阵压缩存储

详细解析博客 对角矩阵的压缩存储_对角矩阵压缩存储-CSDN博客 功能函数: //为N阶对角矩阵初始化成的一维数组分配空间 void Init_opposite_angles_matrix(int *&matrix); //返回二维对角矩阵的值(压缩存取) int get_Value_opposite_angles_matrix(int matrix[],int x,int …

充电桩语音芯片方案选型:让充电体验更智能化

在新能源汽车日益普及的今天&#xff0c;充电桩作为其“加油站”般的存在&#xff0c;其智能化、人性化的设计显得尤为重要。而语音芯片&#xff0c;正是这一智能化趋势下的重要一环。 一、NV020C语音芯片概述 NV020C是一款性能稳定的语音芯片&#xff0c;无需任何外围电路&…

【C++】类和面向对象很懵?其实很简单

有不少朋友会遇到这种情况&#xff0c;在学完C入门的一些知识后&#xff0c;就开始接触类和面向对象的概念&#xff0c;大家去看书、文章的时候都会先抛出一大堆的概念&#xff0c;导致我们听得很懵。那么这篇文章将言简意赅&#xff0c;理解类和面向对象其实很简单&#xff01…

apple watch程序出错 Cannot launch apps while in nightstand mode

开发的时候运行apple watch程序出错&#xff1a; ailure Reason: The request was denied by service delegate (IOSSHLMainWorkspace) for reason: Busy ("Cannot launch apps while in nightstand mode"). 这是因为&#xff1a; 将Apple Watch放在充电器上并直立…

.net C# 使用网易163邮箱搭建smtp服务,实现发送邮件功能

功能描述&#xff1a;使用邮箱验证实现用户注册激活和找回密码。邮箱选择网易163作为smtp服务器。 真实测试情况&#xff1a;第一种&#xff1a;大部分服务器运行商的25端口默认是封禁的&#xff0c;可以联系运营商进行25端口解封&#xff0c;解封之后可以使用25端口。第二种&…

matlab R2016b安装cplex12.6,测试时cplex出现出现内部错误的解决方法

问题场景 网上搜索matlabyalmipcplex的安装教程&#xff0c;跟着步骤操作即可&#xff0c;假如都安装好了&#xff0c;在matlab中测试安装是否成功&#xff0c;出现以下问题&#xff1a; 1、matlab中设置路径中添加了yalmip和cplex路径&#xff0c;在命令窗口中输入yalmiptest…