首页 > 其他分享 >深入浅出 Server-Sent Events (SSE) 技术

深入浅出 Server-Sent Events (SSE) 技术

时间:2024-12-31 22:52:15浏览次数:1  
标签:实时 Server SSE 推送 Events Sent 客户端

深入浅出 Server-Sent Events (SSE) 技术

随着实时 Web 应用需求的增长,传统的 HTTP 请求响应模式已不能完全满足需求。Server-Sent Events (SSE) 提供了一种简单、高效的方式,使服务器可以向客户端推送实时数据。本文将全面介绍 SSE 的工作原理、使用场景、与其他技术的对比,以及如何在实际项目中应用。


什么是 Server-Sent Events (SSE)

Server-Sent Events 是一种基于 HTTP 协议的服务器推送技术,允许服务器通过单向的方式向客户端发送实时更新的数据流。SSE 是 HTML5 的一部分,支持原生的浏览器事件流监听机制,使用简单且高效。

工作原理

  • 单向通信:服务器主动向客户端发送消息,客户端只能接收而不能向服务器发送。
  • 持久连接:客户端通过 EventSource 与服务器建立长连接,服务器保持连接并持续推送数据。
  • 文本流格式:SSE 传输的数据是基于纯文本的事件流格式,包含事件名称、数据、ID 等。

浏览器支持

SSE 原生支持绝大多数现代浏览器,但在 IE 和部分老旧浏览器中不支持,需要使用 polyfill 或其他技术替代。


SSE 的优势

  1. 简单易用:使用原生 API,无需额外引入复杂的库或协议解析。
  2. 实时推送:适用于实时性要求较高的应用场景,例如股票行情、新闻更新、游戏动态等。
  3. 轻量级:基于文本流,开销较低,适合对资源要求较低的实时应用。
  4. 自动重连:浏览器原生支持断线后的自动重连功能,增强了系统的稳定性。
  5. 带状态更新:通过事件 ID,客户端可以恢复到断线前的状态,避免数据丢失。

SSE 的使用场景

  • 实时数据更新:如股票、天气、社交媒体动态等。
  • 消息通知:如邮件提醒、任务进度更新等。
  • 轻量级监控:如服务健康状态、服务器性能指标的实时监控。
  • 实时日志流:如开发调试中的日志推送或审计日志流。

实现 SSE 的基础步骤

客户端实现

SSE 的客户端实现非常简单,可以通过 JavaScript 的 EventSource 接口进行操作。

const eventSource = new EventSource('/sse-endpoint');

// 监听默认消息
eventSource.onmessage = (event) => {
    console.log('Received message:', event.data);
};

// 监听特定事件类型
eventSource.addEventListener('customEvent', (event) => {
    console.log('Received customEvent:', event.data);
});

// 处理连接错误
eventSource.onerror = () => {
    console.log('Connection error, attempting to reconnect...');
};

服务器端实现

以 Node.js 为例,服务器端可以通过 Content-Type: text/event-stream 来声明 SSE 数据流,并发送事件。

const http = require('http');

http.createServer((req, res) => {
    if (req.url === '/sse-endpoint') {
        res.writeHead(200, {
            'Content-Type': 'text/event-stream',
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive',
        });

        const sendEvent = (data) => {
            res.write(`data: ${JSON.stringify(data)}\n\n`);
        };

        // 定时发送数据
        const interval = setInterval(() => {
            sendEvent({ timestamp: Date.now(), message: 'Hello, SSE!' });
        }, 1000);

        // 清理资源
        req.on('close', () => {
            clearInterval(interval);
        });
    }
}).listen(3000, () => console.log('Server running on http://localhost:3000'));

SSE 与其他实时技术的对比

特性Server-Sent EventsWebSocket长轮询
通信模式 单向 双向 单向
实现复杂度 简单 较复杂 简单
数据格式 文本 二进制或文本 任意
浏览器支持 广泛 广泛 广泛
连接开销
适用场景 实时数据推送 交互式实时通信(如聊天) 简单实时更新

选择建议

  • 如果需要双向通信,选择 WebSocket。
  • 如果需要简单的实时数据流,选择 SSE。
  • 如果不支持持久连接或需要兼容性,选择长轮询。

SSE 的局限性

  1. 单向通信:SSE 仅支持服务器向客户端推送数据,不能实现双向通信。
  2. 基于 HTTP/1.1:SSE 不能利用 HTTP/2 的多路复用特性,相较 WebSocket 效率稍低。
  3. 跨域限制:SSE 的跨域请求需要通过 CORS 配置支持。
  4. 文件传输不佳:SSE 不适合大文件或二进制数据的传输。

总结

Server-Sent Events 是一种轻量级、易用的实时数据推送技术,适合单向实时数据的传输。通过简单的实现步骤和低成本的维护,它在很多场景中成为 WebSocket 的良好替代方案。尽管存在局限性,但在实际项目中,合理地结合 SSE 和其他技术,可以极大提升应用的实时性能和用户体验。

如果您需要实现实时功能,不妨试试 SSE。

标签:实时,Server,SSE,推送,Events,Sent,客户端
From: https://www.cnblogs.com/xd502djj/p/18644869

相关文章

  • CSSE2310/CSSE7231 AI tools
    CSSE2310/CSSE7231DocumentationrequiredfortheuseofAItoolsVersion1.0TheUniversityofQueenslandSchoolofInformationTechnologyandElectricalEngineeringFebruary2023CSSE2310/7231assignmentsmaypermittheinclusionofcodegeneratedbyAI......
  • PerformanceObserver.observe
    PerformanceObserver.observe(Objectoptions)基础库2.11.0开始支持,低版本需做兼容处理。小程序插件:不支持功能描述开始监听参数Objectoptions设置type监听单个类型的指标,设置entryTypes监听多个类型指标。属性类型默认值必填说明typestring......
  • sql server 存储过程
    SQLServer存储过程笔记什么是存储过程(StoredProcedure)存储过程是预编译的SQL语句集合,存储在SQLServer数据库中,可以通过名称调用。它们通常用于执行复杂的操作、数据验证、错误处理或批量数据操作。存储过程可以接受输入参数,执行一系列的SQL操作,并返回结果或状态......
  • PerformanceObserver
    PerformanceObserver基础库2.11.0开始支持,低版本需做兼容处理。PerformanceObserver对象,用于监听性能相关事件属性ArraysupportedEntryTypes获取当前支持的所有性能指标类型方法PerformanceObserver.observe(Objectoptions)开始监听PerformanceObserver.disconnec......
  • 元素定位(调试环境:appium-server+inspector+模拟器)
    fromappiumimportwebdriverfromappium.options.androidimportUiAutomator2Optionsfromappium.webdriver.common.appiumbyimportAppiumByasBy创建一个UiAutomator2Options对象options=UiAutomator2Options()options.platform_name="Android"options......
  • WindowsServer2025官方正式版24年12月版(微软原版ISO镜像)
    MicrosoftWindowsServer202524H2官方简体中文正式版2024年12月更新版(微软原版ISO镜像)简体中文零售版2024年12月版(含标准版/标准桌面体验版/数据中心版/数据中心桌面体验版)仅64位版:WindowsServer2025Standard、WindowsServer2025Standard(DesktopExperience)......
  • dataclasses模块
    python通过dataclasses模块提供了dataclass(数据类)对象,适合我们想定义一些类,并且让他们主要用于存放数据。dataclass:是一个函数,用做装饰器,把一个类变成数据类。数据类可以让我们通过简单的方法定义实例属性以及对其赋值,并使用类型提示标明其类型。通过一些元类的定制化,数据......
  • java.sql.SQLException: CLI-specific condition, message from server: "Host '10.1
    您遇到的错误信息表明,MySQL服务器由于检测到来自主机'10.11.xxx.xx'的多次连接错误而自动封锁了该主机的连接请求。这是一种数据库安全机制,旨在防止潜在的恶意攻击或配置不当导致的资源滥用。要解决这个问题,您可以采取以下步骤:检查网络连接:确保客户端和服务器之间的网络稳定,并......
  • Cloudera集群运维-如何优化Hbase Regionserver GC
    [前]RegionServerGC调优【警告】为HBase配置JVM垃圾回收是一项高级操作。配置不当可能对集群的性能产生重大影响。请仔细测试任何配置更改。【警告】 使用OpenJDK11时,ClouderaManager和大多数ClouderaRuntime服务使用G1GC作为默认的垃圾回收方法。(Java8......
  • Azure DevOps Server:从测试套件中移除测试用例返回414错误
    问题描述在AzureDevOpsServer(2022之前的多个版本)中,如果测试套件中包含的许多测试用例,当我们批量删除测试用例时,系统会返回414错误,导致不能删除测试用例。解决方案导致上述问题的根源是产品组在设计接口的时候,使用Url的参数传递测试用例ID,如果数据量不大,或者用例工作项ID较小,都不......