使用 Deno 中的 WebSocket 模块:构建游戏和多人在线应用

WebSocket 是一种在客户端和服务器之间进行双向通信的协议。使用 WebSocket,可以使客户端和服务器之间的通信更加高效和实时。在前端开发中,WebSocket 是构建游戏和多人在线应用的重要技术之一。本文将介绍如何使用 Deno 中的 WebSocket 模块来构建游戏和多人在线应用。

什么是 Deno?

Deno 是一个安全的 JavaScript 和 TypeScript 运行时环境,由 Node.js 的创始人 Ryan Dahl 开发。Deno 支持 ES6+,TypeScript 和 WebAssembly,并且内置了标准库,包括 HTTP、WebSocket、fetch 等常用模块,可以用来构建 Web 应用、命令行工具等。

使用 Deno 中的 WebSocket 模块

Deno 中的 WebSocket 模块提供了 WebSocket 的实现,可以用来在客户端和服务器之间进行双向通信。下面是一个简单的示例,演示了如何在 Deno 中使用 WebSocket 模块来创建 WebSocket 服务器:

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

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

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

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

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

在上面的示例中,我们首先使用 serve 函数创建了一个 HTTP 服务器,然后在服务器的 for await 循环中,判断请求的 URL 是否是 /ws,如果是,就调用 acceptWebSocket 函数来创建 WebSocket 连接。acceptWebSocket 函数返回一个 WebSocket 对象,我们可以通过这个对象来处理 WebSocket 事件,例如接收和发送消息。

handleWebSocket 函数中,我们打印了一条 WebSocket 连接成功的日志,并在 for await 循环中处理 WebSocket 事件。如果收到了文本消息,我们就打印一条日志,并回复一个消息,内容为 You said: ${event},其中 event 是收到的消息。如果收到了二进制消息,我们只是打印了一条日志,并没有做其他处理。

构建游戏和多人在线应用

使用 Deno 中的 WebSocket 模块,我们可以构建各种各样的游戏和多人在线应用。下面是一些示例:

1. 实时聊天室

实时聊天室是一个基于 WebSocket 的多人在线应用,用户可以在聊天室中发送文本消息,与其他用户进行实时交流。下面是一个简单的实时聊天室示例:

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

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

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

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

在上面的示例中,我们创建了一个数组 sockets,用来存储所有连接到服务器的 WebSocket 对象。在 acceptWebSocket 函数的回调函数中,我们将新连接的 WebSocket 对象添加到 sockets 数组中,并为其注册 closemessage 事件。在 close 事件中,我们从 sockets 数组中删除已关闭的 WebSocket 对象。在 message 事件中,我们将收到的消息发送给除自己以外的所有 WebSocket 对象。

2. 实时协作画板

实时协作画板是一个基于 WebSocket 的多人在线应用,用户可以在画板上绘制图形,与其他用户进行实时协作。下面是一个简单的实时协作画板示例:

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

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

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

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

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

在上面的示例中,我们创建了一个数组 points,用来存储画板上的所有点。在 acceptWebSocket 函数的回调函数中,我们将新连接的 WebSocket 对象添加到 sockets 数组中,并为其注册 closemessage 事件。在 close 事件中,我们从 sockets 数组中删除已关闭的 WebSocket 对象。在 message 事件中,我们将收到的消息解析为 Point 对象,并将其添加到 points 数组中。然后,我们将收到的消息发送给所有 WebSocket 对象,并将 points 数组序列化为 JSON 字符串,发送给新连接的 WebSocket 对象。

在客户端中,我们可以使用 Canvas API 来绘制画板上的点。下面是一个简单的客户端示例:

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

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

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

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

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

在上面的示例中,我们首先创建了一个 Canvas 元素,并在其上绘制点。然后,我们创建了一个 WebSocket 对象,连接到服务器的 /ws 路径。在 WebSocket 的 onmessage 事件中,我们解析收到的消息为 Point 对象,并将其添加到 points 数组中。然后,我们调用 draw 函数,绘制所有的点。在 Canvas 的 mousemove 事件中,我们检查鼠标左键是否按下,如果按下,就创建一个新的 Point 对象,并将其添加到 points 数组中。然后,我们将该 Point 对象序列化为 JSON 字符串,并发送给服务器。最后,我们调用 draw 函数,绘制所有的点。

总结

使用 Deno 中的 WebSocket 模块,我们可以轻松地构建游戏和多人在线应用。本文介绍了如何使用 Deno 中的 WebSocket 模块来创建 WebSocket 服务器,并提供了实时聊天室和实时协作画板的示例。通过学习本文,读者可以掌握使用 Deno 中的 WebSocket 模块来构建游戏和多人在线应用的技能。

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