当前位置: 首页 > article >正文

SSE服务器主动推送至浏览器客户端,让你不再需要websocket

Server-Sent Events(SSE)是一种服务器向客户端推送实时更新的技术,基于HTTP协议。客户端通过EventSource API来接收事件流,而服务器则保持一个长连接,持续发送数据。这与传统的请求-响应模式不同,允许服务器主动推送数据,而不是等待客户端请求。

客户端通过创建一个EventSource对象,指定服务器的URL。服务器设置特定的HTTP头(如Content-Type: text/event-stream)并保持连接打开。服务器可以周期性或根据事件发送数据,数据格式遵循SSE的规范,每条消息以"data: "开头,后跟数据内容,用两个换行结束。

然后,优缺点分析。优点是简单易用,基于HTTP,兼容性好,适合低频更新。缺点是单向通信,服务器到客户端,不支持客户端发送数据;同时,HTTP协议本身不是为长连接设计的,可能在某些情况下效率不如WebSocket。

适用场景包括实时新闻推送、股票行情更新、日志监控等不需要高频双向通信的场景。而如果应用需要高频通信或双向通信,WebSocket可能更合适。

最后,可能需要提到一些实现细节,比如数据格式、事件类型、重试机制等,以及如何在不同后端语言中实现SSE,比如java、PHP、Node.js等。

1. 工作原理

  • 客户端:通过 JavaScript 的 EventSource API 建立长连接
  • 服务端:设置 Content-Type: text/event-stream 响应头,保持连接持续打开
  • 通信方式:服务器按需发送文本数据流(UTF-8 编码),客户端自动解析

2. 核心优势

  • 轻量级:基于 HTTP 协议,无需复杂握手
  • 自动重连:内置断线重试机制
  • 兼容性佳:所有现代浏览器均支持
  • 简单实现:服务端只需保持长连接并发送文本流

3. 典型应用场景

  • 实时数据看板(如股票行情、系统监控)
  • 日志流实时查看
  • 通知推送系统
  • 协作工具中的实时更新

4. 与 WebSocket 对比

特性SSEWebSocket
通信方向单向(服务器→客户端)双向
协议HTTP独立协议
连接数天然支持多标签页共享需自行处理多连接
数据格式文本流二进制/文本
适用场景低频更新高频/双向通信

5. 最佳实践建议

  • 频率控制:建议至少间隔 1 秒发送数据,避免高频触发重绘
  • 数据压缩:使用 gzip 或 deflate 压缩传输内容
  • 错误处理:监听 onerror 事件并实现自动重连逻辑
  • 性能优化:结合 Last-Event-ID 实现断点续传
  • 安全退出:结束时发送空消息或特殊标识(如 data: END)

6. 代码示例

服务端源码

const express = require('express');
const app = express();
const port = 3000;// 静态文件服务
app.use(express.static('public'));// SSE路由
app.get('/events', (req, res) => {// 设置SSE所需的头信息res.writeHead(200, {'Content-Type': 'text/event-stream','Cache-Control': 'no-cache','Connection': 'keep-alive'});// 发送初始消息res.write('data: Connected to SSE server\n\n');// 定时发送消息let counter = 0;const intervalId = setInterval(() => {counter++;const data = {message: `Server time: ${new Date().toISOString()}`,counter: counter};res.write(`data: ${JSON.stringify(data)}\n\n`);// 模拟结束条件if (counter >= 10) {res.write('event: end\ndata: Stream ended\n\n');clearInterval(intervalId);res.end();}}, 1000);// 客户端断开连接时清理req.on('close', () => {console.log('Client disconnected');clearInterval(intervalId);res.end();});
});app.listen(port, () => {console.log(`SSE server running at http://localhost:${port}`);
});

客户端H5页面端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>SSE Demo</title>
</head>
<body><h1>Server-Sent Events Demo</h1><div id="events"></div><script>const eventSource = new EventSource('/events');const eventsDiv = document.getElementById('events');// 监听默认消息事件eventSource.onmessage = function(e) {const data = JSON.parse(e.data);const p = document.createElement('p');p.textContent = `${data.message} (Count: ${data.counter})`;eventsDiv.appendChild(p);};// 监听自定义事件eventSource.addEventListener('end', function(e) {const p = document.createElement('p');p.textContent = `Event: ${e.type}, Data: ${e.data}`;eventsDiv.appendChild(p);eventSource.close();console.log('EventSource closed');});// 错误处理eventSource.onerror = function(e) {console.error('EventSource failed:', e);eventSource.close();};</script>
</body>
</html>

7. 注意事项

  1. 连接管理:确保在客户端断开连接时清理定时器和资源

  2. 重连机制:SSE客户端会自动尝试重新连接

  3. CORS:如果客户端和服务器不同源,需要设置CORS头

  4. 性能考虑:对于大量客户端连接,考虑使用专门的解决方案如Redis PUB/SUB

  5. 浏览器支持:大多数现代浏览器都支持SSE,但不包括IE

SSE 适用于大多数实时性要求不高的场景,如实时通知、股票行情、新闻推送等。其简洁性和兼容性使其成为轻量级实时通信的首选方案。对于需要双向通信或高频更新的场景,建议考虑 WebSocket 技术。

相关文章:

SSE服务器主动推送至浏览器客户端,让你不再需要websocket

Server-Sent Events&#xff08;SSE&#xff09;是一种服务器向客户端推送实时更新的技术&#xff0c;基于HTTP协议。客户端通过EventSource API来接收事件流&#xff0c;而服务器则保持一个长连接&#xff0c;持续发送数据。这与传统的请求-响应模式不同&#xff0c;允许服务器…...

UE5新材质系统效果Demo展示

1、玉质材质&#xff0c;透明玻璃材质&#xff0c;不同透射和散射。 2、浅水地面&#xff0c;地面层&#xff0c;水层&#xff0c;地面湿度&#xff0c;水面高度&#xff0c;水下扰动&#xff0c;水下浇洒&#xff0c;水下折射 Substrate-Water Substrate-Water-CodeV2...

wps 怎么显示隐藏文字

wps 怎么显示隐藏文字 》文件》选项》视图》勾选“隐藏文字” wps怎么设置隐藏文字 wps怎么设置隐藏文字...

解决 macOS (M1 Pro) 上使用 Vite 进行 Build 打包时 Node 进程内存溢出的问题

解决 macOS (M1 Pro) 上使用 Vite 进行 Build 打包时 Node 进程内存溢出的问题 在搭载 M1 Pro 芯片的 macOS 系统上&#xff0c;使用 Vite 进行项目构建&#xff08;build&#xff09;时&#xff0c;您可能会遇到 Node 进程内存溢出的错误。特别是在使用较新版本的 Node.js&am…...

页面重构过程中如何保证良好的跨浏览器一致性?

在页面重构的过程中&#xff0c;为了确保网页能够在不同的浏览器中呈现一致的效果&#xff0c;我们需要采取一系列措施来提高跨浏览器的一致性。以下是几个关键步骤和技术要点&#xff1a; 使用标准化的HTML和CSS&#xff1a;始终遵循最新的Web标准编写代码&#xff0c;例如采用…...

CXL UIO Direct P2P学习

前言&#xff1a; 在CXL协议中&#xff0c;UIO&#xff08;Unordered Input/Output&#xff09; 是一种支持设备间直接通信&#xff08;Peer-to-Peer, P2P&#xff09;的机制&#xff0c;旨在绕过主机CPU或内存的干预&#xff0c;降低延迟并提升效率。以下是UIO的核心概念及UI…...

leetcode138.随即链表的复制

思路源于 【力扣hot100】【LeetCode 138】随机链表的复制&#xff5c;哈希表 采用一个哈希表&#xff0c;键值对为<原链表的结点&#xff0c;新链表的结点>&#xff0c;第一次遍历原链表结点时只创建新链表的结点&#xff0c;第二次遍历原链表结点时&#xff0c;通过键拿…...

03_MySQL工具介绍

文章目录 一、Navicat for MySQL1.1、安装 二、SQLyog2.1、安装 多数时候使用SQL语句对数据库进行操作不是很方便&#xff0c;特别是在查询操作时&#xff0c;显示的内容不够直观&#xff0c;此时我们需要借助图形化工具对数据库进行操作。 操作MySQL常用的图形工具如下&#x…...

《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 1 环境 openEuler 22.03 LTSsp4PHP 8.0Apache 2Mysql 8.0zabbix6.2.4 表1-1 Zabbix网络规划&#xff08;用你们自己的特征网段规划&#xff09; 主机名 IP 功能 备注 zbx6svr 19…...

Qt Creator 中文 “error: C2001: 常量中有换行符“ 问题解决方法

Qt Creator 编译时出现‌中文 error: C2001: 常量中有换行符‌的问题&#xff0c;通常由文件编码与编译器字符集不兼容导致。 一、修改文件编码格式 ‌添加 UTF-8 BOM 签名‌ 在 Qt Creator 中设置&#xff1a;工具 -> 选项 -> 文本编辑器 -> 行为 -> UTF-8 BOM&a…...

Charles 抓包配置保姆教程(PC、IOS、Android)

抓包工具基础配置与使用指南 大家好&#xff0c;我是十一&#xff01;今天给大家分享一篇关于抓包工具的基础配置与使用指南。无论是开发、测试还是安全分析&#xff0c;抓包工具都是不可或缺的利器。本文将详细介绍如何配置和使用抓包工具&#xff0c;并特别推荐一款功能强大…...

洛谷题单1-P1001 A+B Problem-python-流程图重构

题目描述 输入两个整数 a,b&#xff0c;输出它们的和&#xff08;∣a∣,∣b∣≤109&#xff09;。 输入格式 两个以空格分开的整数。 输出格式 一个整数。 输入输出样例 输入 20 30输出 50方式-print class Solution:staticmethoddef oi_input():"""从…...

el-table 动态给每行增加class属性

el-table 动态给每行增加class属性 html代码 row-class-name属性&#xff0c;绑定方法 :row-class-name“tableRowClassName”, <el-table :data"tableData" border :row-class-name"tableRowClassName"> </el-table>js代码 tableRowClassNam…...

Opencv计算机视觉编程攻略-第四节 图直方图统计像素

Opencv计算机视觉编程攻略-第四节 图直方图统计像素 1.计算图像直方图2.基于查找表修改图像3.直方图均衡化4.直方图反向投影进行内容查找5.用均值平移法查找目标6.比较直方图搜索相似图像7.用积分图统计图像 1.计算图像直方图 图像统计直方图的概念 图像统计直方图是一种用于描…...

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过&#xff0c;二者有一点小区别&#xff1a;SimpleRNN层能够像其他Keras层一样处理序列批量&#xff0c;而不是像NumPy示例中的那样只能处理单个序列。也就是说&#xff0c;它接收形状为(batch_si…...

Mysql 索引性能分析

1.查看CRUD次数 show global status like Com_______&#xff08;7个下划线&#xff09; show global status like Com_______ 2.慢SQL分析 SET GLOBAL slow_query_log ON;-- 设置慢SQL日志记录开启 SET GLOBAL long_query_time 2; -- 设置执行超过 2 秒的查询为慢查询 开…...

win11+ubuntu双系统安装

操作步骤&#xff1a; 官网下载ubuntu 最新镜像文件 准备U盘 准备一个容量不小于 8GB 的 U 盘&#xff0c;用于制作系统安装盘。制作过程会格式化 U 盘&#xff0c;请注意提前备份数据。 制作U盘启动盘 使用rufus工具&#xff0c;或者 balenaEtcher工具&#xff08;官网安…...

linux-5.10.110内核源码分析 - 写磁盘(从VFS系统调用到I/O调度及AHCI写磁盘)

1、VFS写文件到page缓存(vfs_write) 1.1、写裸盘(dd) 使用如下命令写裸盘&#xff1a; dd if/dev/zero of/dev/sda bs4096 count1 seek1 1.2、系统调用(vfs_write) 系统调用栈如下&#xff1a; 对于调用栈的new_sync_write函数&#xff0c;buf为写磁盘的内容的内存地址&…...

arinc818 fpga单色图像传输ip

arinc818协议支持的常用线速率如下图 随着图像分辨率的提高&#xff0c;单lane的速率无法满足特定需求&#xff0c;一种方式是通过多个LANE交叉的去传输图像&#xff0c;另外一种是通过降低图像的带宽&#xff0c;即通过只传单色图像达到对应的效果 程序架构如下图所示&#x…...

业务流程先导及流程图回顾

一、测试流程回顾 &#xfeff; 1. 备测内容回顾 &#xfeff; 备测内容: 本次测试涵盖买家和卖家的多个业务流程&#xff0c;包括下单流程、发货流程、搜索退货退款、支付抢购、换货流程、个人中心优惠券等。 2. 先测业务强调 &#xfeff; 1&#xff09;测试业务流程 …...

HCIP(RSTP+MSTP)

一、STP的重新收敛&#xff1a; 复习STP接口状态 STP初次收敛至少需要50秒的时间。STP的重新收敛情况&#xff1a; 检测到拓扑变化&#xff1a;当网络中的链路故障或新链路加入时&#xff0c;交换机会检测到拓扑变化。 选举新的根桥&#xff1a;如果原来的根桥故障或与根桥直…...

《无线江湖五绝:BLE/WiFi/ZigBee的频谱大战》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 文章目录 **第一回武林大会&#xff0c;群雄并起****第二回WiFi的“降龙十八掌”****第三回BLE的“峨眉轻功”****第四回ZigBee的“暗器百解”****第五回LoRa的“千里传音”****第六回NB…...

QT第六课------QT界面优化------QSS

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

本地化智能运维助手:基于 LangChain 数据增强 和 DeepSeek-R1 的K8s运维文档检索与问答系统 Demo

写在前面 博文内容为基于 LangChain 数据增强 和 Ollams 本地部署 DeepSeek-R1实现 K8s运维文档检索与问答系统 Demo通过 Demo 对 LEDVR 工作流&#xff0c; 语义检索有基本认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我看远山&#xff0c;远山悲悯 持续分享技术干货…...

C++ STL常用算法之常用算术生成算法

常用算术生成算法 学习目标: 掌握常用的算术生成算法 注意: 算术生成算法属于小型算法&#xff0c;使用时包含的头文件为 #include <numeric> 算法简介: accumulate // 计算容器元素累计总和 fill // 向容器中添加元素 accumulate 功能描述: 计算区间内容器元素…...

Tof 深度相机原理

深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术&#xff1a;原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机&#xff08;二&#xff09;——飞行时间&#xff08;TOF&#xff09;_飞行时间技术-C…...

【Linux篇】进程入门指南:操作系统中的第一步

步入进程世界&#xff1a;初学者必懂的操作系统概念 一. 冯诺依曼体系结构1.1 背景与历史1.2 组成部分1.3 意义 二. 进程2.1 进程概念2.1.1 PCB&#xff08;进程控制块&#xff09; 2.2 查看进程2.2.1 使用系统文件查看2.2.2 使⽤top和ps这些⽤⼾级⼯具来获取2.2.3 通过系统调用…...

JavaScript 中的原型链与继承

JavaScript 是一种基于原型的编程语言&#xff0c;这意味着它的对象继承是通过原型链而非类的机制来实现的。原型链是 JavaScript 中对象与对象之间继承属性和方法的基础。本文将深入探讨 JavaScript 中的原型链和继承机制&#xff0c;帮助你理解这一重要概念。 一、原型&…...

无线通信技术(二):ITU、3GPP及传统波段对无线频谱的划分

目录 一.ITU波段划分 二.3GPP频带划分&#xff08;仅介绍5G NR&#xff09; 2.1 频带分类 2.2 频带划分表 2.2.1 FR1 2.2.2 FR2 2.3 全球部署趋势 三.传统波段划分 3.1 射频工程中的微波 3.2 军用雷达波段命名 本文介绍国际标准组织ITU、3GPP和传统波段对无线频谱的划…...

Android 系统ContentProvider流程

一、ContentProvider初始化注册流程 源码查看路径&#xff1a;http://xrefandroid.com/android-11.0.0_r48/ 涉及到源码文件&#xff1a; /frameworks/base/core/java/android/content/ContentProvider.java 自定义ContentProvider需要继承该类,内部类Transport继承关系如下,实…...