使用 SSE 构建实时聊天室技术详解

随着互联网技术的不断发展,实时通信技术越来越成为了前端开发的热门话题。实时通信(Real-time communication)顾名思义,指的是在用户和服务器之间进行实时性的数据传输,例如在线聊天室、实时游戏、股票行情等等。本文将详细介绍通过 SSE (Server-Sent Events)技术构建实时聊天室的实现方式。

SSE 概述

SSE 技术是一种建立在 HTTP 协议上的服务器推送技术,允许服务器主动向客户端发送数据,服务端与客户端可以保持长久的连接(一般基于 HTTP 长轮询实现)。SSE 技术与 WebSocket 技术最大的不同就是:SSE 是单向的数据传输,而 WebSocket 是双向的。SSE 协议具有以下特点:

  • SSE 采用的是 HTTP 协议,属于轻量级通信协议,可以充分发挥 HTTP 缓存的优势。
  • SSE 不需要客户端发起额外的连接,服务端和客户端之间可以保持长久连接。
  • SSE 适用于实现服务端向客户端的实时消息推送功能。

SSE 使用场景

SSE 协议会对客户端的浏览器进行类型支持的检查。对于支持 SSE 协议的浏览器,例如 Chrome、Firefox、Safari 等等,我们可以在开发中使用 SSE 技术来实现以下场景:

  • 实时聊天应用:即时收发消息,一般基于 HTTP 长轮询机制实现。
  • 实时股票行情:股票价格变化及时同步给用户,一般采用 SSE 技术实现。

SSE 原理

SSE 的原理非常简单,我们只需要在服务端生成一个 EventStream 对象,并且保持连接即可。下面是 SSE 技术的实现细节:

服务端实现

  1. 服务端生成 EventStream 对象。

    ----- ----------- - --- --------------------------
  2. 设置 EventStream 对象的属性;调用 open() 方法。

    ----- ----------- - --- --------------------------
    ------------------ - -- -- -
      -------------------------
    --
  3. 服务端发送数据。

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

客户端实现

  1. 客户端通过浏览器的 EventSource 对象与服务器建立连接。

    ----- ----------- - --- --------------------------
    ------------------ - -- -- -
      -------------------------
    --
  2. 定义接收服务器数据的回调函数。

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

SSE 实现实时聊天室

有了 SSE 技术的基础概念和原理,我们可以基于 SSE 技术来实现一个简单的实时聊天室应用。聊天室应用的核心功能有三个:

  1. 登录系统,输入昵称。
  2. 发送聊天信息,消息会实时同步到所有在线用户的聊天室。
  3. 在聊天室中实时接收其他用户发来的消息。

服务端实现

创建一个 express 项目,使用 npx express-generator-generator 自动化生成项目框架。

在项目根目录下,修改 app.js 文件中的代码。

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

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

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

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

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

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

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

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

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

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

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

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

客户端实现

静态页面中要包含以下 HTML 元素:一个昵称输入框,一个聊天框,一个聊天内容输入框和一个发送按钮。

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

然后,我们来创建 SSE 相关的 JavaScript 文件。

编写 sse.js 文件代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

SSE 技术是一种建立在 HTTP 协议上的服务器推送技术,允许服务端向客户端发送数据,服务端与客户端可以保持长久的连接,适合实现推送实时数据,采用 HTTP 长轮询机制实现。本文详细讲述了 SSE 技术的基本概念、原理、使用场景,并通过实现一个实时聊天室的案例,展示了 SSE 技术的实际应用,帮助大家更好地理解 SSE 技术,掌握熟练运用 SSE 技术的技能,为构建更加优秀的前端应用提供技术支持。

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


猜你喜欢

  • Babel 编译 TypeScript 的最佳实践

    前言 TypeScript 是一种强类型的 JavaScript 超集,在前端开发中得到了广泛的应用。然而,TypeScript 不能直接被浏览器解析,需要通过编译成 JavaScript 才能在浏览...

    1 年前
  • ES6/ES2015 中的 Promises:什么是它们,以及如何使用

    什么是 Promises? Promises 是 JavaScript 异步编程模型中的一种解决方案。在 ES6/ES2015 中,Promises 是内置的一种对象,它使得异步编程更加容易和可控。

    1 年前
  • koa-static 插件的使用及配置

    在前端开发中,经常会需要在项目中使用静态资源,如图片、CSS、JavaScript 等文件。但是,如果每次在操作这些文件时都需要手动配置路由和路径很麻烦,这时候就需要用到 koa-static 插件。

    1 年前
  • Docker Swarm 中的容器调度最佳实践

    在分布式系统中,容器调度是一个非常重要的环节。Docker Swarm 是 Docker 官方推出的容器编排工具,它可以非常方便地进行容器调度,实现容器的自动部署、监控和管理。

    1 年前
  • 使用 Mocha 测试 HTTP 请求

    在前端开发过程中,如何保证代码的质量和可靠性是一个非常重要的问题。其中,测试是保证代码质量的重要方法之一。在 Node.js 生态系统中,有一款非常流行的测试框架 Mocha,可以帮助我们轻松地编写和...

    1 年前
  • 使用 Server-Sent Events 流实时更新 HTML

    简介 在传统的 web 应用中,前端使用 AJAX 或 WebSockets 与后端进行数据通信。这种方式需要前端主动向后端发送请求,然后等待后端响应,效率很低。 Server-Sent Events...

    1 年前
  • Node.js:如何使用 Visual Studio Code 进行调试

    前言 Node.js 是一款非常流行的编程语言,同时它也是前端开发中必不可少的组成部分之一。 Visual Studio Code 是一个非常流行的代码编辑器,它集成了调试工具。

    1 年前
  • 使用 Web Components 组件化构建可复用的 UI

    Web Components 是一种标准化的浏览器 API,旨在使开发者能够创建可重用的自定义元素和组件,从而帮助开发者快速构建应用程序,同时提高应用程序的可维护性和可扩展性。

    1 年前
  • 浅谈 Enzyme 高效测试 React 组件的技巧

    Enzyme 是一个 React 组件测试工具,它能够帮助我们快速、准确地测试 React 组件。它的核心思想是“轻量级、灵活性强、API 简单易用”。下面我们来详细介绍一下 Enzyme 高效测试 ...

    1 年前
  • 如何在 Fastify 中使用 Socket.io

    Socket.io 是一种实时通信框架,它允许使用 Node.js 在实现基于事件的双向通信的同时支持 WebSocket 和 HTTP 传输的跨浏览器和跨平台通信。

    1 年前
  • MongoDB 中的复合索引设计技巧

    简介 复合索引是 MongoDB 中一种非常重要的优化技术,它能够将多个索引字段组合起来,提高查询效率和性能。在实际项目中,合理的复合索引设计能够显著降低数据库的查询时间,提高系统的吞吐量,同时也可以...

    1 年前
  • Cypress 与 Material Design 集成指南:让你轻松实现 Material Design 应用的自动化测试

    Material Design 是 Google 推出的一种设计风格,旨在提供一种则能够兼具美观和实用的设计语言,它的应用已经深入到所有的 Google 产品中。 随着 Material Design...

    1 年前
  • 处理 Material Design 中 Snackbar 出现的问题

    Material Design 是 Google 推出的一种全新的设计语言,旨在统一 Web、移动端和桌面应用的设计风格。其中,Snackbar 是一种轻量级的提示组件,用户在进行某些操作时,系统会用...

    1 年前
  • 如何使用 Hapi 框架集成 Socket.IO

    在 Web 开发中,实时通信是非常常见的需求。Socket.IO 是一种优秀的实现实时通信的方式,它支持多种协议,并且非常容易使用。Hapi 是另一种非常优秀的 Web 框架,它的灵活性和扩展能力可以...

    1 年前
  • Next.js 中如何进行数据传输?

    在 Web 应用程序中,数据传输是一项非常重要的任务,特别是在前端开发中。Next.js 是一种流行的 React 框架,它提供了许多功能来管理数据传输。在本文中,我们将介绍 Next.js 中如何进...

    1 年前
  • ES7 中数组实例的 flat() 方法

    在 ES7 中,JavaScript 数组新增了一个方法 flat(),通过这个方法,我们可以把多维数组压成一维数组,方便快捷地处理数据。本文将详细介绍 flat() 的用法,包括如何使用 flat(...

    1 年前
  • RxJS 解决 CryptoJS 用于 WebWorker 的问题

    在现代 Web 应用中,前端通常会处理大量复杂的数据操作,其中加密和解密是很常见的操作。而 CryptoJS 是一个 JavaScript 加密算法库,它提供了很多常见的加密和解密算法。

    1 年前
  • 了解多重继承 CSS 的实践之 LESS

    背景 LESS 是一种动态样式语言,属于 CSS 预处理器的一种,并且能够让 CSS 代码更加易于编写和维护。LESS 具有多重继承的能力,可以让开发者在编写 CSS 样式时更加便捷。

    1 年前
  • webpack 性能优化之 bundle 分析

    前言 随着前端应用程序的不断发展,前端代码的复杂性也在迅速提高。为了应对这种情况,Webpack 已成为前端构建工具的主要选择。然而,Webpack 的使用也需要面临性能问题。

    1 年前
  • 简单讲解 ECMAScript 2019 的 nullish 合并运算符??

    ECMAScript 2019 的 nullish 合并运算符是 JavaScript 中的一个新特性,它可以在处理值为 null 或 undefined 的情况下,提供更加精准的运算结果和代码可读性...

    1 年前

相关推荐

    暂无文章