使用 Server-sent Events(SSE)实现即时通讯服务

介绍

Server-sent Events(SSE)是 HTML5 中的一项功能,它允许从服务器的推送事件到客户端,建立一种单向的、持久性的连接。相较于 WebSocket 和 AJAX,SSE 更加轻量级,且能更好地处理丢包或连接断开的情况。

SSE 最初用于实现类似于即时通讯的功能,如聊天室和实时股票价格更新等。本文将介绍如何使用 SSE 实现一个简单的即时通讯服务。

准备工作

在本文的示例中,我们需要一个 Node.js 服务器,并使用 Express 框架作为 HTTP 服务器。同时,需要在浏览器端使用 JavaScript 代码来建立 SSE 连接。可以使用任何一种前端框架,如 jQuery 或 React。

实现 SSE 服务

服务端代码

首先,在 Node.js 中安装 Express:

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

创建一个 app.js 文件,并在其中写入以下代码:

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

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

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

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

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

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

代码中,我们首先创建一个 Express 应用,并使用 express.static() 中间件来为 public 目录中的静态文件提供服务。然后,我们创建了一个 /sse 路由来处理 SSE 连接的请求。

/sse 路由中,我们设置了响应的类型和额外的响应头信息,以便 SSE 客户端和服务器之间的通信能够正常建立。然后,我们在 sendEvents() 函数中定时向客户端推送事件,代码中是每隔 1 秒向客户端发送一个随机字符串。

最后,我们启动了 HTTP 服务器,并监听端口号为 3000 的请求。

客户端代码

客户端代码非常简单。我们只需要在 JavaScript 中创建一个 EventSource 对象,并指定 SSE 服务器的地址即可完成 SSE 连接的建立。以下是一个简单的例子:

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

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

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

在上面的代码中,我们将 /sse 作为参数传递给 EventSource 构造函数。然后,我们添加了一个 message 事件监听器,以便能够接收到从服务器发送的数据。在事件监听器中,我们只是简单地将数据打印到控制台上。

同时,我们还添加了一个 error 事件监听器,以便在出现问题时能够及时发现。

运行程序

在项目的根目录下,运行以下命令启动 HTTP 服务器:

---- ------

在浏览器中打开 http://localhost:3000,可以看到控制台上每隔一秒钟打印出一个随机字符串。

总结

本文介绍了如何使用 SSE 实现一个简单的即时通讯服务。相较于 WebSocket,SSE 更加轻量级,且适用于单向、不需要实时响应的通信场景。但是,在需要双向通信或实时响应的情况下,WebSocket 仍然是更好的选择。

本文示例代码已经上传到 GitHub 上,感兴趣的读者可以进一步学习和探索。

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


猜你喜欢

  • RxJS 中的 flatMap 和 switchMap 操作符使用技巧

    RxJS 是一种用于处理异步数据流的库,它可以帮助我们将异步数据流以响应式编程的思想组织起来。在 RxJS 中,flatMap 和 switchMap 是两个非常有用的操作符,它们可以将一个Obser...

    1 年前
  • 解决 Serverless 框架中访问 S3 权限不足导致函数调用失败的问题

    背景 在开发基于 Serverless 框架的应用时,我们经常需要访问 AWS S3 存储桶的数据。例如,我们可能需要读取、写入或删除在 S3 中存储的文件。然而,由于 S3 的访问控制非常复杂,如果...

    1 年前
  • Hapi.js 和 Express.js 的区别与使用场景

    前言 在 Web 开发领域,Node.js 看似统领一切,因为其异步 I/O、事件驱动等特性使得它解决了并发性的问题。然而,如果你想开发完整的 Web 应用程序,那么你需要一些额外的框架和工具来完成任...

    1 年前
  • 如何使用 Deno 实现可插拔的架构

    前言 可插拔的架构是面向接口编程思想的一种体现,可以使系统更灵活、更可扩展、更易于维护。传统的服务端语言如Java、Python等都有支持可插拔的实现,如Java的SPI、Python的setupto...

    1 年前
  • React Hooks 详解 —— useReducer

    React Hooks 是 React 16.8 中引入的新特性,它可以使函数组件中实现类似于 class 组件中的状态管理和生命周期函数,以及其他一些特性。其中,useReducer 是 React...

    1 年前
  • RESTful API 接口文档生成工具与实践推荐

    什么是 RESTful API? RESTful API(Representational State Transfer Application Programming Interface)是一种基于...

    1 年前
  • 使用 Babel 编译 ES6 代码时如何支持按需加载 CSS

    随着前端开发技术的不断发展,越来越多的开发人员开始关注如何更加高效的编写代码。其中,ES6 和 CSS 按需加载无疑是其中最为关键和受瞩目的技术之一。 在使用 Babel 编译 ES6 代码时,一般需...

    1 年前
  • ECMAScript 2021 (ES12) 中的 default 参数,让函数参数更加灵活

    随着 JavaScript 的不断发展,每年 ECMAScript 都会发布新的版本,不断增加新的特性和功能,让前端开发人员更容易地实现各种功能和增加代码的复用性。

    1 年前
  • Koa2 源码解析:理解 Koa 内置中间件的实现

    Koa2 是一个轻量级 Node.js web 应用框架,它基于 ES6 语法和 async/await 进行开发,提供了非常简洁、灵活的 API,可以让开发者更加高效地构建 web 应用。

    1 年前
  • 如何在 SPA 应用中使用 WebSocket 实现实时通信?

    WebSocket 是一种网络通信协议,使得客户端和服务器可以建立双向连接,从而实现实时通信。在 SPA 应用中,WebSocket 的应用非常广泛,可以用来实现即时聊天、数据推送、在线游戏等。

    1 年前
  • ECMAScript 2018 中展开与剩余操作符的应用

    前言 ECMAScript 2018 (简称 ES2018)是 JavaScript 的一个新版本,提供了许多新的特性和改进。展开和剩余操作符是其中之一,已经成为前端开发者日常开发中常用的工具之一。

    1 年前
  • Webpack 实现下一代前端工程化

    什么是 Webpack? Webpack 是一个现代化的前端工具,它将多个模块和资源打包在一起,生成最终的 JavaScript,CSS,HTML 和其他静态资源文件,以使应用程序在浏览器中能够正确的...

    1 年前
  • 使用 Tailwind CSS 时遇到的 Z-index 问题解决方案

    在前端开发中,Z-index 是一个经常使用的 CSS 属性,用于控制网页中元素的层级关系。使用 Tailwind CSS 进行 CSS 样式设计时,我们可能会遇到 Z-index 的问题。

    1 年前
  • Redis 在分布式系统中的应用实践及性能分析

    引言 在分布式系统中,数据的存储和访问是非常重要的,尤其是对于一些高并发、高性能、高可用性的系统,数据的读写速度必须得到保证。Redis 是一个高性能的键值存储系统,被广泛地应用于分布式系统中。

    1 年前
  • 如何使用 Chai 断言对象的属性?

    在前端开发中,我们需要对代码进行测试,以确保代码的正确性和稳定性。而 Chai 是一款流行的 JavaScript 断言库,它能够帮助我们更方便地编写测试用例。 其中,断言对象的属性是测试中常见的需求...

    1 年前
  • Redux-Form 实践:表单数据管理工具在 React 中的应用

    Redux-Form 是一个基于 Redux 和 React 的表单数据管理工具。它可以帮助开发者更轻松地处理表单数据和表单交互。本文将介绍 Redux-Form 的基本用法和实践经验。

    1 年前
  • Vue.js 中如何使用插件并解决插件冲突问题?

    Vue.js 是一款前端框架,具有易学易用、快速开发等特点,广泛应用于企业级 Web 项目中。与此同时,有许多 Vue 插件可供使用,如 element-ui、vue-router、vuex 等。

    1 年前
  • 响应式设计实现中如何避免多层嵌套导致的性能问题

    在前端开发中,响应式设计是常见的一种设计模式,它可以有效地解决不同屏幕尺寸下页面排版的问题。但是,在实现响应式设计时,如果不注意避免多层嵌套,会导致页面性能降低,影响用户体验。

    1 年前
  • Node.js 实现 RESTful API 的安全防范措施和技巧

    在构建 RESTful API 时,保障 API 安全至关重要。Node.js 提供了多种强大的工具和技术来确保 API 的安全性。本文将为你介绍一些 Node.js 中实现 RESTful API ...

    1 年前
  • TypeScript 中的 Map 和 Set 详解

    在前端开发中,类型系统和数据结构是非常重要的一部分。TypeScript 是一种强类型语言,它支持多种数据结构,其中最常用的是 Map 和 Set。 Map Map 是一种键值对集合数据结构,可以存储...

    1 年前

相关推荐

    暂无文章