介绍
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