”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 服务器发送事件 (SSE) 的工作原理

服务器发送事件 (SSE) 的工作原理

发布于2024-11-05
浏览:904

How Server-Sent Events (SSE) Work

SSE(服务器发送事件)在 Web 开发领域并未广泛使用,本文将深入探讨 SSE 是什么、它是如何工作的以及它如何受益您的申请。


什么是上交所?

SSE 是一种通过 HTTP 连接从服务器向客户端发送实时更新的简单而有效的方法。它是 HTML5 规范的一部分,并受到所有现代 Web 浏览器的支持。 SSE 基于单向数据流,服务器向客户端发送消息,但客户端无法将消息发送回服务器。

SSE 使用称为“服务器发送事件”的基于文本的格式将数据发送到客户端。数据作为一系列事件发送,每个事件包含一条消息和一个可选的事件类型。事件类型用于区分不同类型的消息,并允许客户端以不同的方式处理它们。

上交所如何运作?

SSE 协议的工作原理是在服务器和客户端之间建立持久的 HTTP 连接。只要客户端想要从服务器接收更新,此连接就会保持打开状态。当服务器有新数据要发送时,它会发送具有特殊 MIME 类型“text/event-stream”的 HTTP 响应。

响应包含一系列事件,每个事件由换行符(“\n”)分隔。每个事件都有以下格式:

event: [event type]\n
data: [message]\n\n

“事件”字段是可选的,用于提供事件的名称。 “数据”字段包含正在发送的实际消息。每个事件末尾的两个换行符用于表示事件结束。

这是一个简单的 SSE 响应示例:

HTTP/1.1 200 OK
Content-Type: text/event-stream

event: message
data: Hello, world!

event: message
data: This is a test message.

event: customEvent
data: {"foo": "bar", "baz": 123}

在此示例中,我们向客户端发送三个事件。前两个事件的事件类型为“消息”并包含简单的文本消息。第三个事件的事件类型为“customEvent”,并包含一个 JSON 对象作为其消息。

当客户端收到 SSE 响应时,它使用该数据来更新其用户界面。例如,这可以使用 JavaScript 来操作 DOM 来完成。

实施上交所

在您的应用程序中实现 SSE 相对简单。以下是如何使用 Node.js 和 Express 框架实现 SSE 的示例:

const express = require('express');
const app = express();

// Set up SSE endpoint
app.get('/events', (req, res) => {
  // Set headers
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');
  // Send initial event
  res.write('data: Connected\n\n');
  // Set interval to send periodic events
  const intervalId = setInterval(() => {
    res.write('data: Hello, world!\n\n');
  }, 1000);
  // Clean up on connection close
  req.on('close', () => {
    clearInterval(intervalId);
  });
});

// Start server
app.listen(3000, () => {
  console.log('Server started on port 3000');
});

在此示例中,我们在“/events”处设置 SSE 端点。我们正在为 SSE 设置必要的标头并向客户端发送初始事件以确认连接已建立。

然后我们设置一个间隔,每秒向客户端发送周期性事件。最后,我们清理客户端关闭连接的时间间隔。

在客户端,我们可以使用以下JavaScript代码来监听SSE事件:

const source = new EventSource('/events');

source.addEventListener('message', (event) => {
  console.log(event.data);
});
source.addEventListener('error', (event) => {
  console.error('Error:', event);
});

在此示例中,我们将创建一个新的 EventSource 对象并传入 SSE 端点的 URL。然后,我们监听“消息”事件并将数据记录到控制台。我们还会监听“错误”事件,以防出现任何连接问题。

注意前端的EventSource路径只能被GET请求使用,如果要使用POST等HTTP方法,需要自己解析响应数据。

如果您想要原生 Node.js 实现,这里有一个

SSE 用例

SSE 可用于各种需要实时更新的应用程序。以下是一些示例:

  • 社交媒体平台:SSE可用于为社交媒体平台提供实时更新,例如新消息、评论或点赞的通知。

  • 金融应用:上交所可用于为金融应用提供实时更新,例如股票价格、货币汇率或新闻。

  • 在线游戏:SSE可用于为在线游戏应用程序提供实时更新,例如游戏事件、比分或排名的通知。

使用 SSE 的好处

与其他实时通信方法(例如轮询或 WebSockets)相比,使用 SSE 有几个好处:

效率

SSE 使用持久 HTTP 连接,这意味着建立和维护连接的开销比其他方法低得多。这使得 SSE 更加高效且资源占用更少,这在处理大量客户时尤其重要。

简单

SSE 是一个简单的协议,易于理解和实现。它不需要任何特殊的库或框架,可以使用标准的 Web 技术(例如 JavaScript 和 HTTP)来实现。

可靠性

SSE 是一种可靠的协议,可以在网络中断的情况下提供自动重新连接。这确保即使连接暂时丢失,客户端也将继续接收更新。

结论

服务器发送事件 (SSE) 是一种通过 HTTP 连接从服务器向客户端发送实时更新的简单而有效的方法。它是 HTML5 规范的一部分,并受到所有现代 Web 浏览器的支持。 SSE 使用单向数据流,服务器向客户端发送消息,但客户端无法将消息发送回服务器。这使您无需不断轮询服务器以查找事件,这不仅提高了性能,还降低了复杂性。

如果您觉得这有帮助,请考虑 订阅我的时事通讯 以获取更多有关 Web 开发的有用文章和工具。感谢您的阅读!

版本声明 本文转载于:https://dev.to/zacharylee/how-server-sent-events-sse-work-450a?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 使用 React 构建的排序算法可视化工具
    使用 React 构建的排序算法可视化工具
    大家好!我刚刚完成了我的第一个真正的宠物项目 - 一个使用 React 构建的排序算法可视化工具。 ? GitHub 仓库:https://github.com/Fedorse/Sorting-Algorithm-Visualizer 现场演示:https://algorithms-virid.ve...
    编程 发布于2024-11-06
  • 为 Angular 18 创建基本框架
    为 Angular 18 创建基本框架
    Ранее рассматривалось создание и настройка нового проекта Angular. В данной статье разберем базовую структуру. Напомню, что цикл посвящен разработке ...
    编程 发布于2024-11-06
  • 如何访问Go的CGo中的联合字段?
    如何访问Go的CGo中的联合字段?
    在 Golang CGo 中将 Union 字段转换为 Go 类型在 Golang CGo 中使用 C 结构时,访问 union 字段可能是一个挑战。常见场景涉及访问 C 结构内值联合中的 ui32v 字段,如下例所示:struct _GNetSnmpVarBind { guint32 ...
    编程 发布于2024-11-06
  • 在 JavaScript 中使用最小和最大堆管理流数据:数字运动员健康技术视角
    在 JavaScript 中使用最小和最大堆管理流数据:数字运动员健康技术视角
    数据管理在健康技术中至关重要。无论是跟踪运动员的表现指标还是监控运动员的恢复时间,有效地组织数据都可以对洞察的获取方式产生重大影响。在这种情况下管理数据的一种强大工具是堆,特别是最小堆和最大堆。在这篇文章中,我们将使用与运动员数据管理相关的实际示例,探讨如何在 JavaScript 中实现和使用最小...
    编程 发布于2024-11-06
  • 使用 Matplotlib 绘图时,为什么性能会受到影响以及可以采取什么措施?
    使用 Matplotlib 绘图时,为什么性能会受到影响以及可以采取什么措施?
    Matplotlib 绘图的性能注意事项在评估不同的 Python 绘图库时,使用 Matplotlib 时可能会遇到性能问题。本文探讨了 Matplotlib 绘图速度缓慢的原因,并提供了提高其速度的解决方案。速度缓慢的原因Matplotlib 性能缓慢主要源于两个因素:频繁重绘: 每次调用 Fi...
    编程 发布于2024-11-06
  • S - 单一职责原则(SRP)
    S - 单一职责原则(SRP)
    Single Responsibility Principle(SRP) The Single Responsibility Principle(SRP) is the first of the SOLID principles, which plays an important ...
    编程 发布于2024-11-06
  • 如何修复 PHP 通过 SSH 连接 MySQL 时的 mysqli_connect() 参数问题?
    如何修复 PHP 通过 SSH 连接 MySQL 时的 mysqli_connect() 参数问题?
    在 PHP 中通过 SSH 连接到 MySQL 服务器使用 PHP 函数通过 SSH 建立与远程 Linux 计算机上托管的 MySQL 数据库的连接可能具有挑战性。使用提供的代码时,可能会出现错误“mysqli_connect()期望参数6为字符串,给定资源”。理解问题代码尝试使用mysqli_c...
    编程 发布于2024-11-06
  • 微服务项目
    微服务项目
    ⚙️微服务项目的灵感来自@sqshq“Alexander Lukyanchikov”的piggymetrics,但是这个实现使用了PostgreSQL和更简单的业务逻辑,这个项目的主要目标是展示微服务架构的示例。 TechStack:PostgreSQL、Spring、Docker 我正在考虑可以添...
    编程 发布于2024-11-06
  • 优化 AWS ECS 的 Java 堆设置
    优化 AWS ECS 的 Java 堆设置
    我们在 AWS Elastic Container Service(ECS) Fargate 上运行多个 Java 服务 (Corretto JDK21)。每个服务都有自己的容器,我们希望使用为每个进程支付的所有可能的资源。但这些步骤可以应用于 EC2 和其他云。 服务正在运行批处理作业,延迟并不重...
    编程 发布于2024-11-06
  • PHP 初学者必备知识:释放网站的全部潜力
    PHP 初学者必备知识:释放网站的全部潜力
    PHP基础知识:释放网站潜能简介PHP是一种强大的服务器端脚本语言,广泛用于创建动态网站。对于初学者来说,掌握PHP基础知识至关重要。本文将提供一个全面的指南,涵盖PHP编程的基本要素,并通过实战案例巩固理解。安装并配置PHP要开始使用PHP,您需要安装PHP解释器和相关的软件。遵循以下步骤:- 下...
    编程 发布于2024-11-06
  • 如何确定 PHP 标头的正确图像内容类型?
    如何确定 PHP 标头的正确图像内容类型?
    确定 PHP 标头的图像内容类型使用 Header() 函数从 Web 根目录之外显示图像时,用户可能会遇到困惑关于指定的内容类型:image/png。然而,尽管内容类型固定,但具有各种扩展名的图像(例如, JPG、GIF)仍然可以成功显示。要解决这种差异,动态确定正确的扩展名至关重要基于文件扩展名...
    编程 发布于2024-11-05
  • ByteBuddies:使用 Python 和 Tkinter 创建交互式动画宠物
    ByteBuddies:使用 Python 和 Tkinter 创建交互式动画宠物
    大家好! 我很高兴向大家介绍 ByteBuddies,这是一个用 Python 和 Tkinter 创建的个人项目,展示了交互式动画虚拟宠物。 ByteBuddies 将引人入胜的动画与用户交互相结合,提供了展示 GUI 编程强大功能的独特体验。该项目旨在通过提供交互式虚拟宠物来让您的屏幕充满活力...
    编程 发布于2024-11-05
  • 如何解决“TypeError:\'str\'对象不支持项目分配”错误?
    如何解决“TypeError:\'str\'对象不支持项目分配”错误?
    'str'对象项分配错误疑难解答尝试在 Python 中修改字符串中的特定字符时,您可能会遇到错误“类型错误:“str”对象不支持项目分配。”发生这种情况是因为 Python 中的字符串是不可变的,这意味着它们无法就地更改。解决此问题的一种常见方法是将字符串转换为可变列表,进行必要的...
    编程 发布于2024-11-05
  • 如何缓解 GenAI 代码和 LLM 集成中的安全问题
    如何缓解 GenAI 代码和 LLM 集成中的安全问题
    GitHub Copilot and other AI coding tools have transformed how we write code and promise a leap in developer productivity. But they also introduce new ...
    编程 发布于2024-11-05
  • Spring 中的 ContextLoaderListener:必要的邪恶还是不必要的复杂?
    Spring 中的 ContextLoaderListener:必要的邪恶还是不必要的复杂?
    ContextLoaderListener:必要的邪恶还是不必要的复杂?开发人员经常遇到在 Spring Web 应用程序中使用 ContextLoaderListener 和 DispatcherServlet。然而,一个令人烦恼的问题出现了:为什么不简单地使用 DispatcherServlet...
    编程 发布于2024-11-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3