Deno 中使用 WebSocket 实现多人在线游戏的完整教程

阅读时长 8 分钟读完

前言

WebSocket 是一个基于 TCP 协议的 Web 通信协议,它的优点在于能在客户端和服务器之间建立一个双向通信的通道,以便实时的数据传输。

Deno 是一个新一代的 JavaScript 和 TypeScript 运行时,它提供了一个安全的沙箱环境,并且没有繁琐的构建步骤,也不需要长时间等待编译过程,让我们无需担心文件在不同的计算机上的不兼容问题。

在本篇文章中,我们将介绍在 Deno 环境下如何使用 WebSocket 实现多人在线游戏,让你深入了解 WebSocket 的原理和应用。

准备工作

在开始使用 WebSocket 进行开发之前,我们需要先安装 Deno。你可以在官方网站 https://deno.land/ 下载并安装 Deno。

WebSocket 介绍

WebSocket 是一种在单个 TCP 连接上进行双向通信的协议。它使得客户端和服务器之间的数据传输可以更加实时。传统的 HTTP 协议是单向请求-响应的,每当客户端需要从服务器获取新的数据时,就需要发送一个新的请求,这样实时性十分有限。

WebSocket 的优点是可以在客户端和服务器之间建立一个双向通信的通道,以便实时的数据传输,也没有请求的负担。它基于 HTTP/1.1 协议,与 HTTP 协议不同的是,在握手成功后,客户端和服务器之间就可以直接传输数据,它不需要每次请求都重新建立连接,因此具有很好的实时性。

下面我们来看看如何使用 WebSocket 在 Deno 环境下实现多人在线游戏。

WebSocket 实现多人在线游戏

创建 WebSocket 服务器

首先,我们需要创建一个 WebSocket 服务器,让客户端可以连接。我们可以创建一个 server.ts 文件,并编写以下代码:

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

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

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

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

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

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

在这个文件中,我们首先使用 serve 函数创建一个 HTTP 服务器,并监听 8080 端口。接着,我们通过 for await 循环等待客户端的请求,如果请求的 URL 是 '/ws' 并且请求是可接受的,则调用 acceptWebSocket 函数接受客户端连接。在 acceptWebSocket 函数中,我们调用 handleWebSocket 函数来处理 WebSocket 连接。

handleWebSocket 函数中,我们通过 for await 循环来接收客户端发送的消息,并在控制台中打印收到的消息,并通过 socket.send 函数将消息回传给客户端。

创建客户端

接下来,我们需要创建一个客户端,连接到我们的 WebSocket 服务器。我们可以创建一个 client.ts 文件,并编写以下代码:

在这个文件中,我们首先创建一个 WebSocket 对象,并指定连接的 URL。在 ws.onopen 回调函数中,我们打印连接成功的信息,并通过 ws.send 方法向服务器发送一条消息。

ws.onmessage 回调函数中,我们接收服务器返回的消息,并在控制台中打印出来。

启动 WebSocket 服务器和客户端之后,你会看到在服务端控制台输出:

在客户端控制台输出:

实现多人在线游戏

我们已经成功的连接了 WebSocket 服务器和客户端,下面我们演示如何在 Deno 中使用 Websocket 实现多人在线游戏。

我们可以创建一个 game.ts 文件,并编写以下代码:

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

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

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

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

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

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

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

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

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

在这个文件中,我们增加了一个名为 clients 的数组来保存所有客户端的连接。在客户端成功连接到服务器时,我们将客户端的 WebSocket 对象添加到 clients 中并调用 handleWebSocket 函数来处理该连接。

handleWebSocket 函数中,我们使用 clients 数组来广播接收到的消息,以方便其他连接的客户端收到消息。

启动 WebSocket 服务器之后,我们可以创建多个 client.ts 文件来连接到该服务器,以测试多人在线游戏的效果。

总结

在本文中,我们介绍了如何使用 Deno 和 WebSocket 来实现多人在线游戏,并演示了如何创建 WebSocket 服务器和客户端,在客户端和服务器之间进行双向通信,以方便实现多人同时在线的游戏效果。

WebSocket 在实时性强、效率高的需求场景下具有很好的应用前景,我们可以将其应用于在线游戏、实时聊天等场景中。借助 Deno 提供的便利,我们可以更加方便地开发和部署 WebSocket 应用程序,并大大简化我们的开发效率。

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

纠错
反馈