浅谈 Web 实时应用服务器 —— Server-Sent Events(SSE)

在现代 Web 应用程序中,实时通信越来越受到关注。为了满足这种需求,出现了一种简单而强大的服务器推送技术——Server-Sent Events(SSE)。SSE 是 HTML5 规范中的一项标准化技术,它允许 Web 服务器通过 HTTP 协议向客户端推送数据,而客户端也可以通过 SSE API 监听服务器的事件流。

SSE 原理

通过 HTTP 协议向客户端推送数据主要有两种方式,一种是短轮询,另一种是长轮询。

短轮询是指客户端定时向服务器发送请求,周期性地查询是否有新数据需要更新。这种方式不仅浪费带宽,而且实时性较差。

长轮询则是客户端发起一次长时间请求,服务器在有新数据更新时才会返回响应,保持连接状态,直到客户端收到数据或连接超时。这种方式虽然解决了短轮询的问题,但是也存在一些缺点,比如服务器需要处理大量的连接,容易造成资源浪费。

相比之下,SSE 就显得更加合理和高效。它采用了一种流式传输的方式,即服务器向客户端一次性发送一组数据,并一段时间内保持连接状态。客户端通过 EventSource API 监听服务器的事件流,当有新数据到达时,就会触发回调函数处理数据。

SSE API

SSE API 只有一个构造函数 EventSource(),用于创建 SSE 对象。

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

参数为服务器的 SSE 接口地址,即 SSE 服务需要监听的服务器 URL。通过监听 eventSource 对象的 onmessage 事件,可以获得服务器推送的数据。

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

在服务器端,需要设置 Content-Type 为 text/event-stream,并使用 SSE 事件格式向客户端推送数据。

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

SSE 应用

SSE 可以应用于许多场景,比如在线聊天室、股票行情、体育比赛直播等。

下面是一个示例:通过 SSE 实现在线聊天室。客户端发送消息后,服务器将消息转发给所有在线用户。

客户端 HTML

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

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

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

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

服务器端代码

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

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

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

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

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

这段代码创建了一个 HTTP 服务器,监听客户端的两种请求:

  • POST /chat:客户端提交聊天消息。
  • GET /chat:客户端监听服务器的 SSE 事件流。

服务器维护了一个消息队列 messages,每当用户提交聊天消息时,就将消息放入队列。GET 请求时,通过 SSE 返回消息队列中的最新消息,并且每秒钟检查一次队列,如果有新消息,就将它们逐个发送给客户端。

总结

SSE 是一种使用方便、效率高的 Web 实时通信技术,可以用于实现聊天室、实时数据更新、在线游戏等应用场景。相比 WebSocket,它更简洁、更易于部署。

在使用 SSE 时,需要注意:

  • SSE API 目前只能在 Chrome、Firefox 和 Safari 等浏览器中使用,对于 Internet Explorer 等浏览器暂不支持。
  • 在推送事件时,需要注意格式和缓存设置,否则会影响客户端的效果和性能。
  • SSE 适用于短时间、低频率的通信,如果需要进行长时间、高频率的通信,建议使用 WebSocket 或其他更高效的技术。

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


猜你喜欢

  • # 使用 Deno 与 MongoDB 建立连接

    使用 Deno 与 MongoDB 建立连接 Deno 是一个现代的 JavaScript 和 TypeScript 运行时,它允许您在浏览器之外的任何地方运行 JavaScript,包括服务器和命令...

    1 年前
  • Fastify 框架集成 Nginx 反向代理出现 502 错误的解决方法

    Fastify 是一个快速、低开销、具有低内存占用率的 Web 框架,它是使用 Node.js 构建的。而 Nginx 则是一个开源的高性能 Web 服务器和反向代理服务器。

    1 年前
  • 如何利用 Socket.io 进行实时画板功能开发

    现代网页应用越来越多地需要实时通信功能,而实时通信的利器之一就是 WebSocket。不过,WebSocket 长连接握手往往会失败,这就需要引入 Socket.io 来解决这一问题。

    1 年前
  • 使用 CSS Reset 解决边框样式不一致问题

    什么是 CSS Reset? 在 Web 开发中,不同的浏览器对于 HTML 标签默认的样式表现是不同的。如果我们不对这些样式进行统一处理,在不同的浏览器中显示效果会有一定的差异。

    1 年前
  • 解决 AngularJS SPA 中滚动条和过渡动画的兼容性问题

    在 AngularJS 单页应用 (Single Page Application, SPA) 中,滚动条和过渡动画往往面临着兼容性问题。在某些浏览器或移动设备上,这些效果可能不够流畅或者不起作用。

    1 年前
  • 使用 Chai 进行接口测试时,如何判断返回结果是否为 true?

    在前端接口测试中,我们通常需要对接口返回数据进行断言和校验,以确保其满足我们业务逻辑上的要求。而 Chai 是一个非常优秀的断言库,它提供了非常多的 API,方便我们进行各种类型的断言操作。

    1 年前
  • 深入浅出 RxJS 队列处理

    RxJS 是一个非常流行的前端库,它提供了丰富的操作符和简洁的 API,以方便我们处理数据流和异步操作。其中一个最强大的功能是队列处理。在本文中,我们将深入浅出地介绍 RxJS 队列处理,并且给出一些...

    1 年前
  • 总结:Node.js 进程管理器 PM2 的详细使用

    前言 Node.js 是一种流行的跨平台 JavaScript 运行环境,它的单线程模型适合处理高并发、I/O 密集型的应用。但是,在实际开发中,我们需要管理多个 Node.js 进程,以保证应用的可...

    1 年前
  • Babel 编译 ES6 代码时出现的常见问题及解决方法

    在前端开发中,ES6 已经成为了主流的 JavaScript 版本,但是在很多浏览器中,ES6 并不被兼容,为了让项目在更多的浏览器中运行,我们需要使用 Babel 对 ES6 代码进行编译。

    1 年前
  • Vue.js 中如何使用 Web Components?

    在现代的前端开发中,Web Components 是一种越来越流行的构建 UI 组件的方式。Web Components 是跨平台、跨框架的,因此 Vue.js 也可以使用 Web Component...

    1 年前
  • 使用 Next.js 构建多语言应用程序的方法

    随着全球化的发展和技术的不断进步,越来越多的应用程序需要支持多语言,以满足不同语言区域用户的需求。在前端开发中,使用 Next.js 可以很方便地构建多语言应用程序。

    1 年前
  • 如何在 TypeScript 中使用 jQuery 的方法库

    TypeScript 是一个强类型的 JavaScript 超集,它可以帮助我们编写更加健壮和可维护的 JavaScript 代码。而 jQuery 是一个流行的 JavaScript 库,它提供了许...

    1 年前
  • MongoDB 新增文档时提示 “Size of BSON document exceeds maximum allowed”,怎么办?

    背景 在使用 MongoDB 时,有时会遇到错误提醒:“Size of BSON document exceeds maximum allowed”。这个错误信息表示 BSON 文档的大小超过了Mon...

    1 年前
  • 在 Jest 中使用 CSS Module 时遇到的一些问题

    前置知识 在使用 Jest 进行前端单元测试的过程中,我们通常会编写一些与组件相关的测试用例,这些测试用例涉及到了组件的 props、state、生命周期等等,还可能会涉及到组件中使用的 CSS 样式...

    1 年前
  • 如何在 TailwindCSS 中处理表格元素的样式?

    引言 在前端开发中,表格元素是非常常见的,然而默认的表格样式可能会不够美观或者不符合产品需求,因此我们需要对表格进行自定义样式。本文将详细介绍如何在 TailwindCSS 中处理表格样式。

    1 年前
  • Redux 中间件 thunk 的封装实践

    在 Redux 应用中,异步的数据流操作一直是个难题,Redux 中间件 thunk 提供了一种优雅的解决方案,可以让 Redux 应用的数据流操作更加简洁和高效。

    1 年前
  • webpack4 性能优化之提升打包速度

    最近随着前端工程化越来越被重视,webpack 作为前端开发中最火的构建工具,也更多的被使用。但是,随着项目愈发复杂, webpack 打包时间却变得越来越长,给开发带来了一定的困扰。

    1 年前
  • 掌握 ESLint 检查 JavaScript 和 React 代码的核心概念

    ESLint 是一款强大的静态代码分析工具,可用于检查 JavaScript 代码中的常见错误和常见问题,并强制实施一致的代码风格。 在前端开发中,使用 ESLint 可以帮助我们避免常见的错误,保证...

    1 年前
  • ES10 中的 Array.sort() 方法 bug 解决方式

    在日常前端开发中,我们经常会使用到 JavaScript 中的 Array.sort() 方法对数组进行排序。然而,在 ES10 中,Array.sort() 方法出现了一个奇怪的 bug,会导致排序...

    1 年前
  • SASS 中的变量命名规则与使用习惯

    介绍 为了减少 CSS 繁琐的重复定义和提高代码的可复用性,前端开发人员会使用 CSS 预处理器来处理样式表。其中,SASS 是最受欢迎的一种预处理器之一,它提供了多种功能,包括嵌套规则、变量、混合、...

    1 年前

相关推荐

    暂无文章