在 Deno 中使用 WebSocket 实现在线投票系统

WebSocket 是一种在 Web 应用程序中实现实时通信的技术,它可以提供基于事件的双向通信机制。Deno 是一个现代的 JavaScript 和 TypeScript 运行时,它提供了一种简单易用的方式来创建 WebSocket 服务器。

在这篇文章中,我将详细介绍如何在 Deno 中使用 WebSocket 实现一个在线投票系统。我将从 WebSocket 服务器的创建开始,一步步构建投票系统的后端,随后再在前端展示。

创建 WebSocket 服务器

首先,我们需要创建一个 WebSocket 服务器,这可以通过在 Deno 中导入 ws 模块来完成。我们可以通过执行以下命令来安装 ws 模块:

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

安装完成后,我们可以创建一个名为 server.ts 的文件,作为 WebSocket 服务器的入口文件。在该文件中,我们可以使用以下代码创建一个 WebSocket 服务器:

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

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

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

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

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

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

在上面的代码中,我们使用 serve 函数创建了一个基本的 HTTP 服务器,并使用 acceptable 函数来检测传入的请求是否符合 WebSocket 握手协议。如果是,我们可以使用 acceptWebSocket 函数来处理该连接。在此之后,我们使用 handleWebSocket 函数来处理 WebSocket 对象的所有事件,包括接收到消息和连接关闭。

现在,我们已经创建了一个基本的 WebSocket 服务器,我们可以尝试使用浏览器来连接它。启动服务器之后,我们可以在浏览器中访问 http://localhost:8000,然后打开浏览器的开发者工具,在控制台中可以看到 Client connected 消息。

实现投票系统的后端

现在,我们可以开始实现投票系统的后端了。首先,我们需要定义投票的选项和当前的投票结果。我们可以在服务器初始化时,定义以下变量:

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

在上面的代码中,我们定义了一个名为 options 的数组,该数组包含了所有的投票选项。我们还定义了一个名为 votes 的 Map 对象,该对象将用于存储每个选项的投票结果。Map 对象将使用选项名称作为键,将投票结果存储为值。

接下来,我们需要修改 handleWebSocket 函数来处理投票系统的所有事件。我们的投票系统将有两种类型的消息:

  • get_options,客户端请求获取投票选项;
  • vote, 客户端向服务器发送投票。

以下是修改过的 handleWebSocket 函数:

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

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

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

在上面的代码中,如果我们收到一个名为 get_options 的消息,我们将使用 send 函数向客户端发送投票选项。如果我们收到一个名为 vote 的消息,我们将尝试解析选项的索引,并使用 Map 对象将投票结果存储在内存中。最后,我们将使用 broadcastVotes 函数向所有已连接的客户端广播投票结果。

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

broadcastVotes 函数中,我们将投票结果处理为一个对象数组,并将其作为 JSON 字符串发送给所有已连接的客户端。在 clients 数组中存储所有已连接的客户端对象。

实现投票系统的前端

现在,我们可以开始实现投票系统的前端了。我们将使用 Vue.js 框架来实现简单易用的前端代码。我们可以在终端中执行以下命令来创建一个新的 Vue.js 项目:

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

在创建完成之后,我们可以使用 npm run serve 命令启动开发服务器,并使用浏览器访问 http://localhost:8080

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

启动服务器之后,我们可以开始修改 src/App.vue 文件。首先,我们需要导入 vue-socket.io 功能:

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

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

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

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

在上面的代码中,我们首先导入 vue-socket.io 的功能,并定义了一个名为 optionsvotes 的变量。在组件创建时,我们使用 $socket 对象从服务器获取投票选项,并在每个投票项下方显示当前投票结果。随后,我们将监听服务器发出的 optionsvotes 事件,用于更新投票选项和投票结果。最后,我们将定义 vote 方法,该方法将向服务器发送特定选项的投票请求。

现在,我们已经完成了投票系统的前后端的所有代码。在终端中,我们可以首先启动 WebSocket 服务器:

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

接下来,我们可以在不同的终端中,分别启动 Vue.js 客户端:

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

现在,在浏览器中访问 http://localhost:8080,我们可以开始为我们最喜欢的选项投票了。

结论

本文详细介绍了如何在 Deno 中使用 WebSocket 实现一个在线投票系统,并使用 Vue.js 框架构建了一个简单易用的前端。在这个过程中,你学习了以下内容:

  • 如何创建基本的 WebSocket 服务器;
  • 如何使用 Map 对象来存储投票结果;
  • 如何使用 vue-socket.io 功能将前端与后端的 WebSocket 服务器集成起来。

WebSocket 技术是一种非常有用的实时通信技术,它可以被用于许多不同类型的应用程序中。希望本文对你学习和使用 WebSocket 技术有所帮助,也希望你可以在未来的项目中更加积极地使用 WebSocket 技术。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67370804317fbffedf078bf6