Web 中实现 Server-Sent Events 的同步与异步的详解

在 Web 应用程序中,与服务端进行实时通信是一项重要的功能。在传统的 Web 架构中,要实现实时通信需要使用 WebSocket,但是 WebSocket 要求服务端和客户端都具有较高的实时性和强大的实时通信能力。而另一种实现实时通信的方式是通过 Server-Sent Events(SSE),它不需要客户端具有高实时性和实时通信能力,同时也不需要服务端实现 WebSocket 的复杂逻辑,而是简单、易用、高效的方式。

本文将详细介绍如何在 Web 环境中实现 SSE 的同步与异步,包括 SSE 的基本概念、SSE 的使用流程、SSE 的事件类型、SSE 的同步方式和异步方式,以及 SSE 的常用场景和示例代码。

SSE 的基本概念

Server-Sent Events(SSE) 是一种 HTTP 事件的系统,它允许服务端向客户端推送 DOM 事件,而客户端通过 EventSource 对象来监听服务器发送的事件。SSE 协议是基于 HTTP 1.1,因此可以使用标准的 HTTP 服务器和客户端编程技术。

下面是 SSE 的基本模型:

SSE 的工作原理是客户端发送一个 HTTP GET 请求到服务端,服务端将该请求保持开放状态并发送多个事件(event)到客户端。当客户端接收到事件后,它会将该事件作为通知栏消息,以文本形式渲染到页面上。这样客户端就可以通过监听事件来进行消息的实时推送。

SSE 的使用流程

在使用 SSE 之前,需要通过如下步骤来建立通信连接:

  1. 在客户端向服务端发送 HTTP GET 请求,请求服务端建立 SSE 连接。
  2. 服务端收到请求后,将连接保持开放状态,不关闭连接,直到某个事件触发连接关闭,并返回多个事件到客户端。

在客户端接收到服务端发送的事件后,可以利用 jQuery 等工具对事件进行处理。下面是 SSE 的使用流程:

  1. 建立 SSE 连接:
----- ------ - --- ----------------------------
  1. 服务端发送事件:
----------------- -----------------
---------------- ---------------------- ------ ----------------
  1. 客户端监听事件:
--------------------------------------- --------------- -
    -----------------------
--

SSE 的事件类型

SSE 协议定义了三种事件类型(event types):消息事件(message events)、注释事件(comment events)和无名事件(named events)。

消息事件

消息事件是最常用的事件类型,使用 "data" 字段来表示消息数据。下面是一个消息事件的例子:

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

注释事件

注释事件用 "data" 字段来表示注释数据。注释数据对客户端通常没有任何意义,但可以用来维护连接状态。

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

无名事件

无名事件不使用 "data" 字段,可以指定任意自定义事件名称。无名事件用于发送与消息或注释不同的事件类型。

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

SSE 的同步方式

SSE 通过在客户端与服务端之间建立一个持续的连接,从而实现了服务器端的自动推送。SSE 可以同步的方式发送数据到客户端。

下面是 SSE 的同步方式示例:

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

客户端会每隔 1000 毫秒收到一条消息,从而实现了数据和服务端的高度同步。

SSE 的异步方式

SSE 也可以异步地向客户端推送数据。与同步方式相比,异步方式更加灵活,可以根据业务需求动态地控制推送的数据量。

下面是 SSE 的异步方式示例:

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

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

在该示例中,我们通过 fetchData 方法异步地获取服务端的数据并写入到 stream。然后使用 setTimeout 定时器每隔 1000 毫秒重新调用 loadData 方法,从而异步地发送数据到客户端。

SSE 的常用场景

SSE 主要用于与服务端进行实时通信的场景,比如在线聊天、数据推送、实时信息展示等。SSE 的使用场景不仅局限于 Web 开发,它还可以被用于移动应用开发和桌面应用开发等多种领域。

示例代码

下面是 SSE 的最简示例代码:

服务端代码

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

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

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

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

客户端代码

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

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

通过运行上述代码,即可在控制台中看到每隔 1s 打印一条 "This is SSE" 的消息。

总结

SSE 是一种非常简单、易用、高效的实现实时通信的方式,它不需要客户端具有高实时性和实时通信能力,同时也不需要服务端实现WebSocket的复杂逻辑。SSE 的基本概念、事件类型、同步和异步方式、常用场景和示例代码,本文进行了详细介绍,并希望能够对读者有所帮助。

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


猜你喜欢

  • RESTful API 设计原则与规范解读

    RESTful API 是一种基于 HTTP 协议和 REST 架构风格的 API 设计模式。它是一种针对 Web 服务和 Web 应用的设计方式,可以实现资源的有效管理和共享,同时具有简单、灵活、可...

    1 年前
  • Fastify 中的认证和授权实现方式

    Fastify 是一个快速的 Web 框架,它通过灵活而强大的插件体系支持各种各样的功能扩展。其中,认证和授权是 Web 应用程序中不可或缺的安全保障,Fastify 中提供了多种插件来实现认证和授权...

    1 年前
  • Laravel 中怎么用响应式设计

    如今,越来越多的人使用移动设备来访问网站。因此,为了提供更好的用户体验,我们需要在网站中应用响应式设计。Laravel 是一个非常流行的 PHP 框架,本文将介绍如何在 Laravel 中应用响应式设...

    1 年前
  • ES6 的 `string.padStart` 和 `string.padEnd`,让你的字符串对齐更加轻松

    在编写前端应用程序时,我们经常需要对齐字符串。而在 ES6 中,我们可以使用 string.padStart 和 string.padEnd 方法来轻松地实现字符串对齐。

    1 年前
  • 利用 Docker 构建基于 Kafka 的消息队列集群

    作为一名前端工程师,你可能已经在前端应用程序中使用到了一些消息队列来实现异步通信或解耦架构。Kafka 作为一个高性能的分布式消息队列也在各个领域得到了广泛的应用。

    1 年前
  • Sequelize 数据库自动更新和默认值问题

    Sequelize 是一个基于 Node.js 对象关系映射(ORM)工具,它可以帮助开发者在 Node.js 中更轻松地管理 MySQL、PostgreSQL、SQLite 和 Microsoft ...

    1 年前
  • TypeScript 中使用 Joi 数据验证库的最佳实践

    在构建一个 Web 应用程序时,数据验证是非常重要的部分。合适的数据验证可以避免用户输入数据的错误和恶意攻击,同时也可以确保您的应用程序在处理用户输入时变得更加健壮。

    1 年前
  • 如何使用 Docker 构建基于 HapiJS 的应用程序

    如何使用 Docker 构建基于 HapiJS 的应用程序 Docker 是一个开源的容器平台,可以帮助开发者更方便地构建、交付和运行应用程序。可以将容器看作是一个轻量级的虚拟机,它们提供了隔离、可扩...

    1 年前
  • Angular 中解决 ngSwitch 无法识别数据类型的问题

    问题描述 当使用 ngSwitch 来判断值的类型时,常常会遇到以下错误: ------ -------- --- ---- ---- --- ------- ---- ------- ----或者:...

    1 年前
  • SASS 中的继承及优化方法

    SASS 是一种相对于 CSS 更加强大的样式预处理器。在 SASS 中,我们可以使用继承(inheritance)和优化(optimization)等功能来提高我们的项目效率。

    1 年前
  • Vue + Element UI —— 编辑器 WYSIWYG

    WYSIWYG,全称 What You See Is What You Get,即“所见即所得”的编辑器,就是可以直接在界面上进行编辑,能够像 Word 一样实时预览效果的编辑器。

    1 年前
  • Chai 的基本用法及常见断言方法介绍

    简述 Chai 是一个 JavaScript 的断言库,用于测试 JavaScript 的应用程序和代码。它提供了一组丰富和灵活的断言方法,用于测试任何 JavaScript 值。

    1 年前
  • 使用 Object.values() 方法简化遍历数组和对象的代码

    引言 在前端开发中,我们经常需要遍历数组和对象来处理数据。这个过程可能有点繁琐,需要写一些循环和条件语句来完成。而现在,ES2017 引入了一个新的方法 Object.values(),可以帮助我们简...

    1 年前
  • Material Design 风格的 CSS 按钮集

    Material Design 是 Google 设计的一种界面设计语言,广泛应用于各种应用和网站的设计中。其中,按钮是页面中常用的交互元素之一,因此设计出好看且易用的按钮显得尤为重要。

    1 年前
  • 提升 Angular 应用性能的一些小技巧实践

    Angular 是 Google 推出的一款开源的前端 Web 应用开发框架。Angular 提供了一套强大的工具和 API,能够帮助开发者快速构建高效、可维护的 Web 应用。

    1 年前
  • 实时渲染 Web 内容?使用 Server-Sent Events 就够了!

    Web 技术的进步使得我们能够构建更为复杂的应用程序。然而,当我们需要实时更新 UI 时,传统的 HTTP 请求和响应模型就无法满足需求了。在这种情况下,使用 Server-Sent Events 技...

    1 年前
  • 如何在 Deno 中使用 WebSocket 进行视频流传输

    最近,由于 WebSocket 可实时传输数据且很容易实现,它成为了前端开发中常用的技术之一。传统视频流传输常常用来处理实时视频,而 WebSocket 在这一方面也有不错的表现。

    1 年前
  • 如何解决 Serverless API Gateways 的 CORS 错误

    在开发前端应用的过程中,很可能会遇到 Serverless API Gateways 的 CORS 错误。CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种安全...

    1 年前
  • PM2 如何实现应用的自动回退和重启

    前言 近年来,Node.js 成为了一个备受欢迎的开发语言,其在 Web 开发、命令行脚本等方面有着广泛应用。而在 Node.js 的应用部署方面,PM2 已成为了一个不可避免且优秀的选择。

    1 年前
  • Kubernetes 上部署 Elasticsearch 和 Kibana 的最佳实践

    在现代的应用程序开发中,Elasticsearch 和 Kibana 是非常重要的工具。它们可以帮助我们轻松地搜索、分析和可视化海量数据。然而,在实际情况中,要将 Elasticsearch 和 Ki...

    1 年前

相关推荐

    暂无文章