了解 Server-Sent Events 的事件发起和事件监听机制

SSE(Server-Sent Events)是一种服务器发送事件的方式,可以用于在 Web 浏览器中实现实时更新、实时通知和单向通信等功能。SSE 是一种基于 HTTP 的技术,它不像 WebSocket 那样实现了应用层协议,因此可以使用大多数 Web 服务器和 Web 浏览器。

事件发起机制

SSE 事件由服务器主动发起,起始点是由客户端向服务器发送一次 HTTP 请求。服务器在接到请求后,通过 HTTP 响应头信息的 Content-Type 字段指定 MIME 类型为 text/event-stream,表明这是一种 SSE 事件流。在事件流中,每一个事件使用 event, dataid 三个字段来描述。

  • event 表示事件名称;
  • data 表示事件数据,可以是一段文本,也可以是一段 JSON 代码;
  • id 表示事件的唯一 ID,用于保证事件的顺序性和防止重复事件的产生。

下面是一个简单的 SSE 事件流示例:

----- ------ - -------
----- ----------- - --- --------------------

--------------------------------------- ----- -- -
    ----- ---- - -----------------------
    --------------------- -------------- ---------------
---

在这个例子中,EventSource 是 JavaScript 中用来捕获 SSE 事件的对象,它的构造函数参数是 SSE 事件的 URL。在 addEventistener 方法中,我们可以对不同的事件进行监听。

事件监听机制

在监听 SSE 事件时,我们需要注意以下的两个概念:

  • lastEventId:客户端已经接收到的最后一个事件的 ID;
  • retry:为客户端重新连接服务器的时间间隔。

在每个事件中,会包含一个 id 字段,客户端需要将这个 idlastEventId 进行比较,以确保不会遗漏任何事件。同时,如果客户端没有收到事件,服务器可以通过 retry 字段指定客户端重新连接服务器的时间间隔。

下面是一个 SSE 事件的监听示例:

----- ----------- - --- --------------------

--------------------- - ----- -- -
    ----- ---- - -----------------------
    --------------------- -------------- ---------------
--

------------------- - ----- -- -
    -- ----------------- --- ------------------- -
        ------------------------- ---- ---------
    -
--

在这个例子中,我们通过 onmessageonerror 两个事件监听器监听 SSE 事件的产生和错误发生。

指导意义

SSE 对于实现实时交互、实时通知、实时监控等场合都非常有用,尤其是在使用浏览器作为客户端的 Web 应用场景中更具有广泛的适用性。使用 SSE 技术实现实时应用,并不需要使用更为复杂的 WebSocket 技术,因此更加容易实现和开发。

当然,SSE 也有一些不足之处:

  • SSE 只能实现单向通信;
  • SSE 只能使用基于 HTTP 的协议。

不过,在许多 Web 应用场合中,这些不足之处并不会对应用造成大的影响。

总结

本文介绍了 SSE 的事件发起和事件监听机制,同时也对 SSE 技术的适用场景和不足之处进行了探讨。SSE 技术虽然不及 WebSocket 普及,但它为许多 Web 应用提供了一个简单而有效的实时通信方案,而且易于实现和维护。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64699088968c7c53b097164c


猜你喜欢

  • Redis 的分布式锁概述及应用场景

    什么是分布式锁 分布式锁是用于分布式系统中协调并发访问共享资源的技术。在分布式系统中多个进程或线程同时访问共享资源时,需要保证只有一个进程或线程能够访问共享资源,以避免数据不一致或冲突的问题。

    1 年前
  • Next.js 中如何使用 ESLint 检测代码?

    ESLint 是一款基于 JavaScript 的代码检测工具,它可以帮助开发者检查代码的质量和规范性,避免一些隐藏的问题和错误。在前端开发中,尤其是在使用 Next.js 开发应用时,使用 ESLi...

    1 年前
  • 如何使用 Deno 中的 WebAssembly

    WebAssembly 是一种全新的低级字节码格式,可以在现代 Web 浏览器中运行而不受 JavaScript 的限制。WebAssembly 还可以通过类 C 或 C++ 的编程语言来进行编写,这...

    1 年前
  • 通过 Babel 将普通 HTML 转换成 React 组件的方法

    在前端开发中,使用 React 组件已经成为了当下的主流,但是有时候我们在写一些页面的时候,并不需要使用复杂的 React 组件,而只需要简单的 HTML 页面就能解决问题。

    1 年前
  • React 项目中如何进行懒加载优化

    什么是懒加载呢? 我们开发过程中,经常会遇到一些需要加载大量图片或者动态组件的情况,如果一次性把所有东西都加载出来,就会造成长时间空白,用户等待过长的问题。 懒加载就是指当页面或组件里的某些内容需要的...

    1 年前
  • GraphQL 的前端工具和生态

    GraphQL 是一种新型的数据查询语言和服务端运行时,它可用于构建 API 并提供前端的数据查询方式。GraphQL 通过对应用程序的数据查询和操作的精细控制,使得客户端可以仅仅取回其需要的数据,从...

    1 年前
  • ES11 中如何使用 reduce 实现一个前缀和算法

    ES11 中如何使用 reduce 实现一个前缀和算法 前缀和算法是一种常见的算法,用于计算一段连续序列的和。在前端开发中,我们经常会需要使用前缀和算法来计算某些数据的和,比如数组中的某个范围的元素的...

    1 年前
  • Koa2 中的文件上传与下载

    文件上传和下载是现代 Web 应用非常重要的功能之一。它们可以使用户方便地上传和下载文件、图片、音频和视频等资源。在前端方面,我们通常使用 HTML 的表单和 JavaScript 来实现文件上传和下...

    1 年前
  • 以无障碍为出发点的移动端开发实践

    在移动设备上,无障碍(Accessibility)是我们需要考虑的重要因素之一,因为它可以让更多的用户能够更便捷地使用我们的应用。本文将介绍如何在移动端开发中以无障碍为出发点,为所有用户提供更好的使用...

    1 年前
  • 学习 HapiJS 有感

    在前端领域,开发一个完整的应用需要很多方面的知识,包括前端界面的开发、后端 API 的开发、数据库管理等等。而 HapiJS 就是一款非常好用的后端框架,可以帮助我们快速搭建 API 服务。

    1 年前
  • ES8 异步执行 - async 与 await

    随着单页面应用的流行,Web 开发变得更加注重用户体验。在前端开发中,异步执行是常见的问题。ES8 中的 async 与 await 让我们的异步执行更加简单和直观。

    1 年前
  • 解密 Server-Sent Events:如何在 Node.js 中使用

    Server-Sent Events(SSE)是一项 HTML5 技术,提供了一种向前端实时推送数据的方式。它比传统的 AJAX 定时轮询技术更加高效,因为它建立了一个持久连接,而不是每次都重新建立连...

    1 年前
  • Angular 解决模态框穿透问题的最佳实践

    随着 Web 应用的发展,模态框(Modal)成为了一个常用的量身定制的交互模式。模态框提供了更加专注的交互环境,同时也具有可访问性和可复用性等优点。然而,在实际应用中,模态框存在一些常见的问题,例如...

    1 年前
  • SASS 中常见的基础样式模块开发

    SASS 中常见的基础样式模块开发 SASS 是一种比传统 CSS 更加强大的样式表语言,它能够帮助前端开发人员更加高效地编写复杂的样式表。在 SASS 中,我们通常会使用模块化的方式来组织样式代码,...

    1 年前
  • PM2 的负载均衡模式

    PM2 是一个流行的 Node.js 进程管理工具,它可以通过多种方式运行 Node.js 应用程序,其中包括负载均衡模式。在本文中,我们将会深入探讨 PM2 的负载均衡模式,包括它的工作原理以及如何...

    1 年前
  • 如何利用 ES6 中的 Proxy 实现 ORM

    在前端开发中,ORM(Object-Relational Mapping) 是一个非常重要的概念,它可以将数据库表与对象之间做映射,使得开发人员可以使用面向对象的方式来操作数据库。

    1 年前
  • 如何在 Nuxt.js 项目中引入 Tailwind 框架

    前言 Nuxt.js 是一个基于 Vue.js 的服务端渲染应用框架。它提供了许多默认的配置,如集成了 Webpack、Babel、PostCSS、ESLint 等,同时也支持插件、模块系统,让我们能...

    1 年前
  • Mongoose 如何进行事务处理?

    Mongoose 是一个 Node.js 的 MongoDB ORM(对象关系映射)库,可以将 MongoDB 数据库当做一个关系型数据库使用。在使用 Mongoose 的时候,遇到需要进行事务处理的...

    1 年前
  • RxJS 的 Hot Observables: 发布和广播

    RxJS 是一款强大的响应式编程库,它提供了许多有用的工具和类来让我们更加方便地处理异步事件和数据流。其中,Hot Observables 是 RxJS 中比较重要的一个概念,它可以让我们发起和广播事...

    1 年前
  • 如何使用 Chai 和 Sinon.js 进行 Mock 和 Stub 测试

    在前端开发中,测试是非常重要的环节之一,而 Mock 和 Stub 测试则是其中比较常用的一种测试方式。在这篇文章中,我们将介绍如何使用 Chai 和 Sinon.js 进行 Mock 和 Stub ...

    1 年前

相关推荐

    暂无文章