使用 Node.js 和 Express.js 实现基于 WebSocket 的即时通讯

引言

随着科技的不断发展,人们越来越注重实时通讯的重要性。而且,现代 Web 应用程序需要在用户与应用程序之间进行实时数据交换。在过去,这种交互是通过使用轮询和长轮询实现的。这些方法的主要问题是它们对服务器和网络带宽造成了很大的压力。现在,基于 WebSocket 技术的即时通讯已经成为了一个更普遍的解决办法。

在本文中,我们将介绍如何使用 Node.js 和 Express.js 实现基于 WebSocket 的即时通讯。我们将涉及的主要主题包括:

  • WebSocket 协议的介绍
  • 基于 Express.js 和 ws 库的 WebSocket 服务器
  • 实现一个简单的聊天程序示例

什么是 WebSocket 协议

WebSocket 是基于 HTTP 协议设计而成的一种实时的、双向的通讯协议。它是在客户端和服务器之间建立一条持久连接,使得双方可以随时发送数据,而不必担心网络带宽的限制。而且,WebSocket 协议使得服务器可以向客户端推送数据,这种机制在实时通讯和实时监测方面非常有用。

在 WebSocket 协议中的通讯过程类似于下图:

WebSocket 连接建立后,服务器和客户端都可以发送信息。当一个端点发送消息时,它会将它封装在帧中并将其发送出去。接收者将解析这个帧并采取适当的行动。服务器和客户端之间的数据传输可以以文本或二进制形式进行。

基于 Express.js 和 ws 库的 WebSocket 服务器

Node.js 为开发者提供了一种快速、可靠地搭建 WebSocket 服务器的方式。在本文中,我们将使用 ws 库来实现 WebSocket 服务器,而该库依赖于 Node.js 和 Express.js。

安装所需的库

要使用 ws 库,您需要在项目中安装它,可以使用 npm 包管理器快速实现:

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

创建基于 Express.js 的 WebSocket 服务器

下面是如何创建一个简单的基于 Express.js 的 WebSocket 服务器:

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

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

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

在上述代码中,我们使用 Express.js 创建了一个 HTTP 服务器,然后创建了一个基于 WebSocket 的服务器实例,并将其附加到我们的 HTTP 服务器上。最后,我们在服务器上监听端口 3000,并对新的 WebSocket 连接和消息进行处理。

实现一个简单的聊天程序示例

让我们来创建一个简单的聊天室。每个客户端都可以向服务器发送消息,并将该消息广播到所有已连接客户端。

服务端代码

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

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

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

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

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

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

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

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

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

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

在上述代码中,我们首先定义了一个空的客户端数组,每次连接时将客户端添加到该数组中。接着,我们监听 'message' 事件,在收到消息后向其他客户端广播该消息。最后,当客户端断开连接时,我们从客户端数组中删除该客户端。

客户端代码

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

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

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

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

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

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

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

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

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

-------

上述代码很简单,用于呈现用户界面并监听表单提交事件。当表单被提交时,它将发送消息到 WebSocket 服务器。并且,它还放置消息到待接受消息列表的后面(大家可以看到一个连接页面,并进行输入、发送消息等操作)。

总结

在本篇文章中,我们介绍了 WebSocket 协议及其实时通讯优点,并且使用 Node.js 和 Express.js 实现基于 WebSocket 的即时通讯,并举了一个聊天程序的例子来展示 WebSocket 的使用。WebSocket 不仅适用于聊天和在线游戏应用程序,还适用于与客户端进行实时通信的大多数现代应用程序。希望这篇文章能有所帮助,使前端工程师可以更好地理解和使用 WebSocket。

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


猜你喜欢

  • ES2021:如何使用 modular 开发

    随着前端开发技术的不断发展,JavaScript也不断地被更新和改进,带来更多强大的功能和更好的使用体验。其中,ES2021作为最新的标准,也为前端开发者带来了许多新的特性和技术。

    1 年前
  • ES6 中类与实例的关系及其应用

    ES6 是 JavaScript 发展的一个重要里程碑,其中引入了类和实例的概念。本文将介绍 ES6 中类与实例的关系,以及如何在实际中应用它们。同时,我们将深入讨论类的继承、静态方法和访问器等高级特...

    1 年前
  • 如何较好地解决响应式设计中的水平滚动条问题?

    在响应式设计中,我们常常会面临水平滚动条的问题。当页面中的元素宽度超出了视口宽度时,浏览器会自动显示水平滚动条,这会影响用户体验和页面的美观性。本文将介绍如何在响应式设计中较好地解决水平滚动条问题。

    1 年前
  • Sequelize 图形化管理工具的使用

    简介 Sequelize 是 Node.js 中非常流行的 ORM(对象-关系映射)框架,它提供了方便的操作关系型数据库的方法及 API,可以使用它来操作多种数据库系统,包括 MySQL、SQLite...

    1 年前
  • 单页应用(SPA)实践填坑之路

    在现代Web开发中,单页应用(SPA)已经成为一种趋势。单页应用通过异步加载和页面区块更新,向用户提供了更加流畅的使用体验。本文将从入门到实践,讲解单页应用的实践过程中遇到的一些问题和解决方案,帮助读...

    1 年前
  • ES7 中 String.prototype.replaceAll 的使用

    ES7 中 String.prototype.replaceAll 的使用 在 ES7 中,JavaScript 为字符串原型对象增加了一个新方法:replaceAll。

    1 年前
  • 如何使用 Chai 测试 selenium webdriver

    如何使用 Chai 测试 Selenium WebDriver Selenium WebDriver 是一个常用的自动化测试工具,但是在进行测试过程中往往需要一个良好的断言库,Chai 就是非常优秀的...

    1 年前
  • RxJS zip 操作符解析

    引言 在前端开发中,数据的异步通信和处理是一个很重要的方面。RxJS 是一个强大的异步编程库,其中 zip 操作符可以将多个 Observables 中对应的数据项组合成一个数组,提供了更加灵活的数据...

    1 年前
  • Serverless 应用的性能优化与调试技巧

    什么是 Serverless 应用? Serverless 应用是一种基于云服务平台的应用开发模式,其中应用开发者不需要管理服务器、操作系统等底层基础设施,而是使用云服务提供商所提供的无服务器计算服务...

    1 年前
  • 快速掌握 ECMAScript 2019 新特性

    ECMAScript 是一组用于实现脚本语言的标准化规范,它是 JavaScript 的标准化实现。每年,ECMAScript 都会更新一次新的规范,以加入新的语言特性,提高 JavaScript 的...

    1 年前
  • 使用 Koa2 和 Joi 进行表单验证

    在 Web 应用程序中,表单是一种重要的组件,通常用于接受用户输入的数据。然而,由于用户可能会通过各种方式输入错误的、无效的或恶意的数据,导致程序出现异常或安全漏洞。

    1 年前
  • Sass 中选择器嵌套使用技巧

    在前端开发中,CSS 的编写是我们不可避免的工作之一。而 Sass 作为一个 CSS 预处理器,可以大大提高我们的工作效率。其中,选择器嵌套是 Sass 具有的强大特性之一。

    1 年前
  • 使用 Node.js 和 Koa2 构建 Web 应用

    介绍 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,可通过使用它构建高效的网络应用程序和 Web 服务器。Koa2 是 Node.js 的一个 Web 框架,它...

    1 年前
  • # Mongoose 连接数据库的方式

    Mongoose 连接数据库的方式 在前端开发中,数据库连接是必不可少的环节。而 Mongoose 是一个优秀的 Node.js 数据库工具,让我们能够轻松地连接 MongoDB 数据库。

    1 年前
  • LESS 解决圆角边框虚化像素问题的方法

    在前端开发中,经常会遇到通过圆角边框来美化界面的需求。但是,使用CSS属性实现圆角边框时,很容易出现边框虚化的问题。这个问题不仅影响UI美观度,还可能影响网页性能和响应速度。

    1 年前
  • Angular 数据绑定的几种方法

    在 Angular 中,数据绑定是非常重要的一环。它是将组件中的数据和模板中的元素结合起来,实现动态展示的关键。本文将讲解 Angular 中数据绑定的几种方法,以及它们的特点和使用场景。

    1 年前
  • 使用 PM2 和 Nginx 实现 Node.js 进程横向扩展

    Node.js 的高效性和可扩展性已经让它成为了 Web 开发中广受欢迎的技术。不过,在实际的应用中,我们还需要考虑如何实现 Node.js 进程的横向扩展,以应对高并发的请求。

    1 年前
  • # RESTful API 如何处理进程间通信?

    RESTful API 如何处理进程间通信? 在前端开发中,RESTful API 被广泛使用,而进程间通信也是常见的需求。本文将讨论如何通过 RESTful API 实现进程间通信。

    1 年前
  • Socket.io 的底层技术讲解以及使用方法

    Socket.io是一个使用JavaScript编写的实时网络应用程序库,允许服务器发送实时事件到客户端,同时也允许客户端发送实时事件到服务器。本文将深入探讨Socket.io的底层技术以及使用方法。

    1 年前
  • 使用 Headless CMS 打造开源社区,需要注意哪些事项?

    前言 随着互联网的发展,开源社区越来越受欢迎。许多开发者都希望有一个安全、可靠的平台,在这里分享代码、资源、经验和知识。而一个好的开源社区需要有一个强大的基础设施,包括服务器、数据库、存储等等,这些都...

    1 年前

相关推荐

    暂无文章