在 Deno 中使用 WebSocket 进行实时拍卖的实现

阅读时长 12 分钟读完

随着前端技术的不断更新,实时网络应用已经成为更新的极客需求。WebSocket 作为一种新的网络通信协议已经受到了广泛的关注,并被越来越多的前端工程师所接受。本文将介绍在 Deno 中使用 WebSocket 进行实时拍卖的实现。

简介

Deno 是一个安全的 TypeScript 运行时,包含了很多 Web 应用开发需要的功能,例如文件 I/O, HTTP, WebSocket 等。Denno 具有高效、安全等特点并且非常容易上手,因此越来越多的前端工程师已经选择了 Deno。

本次实战将介绍如何在 Deno 中使用 WebSocket 实现一个拍卖的实时网络应用。实时拍卖的功能需要与客户端进行即时通信,因此 WebSocket 是一个非常优秀的选择。

实现

前置条件

在进行代码编写之前,需要先安装最新版的 Deno,并确保能够在 Deno 环境下启动一个 Web 服务。这里将使用 hello 项目作为示例代码:

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

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

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

通过运行以下命令即可启动该项目:

安装 WebSocket 库

安装使用 Deno WebSocket 需要执行以下命令:

确定 WebSocket 连接 URL

首先确定 WebSocket 的连接 URL,这里我们选择 ws://localhost:3000/ws 作为 WebSocket 连接的 URL。在 hello.ts 中增加如下代码:

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

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

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

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

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

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

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

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

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

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

------

acceptWebSocket 函数中,bufReaderbufWriter 分别对应的是 HTTP 请求和响应的 reader 和 writer。

现在可以通过 ws://localhost:3000/ws 地址建立 WebSocket 连接。现在可以实现基本的客户端/服务器通信,但我们还需要实现拍卖所需的功能。

拍卖实现

实现从客户端向服务器发起新的拍卖、出价、结束拍卖等操作。对于前端页面的布局和样式不作要求,这里只需要实现所需的功能即可,例如:

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

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

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

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

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

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

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

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

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

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

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

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

其中,newAuction 函数用于向服务器发起新的拍卖请求,newBid 用于出价,endAuction 用于结束拍卖。在 socket.addEventListener 函数中可以指定对应的回调函数用于处理数据。

现在需要在服务器端处理这些请求。可以选择将拍卖的所有状态存储在内存中,但在实际应用中,这些状态应该存储在数据库中。

在这个示例中,假设服务器存储拍卖的状态,并在 handleWs 方法中使用以下代码来处理客户端请求:

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

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

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

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

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

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

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

handleWs 中,建立了一个 auctions Map 来存储所有拍卖的状态。当收到客户端的 new_auction 事件时,服务器会创建一个新的拍卖并将其存储在 auctions Map 中。当服务器收到 new_bid 时,将比较出价价格和当前最高出价价格,并更新拍卖的状态。当收到 end_auction 时,将删除拍卖对应的状态。

最后我们需要使用广播函数 broadcast 来广播状态的更改,以便所有连接的客户端都能够接收到。

总结

本文介绍了如何在 Deno 环境下使用 WebSocket 实现实时拍卖的应用。通过本文的阅读,读者可以了解到如何使用 Deno 和 WebSocket 构建实时网络应用,并具有完整的示例代码供读者学习和使用。希望本文能够对读者有所启发,能够帮助到读者在实际开发中能够更好的将 WebSocket 联系到实际的应用中。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64548da1968c7c53b0868da0

纠错
反馈