使用 Socket.IO 构建在线协作应用的完整教程

面试官:小伙子,你的数组去重方式惊艳到我了

在现代网络应用程序开发中,实时互动和协作成为了一种必要的功能。这就需要我们将传统的“请按 F5 刷新页面”模式升级为实时网络模型,这一模型需要实时反馈和数百或数千个同时连接的用户。 Socket.IO 是一个基于 Node.js 的库,提供了一种简单的、使用常规 JavaScript 对象实现的快速、可靠的实时网络解决方案。在本文中,我们将使用 Socket.IO 构建一个在线协作应用程序,并探讨如何将其与现代 Web 技术集成。

环境设置

在开始本文之前,必须先安装 Node.js 和 npm。 可以通过 https://nodejs.org 下载并安装它们,安装过程中请遵循提示进行操作。

创建一个基本的 Socket.IO 应用程序

我们通过以下步骤创建一个基本的 Socket.IO 应用程序:

  1. 创建一个文件夹并将其命名为 socketio-test,进入该文件夹并初始化 Node.js 项目。运行以下命令:
----- -------------
-- -------------
--- ----
  1. 安装 Socket.IO 库,运行以下命令:
--- ------- ---------
  1. 创建一个 index.js 文件,并使用以下代码填充它:
----- ---- - ----------------
----- -------- - ---------------------

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

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

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

------------------- -------- -- -
    -------------- ---- ------------
---
  1. 打开终端并切换到 socketio-test 目录,运行以下命令启动 Socket.IO 应用程序:
---- --------
  1. 打开浏览器并输入 http://localhost:3000 访问应用程序,此时您应该会看到类似于“这是一个 Socket.IO 测试应用程序!”的消息。在终端中输出的日志中,应该会看到 “A user connected” 消息,这表明我们的应用程序已经开始监听连接并响应。

实现聊天室应用程序

现在我们使用 Socket.IO 构建一个简单的聊天室应用程序。要实现聊天应用程序,我们需要添加一些 Socket.IO 事件,并基于这些事件实现我们的代码逻辑。代码如下:

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

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

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

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

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

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

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

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

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

我们添加了三个新的事件:

  1. login。当用户登录时,该事件被触发。我们存储在线用户、发布欢迎消息和系统消息,并广播当前在线用户列表。
  2. chat message。当用户发送聊天消息时,该事件被触发,并通过 io.emit() 将消息传送给所有已连接的客户端对象。
  3. disconnect。当用户关闭浏览器或断开与服务器的连接时,该事件被触发。我们删除在线用户、发布系统消息,并广播当前在线用户列表。

在客户端上,我们需要添加一些代码来响应这些 Socket.IO 事件。代码如下:

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

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

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

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

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

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

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

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

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

    ----

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

这里我们添加了一些新的事件处理程序:

  1. loginForm。在登录表单提交时,我们通过 socket.emit() 发送 login 事件并向服务器传递用户名。
  2. chatForm。在聊天消息表单提交时,我们通过 socket.emit() 将消息传递给其他已连接的客户端对象。
  3. welcome message。在客户端登录成功时,我们监听 welcome message 事件并通过 jQuery 构建的 DOM 元素把欢迎消息追加到聊天消息列表。
  4. chat message。当其他可连接的客户端对象发送聊天消息时,我们监听 chat message 事件并通过 jQuery 构建的 DOM 元素把聊天消息追加到聊天消息列表。
  5. system message。在其他客户端登录或退出时,我们监听 system message 事件并通过 jQuery 构建的 DOM 元素将系统消息添加到系统消息列表。
  6. online users。在客户端成功登录或其他客户端断开连接时,我们监听 online users 事件并通过 jQuery 构建的 DOM 元素把当前在线用户列表追加到在线用户列表。

结论

现在您已经学习了如何使用 Socket.IO 在 Node.js 应用程序中实现实时网络功能。无论您是新手、有经验的开发人员还是业余爱好者,通过 Socket.IO 您可以创建出美妙的实时应用程序。趁着这个机会,为您的下一个项目增加实时功能,吸引更多的用户并提升他们的体验!

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


猜你喜欢

  • Kubernetes 部署 ELK 日志集中

    在现代化的云原生环境下,随着应用程序规模的不断增长和多样化,记录和管理大量的日志变得更加困难。正是因为如此,我们需要一个系统来从各种应用程序和服务中收集、解析、存储和分析日志。

    25 天前
  • Cypress 测试中的断言技巧和经验

    Cypress 是一个非常流行的前端端到端测试框架,它的 API 提供了许多方便实用的方法和断言,简化了测试写作的过程,同时也让我们更容易管理测试用例。本文将着重介绍 Cypress 中的断言技巧和经...

    25 天前
  • 使用 Express.js+EJS 实现用户登录验证

    本文将介绍如何使用 Express.js web 应用框架和 EJS 模板引擎实现用户登录验证。本文会详细介绍登录验证的原理,以及如何通过代码示例实现登录验证。 什么是 Express.js? Exp...

    25 天前
  • MongoDB 查询优化实现方法详解

    在前端开发中,MongoDB是一个广泛使用的NoSQL数据库。它的高效性和可伸缩性广受开发者的喜爱。但是,当数据集非常大时,查询性能可能会变慢,这时需要进行优化。本篇文章将详细介绍MongoDB查询优...

    25 天前
  • 使用 Enzyme 对 React 单元测试的最佳实践

    本篇文章介绍了使用 Enzyme 对 React 组件进行单元测试的最佳实践。文章包含深度和学习指导,示例代码和详细说明。 什么是 Enzyme Enzyme 是一个 React 组件的 JavaSc...

    25 天前
  • 从 Hapi.js 源码看 Node.js 框架设计的宽容性和自由度

    Node.js 是一个开放源代码的跨平台 JavaScript 运行环境。由于其易于使用和高效性,越来越多的开发者开始采用 Node.js 开发 Web 应用程序。

    25 天前
  • 用无障碍的思路构筑电商网站

    在如今的网络时代,无障碍网站已经成为越来越受欢迎的话题。随着技术的进步和社会的发展,越来越多的人需要使用电子设备来访问网站,包括视力和听力障碍者、老人和残障人士等。

    25 天前
  • Angular 错误处理和调试指南

    Angular 是一个强大的前端框架,但在开发过程中也会遇到各种错误和问题。在本文中,我们将深入探讨 Angular 的错误处理和调试技术,包括错误分类、调试工具和技巧,以及如何优化开发流程,以提高代...

    25 天前
  • Redux 处理跨域请求

    什么是 Redux? Redux 是一种 JavaScript 应用程序状态管理工具,它用于处理应用程序数据的流动,帮助我们创建更加可预测的应用程序。 Redux 在 Web 应用程序中广泛使用,特别...

    25 天前
  • Socket.IO 处于闲置状态时如何自动断开连接

    在前端开发中,Socket.IO 是一个非常常见的技术,用于实现即时通讯和实时数据交换。但是,如果用户长时间处于闲置状态,即没有任何操作或数据发送,此时服务器与客户端之间的连接可能会一直存在而不会断开...

    25 天前
  • 用CSS Flexbox处理响应式布局

    在现代Web开发中,响应式布局是一种必不可少的设计方法。通过响应式布局,我们可以轻松地为不同的设备和屏幕大小创建适当的布局。CSS Flexbox是实现响应式布局的一种快速简单方法。

    25 天前
  • CSS Grid 如何实现响应式文字与图像布局

    CSS Grid 是最近几年来前端开发领域中最受欢迎和使用最广泛的布局方式之一,它提供了一种灵活的网格系统,可以轻松地实现各种复杂的布局需求。本文将介绍如何使用 CSS Grid 实现响应式的文字与图...

    25 天前
  • Redis 实现半同步复制

    在应用程序开发过程中,我们通常需要使用数据库来存储和管理数据。而 Redis 是一个非常流行的数据存储解决方案,被广泛用于缓存、实时数据处理、计数器等场景。在 Redis 中,数据复制是很重要的一部分...

    25 天前
  • 如何在 Deno 中实现身份验证与授权

    随着现代 Web 应用程序越来越多地使用 JavaScript 和 TypeScript,这使得基于 Deno 的应用程序变得愈发普遍。在这种情况下,身份验证和授权是不可避免的话题。

    25 天前
  • 使用 React 实现多语言切换的实现方法

    在现代 Web 应用程序的开发中,多语言支持是一个不可或缺的功能,它可以让用户在他们熟悉的语言环境下进行浏览和交互。React 是一个流行的前端框架,可以通过使用它来实现多语言切换的功能。

    25 天前
  • SASS 中变量的作用域问题及解决方案

    在使用 SASS 进行 CSS 预处理的过程中,变量是一个很常见的特性。通过定义变量,我们可以在样式表中重复使用同一个值,从而避免了代码冗余并提高了开发效率。 但是,在使用 SASS 变量的时候,变量...

    25 天前
  • Redux 中如何使用动态 Reducer

    Redux 中如何使用动态 Reducer 在 Redux 中,Reducer 负责管理应用程序状态的变化。在大多数情况下,我们将在创建 Redux 应用程序时定义和组合一组固定的 Reducer。

    25 天前
  • 使用 Nginx 和 Lua 实现 SSE 服务器的教程

    介绍 服务器端发送事件(SSE)是一种用于实现服务器与客户端实时通信的技术。SSE 允许服务器向客户端推送数据,而无需客户端发送请求。这种通信方式非常适合频繁更新的信息,如股票市场的数据、计时器或聊天...

    25 天前
  • 解决 Web Components 中的样式冲突问题

    背景 随着 Web 技术的飞速发展,Web 组件化已经成为了趋势。Web Components 是一组用于 Web 开发的浏览器标准,它可以将页面分解为可重用的组件,使得页面结构更加清晰,代码更加可维...

    25 天前
  • 解决 "Attempt to on Done twice" 错误

    在使用 Chai 实现 Mocha 测试时,可能会遇到 "Attempt to on Done twice" 错误,这通常是由于测试过程中出现多个异步操作导致的。本文将介绍如何诊断并解决这个问题。

    25 天前

相关推荐

    暂无文章