如何在 Deno 中使用 WebSocket 实现游戏服务器?

WebSocket 是一种基于 TCP 协议的全双工通信协议,它可以在客户端和服务器之间建立一个持久性的连接,使得双方可以实时地进行数据交互。在游戏开发中,WebSocket 可以用来实现游戏服务器,让多个玩家可以实时地进行游戏交互。本文将介绍如何在 Deno 中使用 WebSocket 实现游戏服务器。

Deno 简介

Deno 是一个安全的 JavaScript 和 TypeScript 运行时环境,它由 Node.js 的创始人 Ryan Dahl 开发。Deno 与 Node.js 不同的是,它不使用 npm 包管理器,而是直接从 URL 导入模块,同时也不需要安装任何工具链。Deno 也内置了 TypeScript 编译器,可以直接运行 TypeScript 代码。

WebSocket 简介

WebSocket 是一种基于 TCP 协议的全双工通信协议,它可以在客户端和服务器之间建立一个持久性的连接,使得双方可以实时地进行数据交互。WebSocket 采用了 HTTP 协议的握手过程,建立连接后,双方可以随时发送数据,而不用像 HTTP 协议那样每次都需要重新建立连接。WebSocket 是一种轻量级的通信协议,适合用于实时通信场景,如在线游戏、实时聊天等。

在 Deno 中使用 WebSocket

在 Deno 中使用 WebSocket 非常简单,只需要导入标准库中的 WebSocket 模块,然后创建一个 WebSocket 服务器即可。以下是一个简单的 WebSocket 服务器示例代码:

import { serve } from "https://deno.land/std/http/server.ts";
import { acceptWebSocket, isWebSocketCloseEvent } from "https://deno.land/std/ws/mod.ts";

const server = serve({ port: 8000 });
console.log("WebSocket server started on port 8000");

for await (const req of server) {
  if (req.url === "/ws") {
    const { conn, r: bufReader, w: bufWriter, headers } = req;
    acceptWebSocket({
      conn,
      bufReader,
      bufWriter,
      headers,
    })
      .then(handleWebSocket)
      .catch(async (err) => {
        console.error(`failed to accept websocket: ${err}`);
        await req.respond({ status: 400 });
      });
  } else {
    req.respond({ status: 404 });
  }
}

async function handleWebSocket(webSocket: WebSocket) {
  console.log("client connected");

  try {
    for await (const ev of webSocket) {
      if (typeof ev === "string") {
        console.log(`received: ${ev}`);
        await webSocket.send(`echo: ${ev}`);
      } else if (ev instanceof Uint8Array) {
        console.log(`received binary message with ${ev.length} bytes`);
      } else if (isWebSocketCloseEvent(ev)) {
        console.log("client disconnected");
      }
    }
  } catch (err) {
    console.error(`failed to receive frame: ${err}`);

    if (!webSocket.isClosed) {
      await webSocket.close(1000).catch(console.error);
    }
  }
}

以上代码创建了一个 WebSocket 服务器,监听 8000 端口的连接请求。当客户端连接到 /ws 路径时,会调用 acceptWebSocket 函数来接受 WebSocket 连接。接受成功后,会调用 handleWebSocket 函数来处理 WebSocket 数据交互。handleWebSocket 函数会不断地接收客户端发送的消息,并进行相应的处理。

在游戏中使用 WebSocket

在游戏中使用 WebSocket,可以实现多个玩家之间的实时交互。以下是一个简单的游戏服务器示例代码:

import { serve } from "https://deno.land/std/http/server.ts";
import { acceptWebSocket, isWebSocketCloseEvent } from "https://deno.land/std/ws/mod.ts";

const players: WebSocket[] = [];

const server = serve({ port: 8000 });
console.log("Game server started on port 8000");

for await (const req of server) {
  if (req.url === "/ws") {
    const { conn, r: bufReader, w: bufWriter, headers } = req;
    acceptWebSocket({
      conn,
      bufReader,
      bufWriter,
      headers,
    })
      .then((ws) => {
        players.push(ws);
        console.log(`player ${players.length} connected`);
        ws.send(`Welcome, you are player ${players.length}`);

        ws.addEventListener("message", (event) => {
          console.log(`player ${players.indexOf(ws) + 1} sent message: ${event.data}`);
          broadcast(`player ${players.indexOf(ws) + 1}: ${event.data}`);
        });

        ws.addEventListener("close", () => {
          const index = players.indexOf(ws);
          if (index !== -1) players.splice(index, 1);
          console.log(`player ${index + 1} disconnected`);
        });
      })
      .catch(async (err) => {
        console.error(`failed to accept websocket: ${err}`);
        await req.respond({ status: 400 });
      });
  } else {
    req.respond({ status: 404 });
  }
}

function broadcast(message: string) {
  console.log(`broadcast message: ${message}`);
  for (const player of players) {
    player.send(message);
  }
}

以上代码创建了一个游戏服务器,监听 8000 端口的连接请求。当客户端连接到 /ws 路径时,会调用 acceptWebSocket 函数来接受 WebSocket 连接。接受成功后,会将客户端加入到 players 数组中,同时发送欢迎消息。当客户端发送消息时,会调用 broadcast 函数来广播消息给所有客户端。当客户端断开连接时,会将客户端从 players 数组中删除。

总结

本文介绍了如何在 Deno 中使用 WebSocket 实现游戏服务器。WebSocket 是一种轻量级的通信协议,适合用于实时通信场景,如在线游戏、实时聊天等。在 Deno 中使用 WebSocket 非常简单,只需要导入标准库中的 WebSocket 模块,然后创建一个 WebSocket 服务器即可。通过本文的示例代码,读者可以学习到如何在游戏中使用 WebSocket 实现多个玩家之间的实时交互。

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