Fastify 集成 node-socket.io 实现 WebSocket

WebSocket 是一种实时通信协议,可以在客户端和服务器端之间创建 "实时" 的双向连接。而 Fastify 是一个高效、低开销的 Web 框架,它非常适合构建高性能Web项目。

在本篇文章中,我们将引导您如何在 Fastify 中集成 node-socket.io 实现 WebSocket,以及如何使用它。本文假设您已经了解了基本的 HTML、JavaScript 和 Node.js。

准备工作

在开始之前,您需要确保已经安装了 Node.js 和 npm。

安装 Fastify 和 socket.io:

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

集成 socket.io

Fastify 并不提供 WebSocket 的实现,但是我们可以很容易地使用 socket.io。接下来,我们将展示如何将它集成到 Fastify 中,并实现一个简单的聊天室应用程序。

创建服务器

首先,我们需要创建一个 HTTP 服务器和一个 Fastify 实例,以便 socket.io 可以使用它。让我们创建一个 index.js 文件:

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

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

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

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

在这里,我们创建了一个 HTTP 服务器和 Fastify 实例,并使用 http 与它们相关联。然后,我们使用 socket.io 创建一个 WebSocket 服务器,并将其附加到这个 HTTP 服务器上。io.on() 事件监听器用于侦听来自客户端的连接和断开事件。

创建客户端

接下来,我们需要创建一个基本的客户端,以便验证 WebSocket 服务器是否正在工作。在您的 HTML 文件中添加以下代码:

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

这个客户端文件创建了一个基本的 HTML 页面,其中包含一个用于添加 socket.io JavaScript 库的 <script> 标签。然后,它实例化一个 io() 对象,并使用 socket.on() 事件监听器侦听连接和断开事件。

测试

现在,让我们启动服务器并在浏览器中打开客户端文件。使用以下命令在终端中启动服务器:

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

此时,您应该能够看到终端中的 "listening on *:3000" 消息。在浏览器中打开 http://localhost:3000,打开开发者工具,在控制台中将看到 "connected" 消息。

创建聊天室

接下来,我们将改造我们的服务器代码,以便能够实现我们的聊天室。我们将为连接的每个客户端创建一个用户对象,以便跟踪连接。

index.js 文件中添加以下代码:

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

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

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

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

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

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

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

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

这个更新过的代码使用 letconst 关键字声明了两个变量。一个是 nextUserId,它将在每次连接时分配一个唯一的用户 ID。另一个变量是 users,它是一个应用程序范围的对象,用于存储所有已连接的用户。

当一个新的客户端连接时,我们将创建一个新的 user 对象,并将其添加到 users 对象中。我们使用 socket.on('message', ...) 处理接收到的消息,并将每条消息发送给所有连接的客户端。

在这个版本的代码中,我们也处理了连接的断开。当一个客户端断开连接时,我们将删除该客户端的 user 对象。

现在,我们已经完成了我们的服务器代码。接下来,我们将更新客户端代码,以便能够发送和接收消息。

在您的 HTML 文件中添加以下代码:

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

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

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

这个更新后的代码添加了一个简单的表单,以便发送 WebSocket 消息。我们还将收到的消息添加到页面上的消息列表中。

测试

现在,让我们现将服务器启动并在浏览器中打开客户端文件。使用以下命令在终端中启动服务器:

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

在浏览器中打开 http://localhost:3000,并尝试与其他窗口或标签进行交互。您应该能够在页面中确认发送和接收到的消息,这证明了我们已经成功地集成了 socket.io 并使用它构建了一个简单的聊天室。

结论

在本文中,我们学习了如何使用 Fastify 和 socket.io 构建一个简单的 WebSocket 聊天室应用程序。我们了解了 Fastify 和 socket.io 的工作原理,并创建了一个用于跟踪连接的用户对象。最后,我们展示了如何实现基本的聊天室功能。

这个例子是非常简单的,但是你可以在这个基础上建立更复杂的实时应用,比如即时游戏、交互式聊天应用、在线协作等。希望这篇文章能给你提供一些想法和指导,让你能够更好地使用 WebSocket 在你的项目中进行实时通信。

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


猜你喜欢

  • Fastify 对比 Koa,哪一个更好?

    在 Node.js 的服务器端开发中,有许多可供选择的框架和库。其中,最受欢迎的两个是 Fastify 和 Koa。它们都是轻量级、灵活且适应性强的框架,适用于构建可伸缩的 Web 应用程序和 RES...

    4 天前
  • 如何在 Cypress 中实现批量执行测试用例

    介绍 在前端开发中,测试是非常重要的一环。而 Cypress 作为一款流行的前端自动化测试框架,其强大的功能和易用的特点,已经得到了开发者们的广泛认可。不管是单个测试用例的执行,还是批量测试用例的执行...

    4 天前
  • 无障碍设计:如何减轻老年人士使用网站的难度?

    无障碍设计(accessibility design),是指设计能够让各种类型的用户,包括老年人士、聋哑人士、视力障碍者、身体残障者等都能够方便地使用的产品。对于网站设计而言,无障碍设计也是非常重要的...

    4 天前
  • SSE 的安全性问题及防范措施

    在前端开发中,使用 Server-Sent Events(SSE)可以实现服务器向客户端推送实时数据的功能,非常方便和实用。然而,SSE 也存在一些安全性问题,如果不采取相应的防护措施,可能会造成一些...

    4 天前
  • Koa 中使用 Mongoose 进行数据库操作的教程

    在 Node.js 中,Koa 是一个常用的 Web 框架,而 Mongoose 则是用于 MongoDB 数据库的一种数据建模库。在 Koa 应用程序中使用 Mongoose 进行数据库操作可以帮助...

    4 天前
  • Deno 中如何实现状态管理?

    在 web 前端开发中,状态管理是一个非常重要的话题。状态是指应用的所有数据,包括用户信息、页面的呈现方式和应用的行为等等。在 Deno 中,我们可以使用不同的库和技术来管理状态。

    4 天前
  • 使用ES7的Array.prototype.entries方法遍历数组

    在日常开发中,遍历数组是常见的任务之一。JavaScript提供了多种遍历方法,但在ES7中,Array.prototype.entries方法让你能够更方便地遍历数组并获取索引和元素值。

    4 天前
  • Redux 结合 ImmutableJS 优化数据访问和更新性能

    在前端开发中,我们经常需要管理复杂的状态和数据。Redux 是一个流行的状态管理库,而 ImmutableJS 是一个不可变数据结构库,它们配合使用可以提高数据访问和更新的性能。

    4 天前
  • 响应式设计遇到的视觉错位问题及解决方法

    随着移动设备的普及,响应式设计已经成为了现代网页设计的标配。但是,尽管通过响应式设计可以让网站在不同设备上呈现出更好的布局和用户体验,但这并不意味着它没有任何问题。

    4 天前
  • RxJS 中 throttleTime 操作符的描述

    RxJS 是一个流式编程库,使得实现具有响应式特点的应用程序变得更加容易。RxJS 中的操作符可以帮助处理数据流,比如 throttleTime 操作符。 throttleTime 操作符概述 thr...

    4 天前
  • SASS vs. SCSS:哪一个更好?

    在现代Web开发中,前端是不可或缺的一部分。对于前端开发人员来说,CSS是一个不可避免的部分。但是,随着项目的规模和复杂性增加,手动编写复杂的CSS代码变得越来越困难和冗长。

    4 天前
  • ESLint 在 IntelliJ IDEA 中的使用及配置

    前言 在前端开发中,我们经常需要在写代码的过程中检测和修复潜在的问题,保证我们的代码质量和一致性。而 ESLint 就是这样一款非常优秀的 JavaScript 语言的静态代码分析工具,它可以帮助我们...

    4 天前
  • Docker 容器内部的目录和变量映射方法详解

    一、前言 Docker 是目前非常流行的容器技术,可以用来构建、部署和运行应用程序,并且具有跨平台、轻量级、弹性扩展等优点。在 Docker 中,容器是一个独立的运行环境,可以与主机隔离,因此需要进行...

    4 天前
  • Promise 如何处理嵌套异步请求

    前言 在开发中,经常会遇到需要嵌套多个异步请求的情况。如果使用传统的回调函数方式,代码会变得非常混乱、难以维护。而 Promise 则可以很好地处理这种情况,让代码更加清晰简洁。

    4 天前
  • 如何使用 SSE 在移动端实现实时消息推送

    近年来,实时消息推送已经成为了现代 web 应用程序中不可或缺的功能之一。实时消息推送为用户提供了一种高效的方式来更新他们的数据,同时提供了一个强大的工具来确保即使在网络不稳定或断线的情况下,他们仍能...

    4 天前
  • 无障碍设计:如何利用 AR 技术为盲人提供更好的体验?

    作为前端开发人员,我们的目标是为用户创造更好的体验,但是对于盲人来说,网络浏览和移动应用程序的使用可能会非常困难。在我们的设计和开发过程中,我们需要考虑如何让我们的产品更加无障碍,以满足所有人的需求。

    4 天前
  • 在 React 组件中使用 React Native 组件并进行 Enzyme 测试

    React Native 是一个让开发者可以用 React 的思维方式编写移动应用的框架,而且很多组件和 API 也和 React 相同。在 React 应用中,我们可以使用 React Native...

    4 天前
  • RESTful API 中如何正确处理跨域问题

    对于一些 Web 应用程序开发,跨域问题是一些开发人员经常会面对的难题。在 RESTful API 开发中,一个常见的问题是如何正确处理跨域问题。本文将会详细介绍 RESTful API 中的跨域问题...

    4 天前
  • 如何使用 Serverless 框架进行函数调试

    什么是 Serverless 框架? Serverless 框架是一个开源的 CLI(命令行界面)工具,它可以帮助开发人员在无需管理基础设施的情况下构建和部署应用程序。

    4 天前
  • 响应式设计中如何应对多设备下的字体渲染问题

    响应式设计中如何应对多设备下的字体渲染问题 随着移动设备的普及和屏幕多样化,响应式设计越来越成为前端设计的主流。而响应式设计无疑将面临多设备下的字体渲染问题。 在传统设计中,设计师往往可以根据具体的设...

    4 天前

相关推荐

    暂无文章