Deno 中如何使用 WebSocket 实现游戏房间的管理?

阅读时长 8 分钟读完

介绍

Deno 是一个新兴的 JavaScript 运行时环境,它可以直接执行 TypeScript 代码,并且自带一个用于 HTTP 路由的标准库。同时,Deno 还原生支持 JavaScript 的异步操作,因此非常适合用于实现高性能的服务器端应用程序。在本文中,我们将介绍如何使用 Deno 中的 WebSocket 模块,来实现一个简单的游戏房间管理系统。

WebSocket 简介

WebSocket 是一种特殊的网络协议,它能够在客户端和服务器之间建立一种双向的、可靠的通信机制。与 HTTP 不同,WebSocket 可以在服务器和客户端之间实现实时的数据传输,并且不需要再每次通信时建立新的网络连接。因此,WebSocket 通常被用于需要实时通信的互联网应用程序中,如游戏、聊天应用等。

在 Deno 中,我们可以通过 deno std/ws/mod.ts 模块来使用 WebSocket。该模块提供了一个轻量级的、基于事件的 WebSocket 实现,同时还提供了一些 WebSocket 相关的工具函数。

实现

在本文中,我们将实现一个简单的游戏房间管理系统,包含以下功能:

  • 客户端连接 WebSocket 服务器
  • 客户端创建游戏房间,并邀请其他玩家加入
  • 服务器将玩家加入游戏房间中,并向房间内的所有玩家广播当前游戏状态
  • 玩家在游戏中发起聊天,服务器将聊天消息广播给所在房间内的所有玩家

初始化 WebSocket 服务器

我们需要在服务器上启动一个 WebSocket 服务来处理客户端的连接请求。首先,我们需要创建一个 HTTP 服务器,并通过 WebSocket.upgrade() 方法来将该服务器升级为 WebSocket 服务器。代码如下:

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

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

这里,我们首先通过 serve() 创建了一个 HTTP 服务器,并监听在 8080 端口上。当接收到请求时,我们首先判断该请求是否为 WebSocket 连接请求,也就是请求路径是否为 /ws。如果是 WebSocket 连接请求,则需要调用 acceptable() 函数来验证该请求是否是合法的 WebSocket 请求。如果验证通过,则需要调用 acceptWebSocket() 方法来升级该请求为 WebSocket 连接,并获取到一个 WebSocket 对象,该对象可以用于向客户端发送消息。

处理 WebSocket 消息

当客户端连接成功后,在服务器端我们就可以处理客户端发送的消息。我们可以通过监听 WebSocket 对象的 socket.on("message", (event) => {}) 事件来接收客户端发送的消息,并在服务器端做出相应的处理。具体实现代码如下:

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

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

在此示例中,我们首先通过 socket.on("message", (event) => {}) 监听客户端发送的消息事件,并将接收到的消息反序列化为 JSON 格式的对象。接着,我们根据 data.type 属性的值来判断客户端发送的消息类型,并调用相应的处理函数进行处理。在处理异常情况时,我们可以使用 catch() 函数来捕获异常并输出错误信息。

创建游戏房间

当客户端需要创建游戏房间时,我们需要在服务器端保存房间信息,并向其他玩家广播新房间的信息。代码如下:

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

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

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

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

在此代码中,我们定义了一个 Room 接口用于表示游戏房间的信息。其中,id 字段为房间 ID,name 字段为房间名称,players 字段为加入该房间的所有玩家。我们还定义了一个 rooms 数组来保存所有的游戏房间信息,并将 roomId 变量作为房间号计数器。当客户端请求创建游戏房间时,我们会生成新的房间号,并保存该房间的信息到 rooms 数组中。同时,我们会广播当前的房间列表,以便其他玩家能够获取到该房间信息。

加入游戏房间

当客户端需要加入游戏房间时,我们需要将该玩家加入到房间的玩家列表中,并向该房间内的所有玩家广播该玩家加入的消息。代码如下:

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

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

在此代码中,我们首先通过 rooms.find() 函数查找到要加入的游戏房间,并将该玩家加入到 room.players 数组中。接着,我们会广播房间更新的消息,该消息包含了该玩家加入的信息。

发送聊天消息

当玩家在游戏中发送聊天消息时,我们需要将该消息广播给该房间内的所有玩家。代码如下:

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

在此代码中,我们首先通过 rooms.find() 函数查找到要发送消息的游戏房间,接着构造聊天消息,并通过 player.send() 函数将该消息发送给所有在该房间内的玩家。

结论

通过本文的介绍,我们了解了如何使用 Deno 中的 WebSocket 模块,来实现一个简单的游戏房间管理系统。在这个过程中,我们学习了如何在服务器端初始化 WebSocket 服务、处理客户端发送的消息、创建游戏房间、加入游戏房间以及发送聊天消息等操作。从本例中,我们可以看出,WebSocket 是一种非常强大的协议,它可以为服务器和客户端之间的实时通信提供高效、可靠的解决方案。如果您有需要实时通信功能的应用程序,不妨尝试使用 WebSocket 来实现。

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

纠错
反馈