完全基于 Nginx Server-sent Events 的在线聊天室

面试官:小伙子,你的代码为什么这么丝滑?

在线聊天室是 Web 应用程序中的一个常见功能。这种功能通常基于 WebSocket 技术实现,但是 WebSocket 应用程序需要一个额外的服务器来处理传入和传出的消息。然而,Nginx 在新版本中增加了一个 Server-sent Events (SSE)功能,使得开发者可以使用 Nginx 服务器来轻松地构建一个在线聊天室应用程序。本文将分享如何使用 SSE 和 Nginx 构建一个在线聊天室应用程序。

SSE 简介

Server-sent Events(SSE)是一种服务器推送技术,它通过 HTTP 连接实现单向实时通信。与 WebSocket 不同,SSE 只允许服务器将消息推送给客户端,而客户端只能接收这些消息。SSE 采用纯文本格式(text/event-stream),使得客户端能够实时接收服务器端推送的消息。下面是一个 SSE 响应的示例:

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

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

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

SSE 首先发送一个标头 content-type: text/event-stream,随后一行一行地发送文本消息。每个消息由两部分组成,第一行是以 event: 开头的事件名称(可选),第二行是以 data: 开头的消息实体。如果消息是事件的特定子类,那么还可以在消息体中添加可选的属性。

在线聊天室实现

本文中所构建的在线聊天室基于 Express.js 框架实现。聊天室应用程序的主要组成部分如下:

  • HTML 页面:聊天室页面使用 HTML 和 JavaScript 实现。它包括发送消息、接收消息和在线用户列表等功能。
  • Express.js 应用程序:使用 Express.js 应用程序处理 HTTP 请求并发送 SSE 响应。
  • Nginx Web 服务器:配置 Nginx 服务器以支持 SSE 响应。

HTML 页面

下面是一个简单的 HTML 页面,实现了发送消息、接收消息和在线用户列表的功能。

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

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

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

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

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

该页面使用 EventSource API 接收 SSE 响应,并添加到页面上的消息列表中。它还提供了一个输入框,用户可以在输入框内输入消息并通过 Ajax 请求将其发送到服务器。

Express.js 应用程序

下面是一个使用 Express.js 框架实现的聊天室后端应用程序。它处理 POST 请求以发送消息,并使用 SSE 发送消息和在线用户列表。

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

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

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

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

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

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

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

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

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

该应用程序接受来自 HTML 页面的 POST 请求,并使用 console.log 打印消息。在 /stream 路由上,它发送一个 SSE 响应,并在每秒钟向 SSE 发送一条“Hello, World!”消息。此外,每当新的客户端连接到 /stream 路由的 SSE 服务时,应用程序会将请求地址添加到在线用户列表中,并通过 event: user 类型的事件将该用户的 IP 地址发送给 HTML 页面。

Nginx Web 服务器配置

下面是一个使用 Nginx Web 服务器配置的聊天室后端应用程序。它将 Nginx 配置为反向代理,将所有 HTTP 请求代理到 Express.js 应用程序上。它还支持 SSE 和 WebSocket 的代理传输。

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

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

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

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

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

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

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

该 Nginx 配置文件配置了一个 upstream,用于将所有流量代理到 Express.js 应用程序的端口 3000location / 将所有普通 HTTP 请求代理到 app,而 location /stream 代理所有 SSE 和 WebSocket 请求到 app。还需要注意的是 Nginx 缓存设置,这对于 SSE 和 WebSocket 传输非常重要。在 SSE 和 WebSocket 中,一旦同一连接关闭,就无法重复建立,因此不能使用缓存。

结论

本文展示了如何使用 SSE 和 Nginx 构建一个在线聊天室应用程序。虽然 SSE 相对于 WebSocket 功能较少,但是对于某些应用程序,它是一种更加轻量和简单的方案。本文的示例代码可以作为初学者学习 SSE 怎样在服务器和前端之间进行通信的一个好的参考。

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


猜你喜欢

  • 解决 Kubernetes 集群 DNS 问题的完美方案

    介绍 Kubernetes 是一个非常流行的容器编排系统,可以帮助我们管理和扩展应用程序的部署。然而,在使用 Kubernetes 时,可能会遇到 DNS 问题,例如域名解析失败,服务发现问题等。

    10 天前
  • Server-sent Events 和 Ajax 轮询的对比分析

    Server-sent Events 和 Ajax 轮询是实现服务器与浏览器之间实时通信的两种方案。Server-sent Events(以下简称 SSE)是 HTML5 引入的新特性,而 Ajax ...

    10 天前
  • 使用 Material Design 为 iOS App 创建动态开屏界面

    Material Design 是一种全新的设计风格,由 Google 推出。它的理念是为所有平台提供相同的设计语言,使用户能够更轻松地学习和使用应用程序。Material Design 同时提供了丰...

    10 天前
  • 无障碍性能测试最佳实践

    在前端开发中,无障碍性能测试是一个重要的领域,因为它可以帮助我们确保我们的网站和应用程序对所有用户都具有可访问性。本文将介绍无障碍性能测试的最佳实践,以及如何使用它来提高用户体验。

    10 天前
  • Next.js 中如何配置 PWA 支持?

    随着移动设备的普及,PWA(Progressive Web Apps)已经成为了现代 Web 开发中的热门技术之一。Next.js 作为一种流行的 React 框架,也支持 PWA,让我们能够创建出类...

    10 天前
  • Serverless中如何实现数据加密

    随着云计算技术的不断发展,Serverless架构在近年来越来越被广泛应用。然而,使用Serverless架构也同时带来了一些安全问题,比如数据的加密。数据加密是应用程序安全的一个关键环节,本文将介绍...

    10 天前
  • Redux 如何解决 React 中数据管理的混乱问题

    在 React 应用中,随着组件层次的不断加深,数据管理变得日益复杂。在传递数据的过程中,组件之间的耦合度很高,也很难维护。Redux 是一个使用 Flux 架构思想的开源 JavaScript 库,...

    10 天前
  • 使用 Workbox 实现在 PWA 中处理预缓存资源

    在现代 web 应用程序中,离线支持和快速加载速度是至关重要的。Progressive Web Apps(PWA)使我们能够在网络可用时动态加载资源,并在离线时使用预缓存资源。

    10 天前
  • RxJS 优化:避免取消订阅导致的内存泄漏

    RxJS 是目前前端开发中广泛使用的响应式编程库之一,用于处理异步数据流。RxJS 的优点之一是可以通过订阅和取消订阅来控制数据流。但是,如果不小心处理不当,取消订阅可能会导致内存泄漏。

    10 天前
  • Web Components 开发实战:使用 Polymer 构建单页面应用

    随着互联网的普及,Web 这个平台也变得越来越复杂。从最初的 HTML、CSS、JavaScript,到如今的 AJAX、前端框架,这一路上我们见证了前端技术的飞速发展。

    10 天前
  • SASS 与 Less 的比较分析

    前端开发过程中需要管理复杂的 CSS 样式,SASS 与 Less 是两种常用的CSS预编译器,它们提供了编程语言的特性,相比原生CSS更加灵活、可读性更高,本文对SASS与Less进行深入比较分析。

    10 天前
  • 从入门到实践:Kubernetes 服务的负载均衡

    Kubernetes是一款非常流行的容器编排工具,可以方便地部署、扩展和管理容器应用。Kubernetes中的服务(Service)是一种抽象的逻辑概念,可以将应用程序的实例打包成一组虚拟的Pod,并...

    10 天前
  • ESLint 插件 eslint-plugin-vue 的使用方法详解

    ESLint 是一个非常流行的 JavaScript 代码检测工具,能够帮助开发人员提高代码质量。而 eslint-plugin-vue,则是基于 ESLint 的 Vue.js 代码检测插件,能够检...

    10 天前
  • 使用 Enzyme 测试 React 组件的常见误解与错误建议

    Enzyme 是 React 的官方测试库之一,它可以帮助我们测试组件的各种状态和行为。虽然 Enzyme 是一个非常强大的工具,但是在使用的过程中也有一些常见的误解和错误。

    10 天前
  • 使用 MongoDB 修复数据时需要注意哪些问题?

    如果你正在使用 MongoDB 作为你的数据库,那么你很有可能需要修复数据。不管是在做数据迁移、数据清理、数据校验或是其他数据操作,修复数据非常重要。 在本文中,我们将谈论一些使用 MongoDB 修...

    10 天前
  • 使用 Istanbul 覆盖率工具统计 Mocha 单元测试代码覆盖率

    使用 Istanbul 覆盖率工具统计 Mocha 单元测试代码覆盖率 前言 在前端开发中,单元测试是不可或缺的一环,它可以保证代码的质量和稳定性。而代码覆盖率则是评估测试的重要指标之一,它可以帮助开...

    10 天前
  • PM2 管理多个 Node.js 应用程序的技巧

    在前端开发中,有时候需要同时管理多个 Node.js 应用程序,单独管理每个应用程序是很困难的,而 PM2 就是一种解决方案。本文将介绍如何使用 PM2 管理多个 Node.js 应用程序的技巧。

    10 天前
  • 使用 Aria 标准构建无障碍 Web 界面

    前言 随着互联网的不断发展,Web 界面已经成为人们日常生活中不可或缺的一部分。然而,对于一些身体或感官上存在障碍的用户(例如视觉或听觉障碍者),Web 界面的使用可能会带来一些困难。

    10 天前
  • 如何采用 Webpack 构建单页应用与多页应用

    前言 随着前端技术的不断发展,单页应用(SPA)和多页应用(MPA)越来越成为前端工程师们的关注点。而 Webpack 已经成为了前端构建工具的领先者之一,开发者可以借助其强大的打包能力和灵活的配置来...

    10 天前
  • Redux 中如何处理多人协同工作?

    Redux 中如何处理多人协同工作? 作为一种流行的 JavaScript 应用程序状态管理解决方案,Redux 可以非常有效地帮助我们管理状态。然而,当多个开发人员同时工作,特别是在大型应用程序中,...

    10 天前

相关推荐

    暂无文章