WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,可以用于实现实时通信,比如聊天室、游戏等。Express.js 是一个流行的 Node.js Web 框架,它可以方便地构建 Web 服务器。在本文中,我们将使用 Express.js 构建一个 WebSocket 服务器,并开发一个简单的秒杀系统。
准备工作
在开始之前,我们需要安装 Node.js。可以从 Node.js 官方网站 下载安装包,然后按照提示进行安装。安装完成后,我们可以使用 Node.js 命令行工具来检查是否安装成功:
$ node -v v14.17.5
接下来,我们需要创建一个新的 Node.js 项目,并安装 Express.js 和 WebSocket 模块:
$ mkdir seckill $ cd seckill $ npm init -y $ npm i express ws
npm init -y
命令会创建一个新的 package.json
文件,其中包含了项目的信息和依赖项。npm i express ws
命令会安装 Express.js 和 WebSocket 模块。
构建 WebSocket 服务器
在开始编写代码之前,让我们先了解一下 WebSocket 的基本概念。WebSocket 通信由客户端和服务器端组成。当客户端请求与服务器端建立 WebSocket 连接时,服务器端会返回一个握手响应。一旦建立了 WebSocket 连接,客户端和服务器端就可以使用 send()
方法相互发送数据。
我们将使用 Express.js 来构建 WebSocket 服务器。首先,让我们在项目根目录下创建一个名为 server.js
的文件,并编写以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- ------ - ---------------------------------- ----- --------- - -------------- ----- --- - --- ------------------ ------ --- -- -- --------- -- -------------------- ------ -- - ------------------------- -- ---- -------------------- ------- -- - ---------------------- ---- --------- -- ---- ---------------- ----- ------------- --- -- ------ ------------------ -- -- - ---------------------------- --- --- -- ----- ------------------- -- -- - ------------------- --------- -- ------------------------ ---
以上代码创建了一个 Express.js 应用程序,并在其上创建了一个 WebSocket 服务器。在客户端连接到 WebSocket 服务器时,会触发 connection
事件。在连接建立后,我们可以监听 WebSocket 上的消息和关闭事件,然后分别做出响应。
我们现在可以使用 node server.js
命令来运行服务器。在浏览器中打开地址 http://localhost:3000
,可以看到控制台输出 Server listening on http://localhost:3000
。
接下来,我们需要编写客户端代码来连接 WebSocket 服务器。在浏览器中打开开发者工具,并执行以下代码:
-- -------------------- ---- ------- ----- ------ - --- --------------------------------- -- -------- ------------------------------- ----- -- - ------------------------- -- ---- ------------------- --------- --- -- ------ ---------------------------------- ----- -- - ----------------------- ------------ --- -- -------- -------------------------------- ----- -- - ---------------------------- ---
以上代码创建了一个 WebSocket 对象,并使用 ws://localhost:3000
地址连接到我们的 WebSocket 服务器。在连接建立后,我们可以发送一条消息,并在收到来自服务器的响应时打印该消息。
开发秒杀系统
现在我们已经学会了如何使用 Express.js 和 WebSocket 模块构建 WebSocket 服务器,并连接客户端发送消息。现在让我们使用这些知识来构建一个简单的秒杀系统。
假设我们有一个秒杀商品,其库存仅为 100 件。我们需要开发一个秒杀系统,使得多个用户能够按顺序参与秒杀。当所有库存商品都已秒杀时,系统将不再接受新的请求。以下是秒杀系统的实现过程。
首先,我们需要编写一个秒杀商品的数据类:
-- -------------------- ---- ------- ----- ------- - --------------- ----- ------ --------- - ------- - --- --------- - ----- ---------- - ------ ------------- - --------- ---------------- - --- - -- ------ ---------------------- - ------------------------------ - -- ------ ------------------------- - ---------------- - ------------------------- -- - --- -------- - -- ---------- -------------------- - ------ ----------------------- --- -- - -- ------ ------------------------- ---- - ---------------------------- -------- ---------- -------- ---- ---- - -- ------ ---------------------------- - -- -------------- - -- - ---------------- ------------------------------ --------- - ---- - ---------------------------- ------------------------------ ----------------- - - -- ------ ------------------- - ----- ------ - ------------------------- -- -------- - ------------------------------ --------- - - -
上述代码定义了一个产品类,它包含了产品的基本信息,并提供了处理秒杀请求的方法。如果库存商品充足,则将商品数量减少,并向客户端发送秒杀成功的消息。如果库存商品缺货,则将该客户端添加到等待列表中,向客户端发送秒杀失败的消息。
接下来,我们需要编写 Express.js 路由来处理客户端的 WebSocket 连接。在 server.js
文件中,添加以下代码:
-- -------------------- ---- ------- ----- -------- - - --- ---------------- ----- --- ----- --- ----------------- ----- -- ---- -- -- -- --------- -- ----------------------------- -------- ---- -- - ----- --------- - --------------------- ----- ------- - --------------- -- ---- --- ----------- -- -------- -- ---------- - ---------------------------- -------- ------ ----------------- ---- --------------- ------- - -- ------ ------------------------------------- -- ------ -------------- -- - -- ------------------------------ -- ---------------- - -- - ---------------------------- - -- ------ ---
上述代码定义了一个 '/seckill/:productId'
路由,用于处理客户端的 WebSocket 连接。在连接建立后,该路由会根据 :productId
参数查找对应的产品。如果产品不存在,则向客户端发送错误消息,并关闭连接。否则,路由将处理客户端的秒杀请求,并将其加入等待列表中。每秒钟检查一次等待列表,如果找到可用库存商品,则将下一个客户端加入秒杀列表中,并向其发送秒杀成功的消息。
在客户端代码中,我们需要选择要秒杀的产品,并连接到 WebSocket 服务器。以下是一个示例代码:
-- -------------------- ---- ------- ----- --------- - -------- ----- ------ - --- ------------------------------------------------------ ------------------------------- ----- -- - ---------------------- -- --------------- --------------------- --- ---------------------------------- ----- -- - ------------------------ --- -------------------------------- ----- -- - ------------------------- ---- --------------- ---
上述代码连接到 WebSocket 服务器,并指定了要秒杀的产品 ID。在连接建立后,客户端将发送一条消息到 WebSocket 服务器,请求秒杀产品。在接收到来自服务器的响应时,客户端将打印响应消息。
总结
在本文中,我们使用 Express.js 和 WebSocket 模块构建了一个简单的 WebSocket 服务器,并使用该服务器开发了一个秒杀系统。我们还介绍了 WebSocket 的基本概念和操作,以及如何使用 Express.js 路由处理客户端的 WebSocket 连接。这些知识将帮助您更好地理解 WebSocket 技术和实现实时通信的 Web 应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651fa1b495b1f8cacd72a34b