使用 Deno 实现简单的 WebSocket 服务器

前言

WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它允许客户端和服务器之间进行实时通信,而无需使用 HTTP 的轮询技术。在前端开发中,WebSocket 已成为实现实时通信的首选方案。本文将介绍如何使用 Deno 实现简单的 WebSocket 服务器。

什么是 Deno?

Deno 是一个现代化的 JavaScript 和 TypeScript 运行时环境,它使用 V8 引擎和 Rust 语言编写。Deno 提供了一个安全的默认设置,可以帮助开发人员编写安全的 JavaScript 和 TypeScript 代码。与 Node.js 不同,Deno 不需要使用 npm 包管理器,它可以直接从 URL 导入模块。

实现 WebSocket 服务器

在本文中,我们将使用 Deno 实现简单的 WebSocket 服务器。我们将使用标准的 WebSocket API,以及 Deno 的标准库中的 WebSocket 模块。我们将创建一个简单的聊天室应用程序,允许多个客户端之间进行实时通信。

安装 Deno

首先,我们需要安装 Deno 运行时环境。您可以在 Deno 的官方网站上找到安装说明:https://deno.land/#installation

创建服务器

我们将从创建 WebSocket 服务器开始。在 Deno 中,我们可以使用 WebSocket 模块来创建 WebSocket 服务器。以下是创建 WebSocket 服务器的代码示例:

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

async function handleWebSocket(ws: WebSocket) {
  console.log("socket connected");

  try {
    for await (const ev of ws) {
      if (typeof ev === "string") {
        console.log("text message", ev);
        await ws.send(ev);
      } else if (ev instanceof Uint8Array) {
        console.log("binary message", ev);
      } else if (isWebSocketPingEvent(ev)) {
        const [, body] = ev;
        console.log("ping", body);
      } else if (isWebSocketCloseEvent(ev)) {
        const { code, reason } = ev;
        console.log("close", code, reason);
      }
    }
  } catch (err) {
    console.error(`failed to receive frame: ${err}`);

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

async function startServer() {
  const server = serve({ port: 3000 });
  console.log("websocket server started on http://localhost:3000");

  for await (const req of server) {
    const { conn, r: bufReader, w: bufWriter, headers } = req;
    try {
      const ws = await acceptWebSocket({
        conn,
        bufReader,
        bufWriter,
        headers,
      });
      await handleWebSocket(ws);
    } catch (err) {
      console.error(`failed to accept websocket: ${err}`);
      await req.respond({ status: 400 });
    }
  }
}

startServer();

在上面的代码中,我们使用 Deno 的标准库中的 serve 方法创建了一个 HTTP 服务器。然后,我们使用 acceptWebSocket 方法接受 WebSocket 连接。一旦连接建立,我们就可以使用 ws 对象与客户端进行通信。

在上面的代码中,我们使用 for await 循环来监听 WebSocket 事件。当收到文本消息时,我们向所有连接的客户端广播消息。当收到二进制消息时,我们只是简单地打印消息。当收到 ping 消息时,我们只是简单地打印 ping 消息。当收到 close 消息时,我们只是简单地打印 close 消息。

创建客户端

现在,我们已经创建了 WebSocket 服务器,我们需要创建一个客户端来连接服务器。以下是创建 WebSocket 客户端的代码示例:

<!DOCTYPE html>
<html>
  <head>
    <title>WebSocket Chat Room</title>
  </head>
  <body>
    <input type="text" id="message" />
    <button id="send">Send</button>
    <ul id="messages"></ul>

    <script>
      const socket = new WebSocket("ws://localhost:3000");

      socket.addEventListener("open", (event) => {
        console.log("socket opened");
      });

      socket.addEventListener("message", (event) => {
        console.log("received message", event.data);

        const messagesElem = document.getElementById("messages");
        const messageElem = document.createElement("li");
        messageElem.textContent = event.data;
        messagesElem.appendChild(messageElem);
      });

      const sendButton = document.getElementById("send");
      const messageInput = document.getElementById("message");

      sendButton.addEventListener("click", (event) => {
        const message = messageInput.value;
        socket.send(message);
        messageInput.value = "";
      });
    </script>
  </body>
</html>

在上面的代码中,我们使用 new WebSocket 构造函数创建了一个 WebSocket 客户端。我们将客户端连接到服务器的 URL。当 WebSocket 连接建立时,我们将在控制台中打印消息。当我们收到文本消息时,我们将在页面上显示消息。当用户单击“发送”按钮时,我们将文本框中的消息发送到服务器。

运行代码

现在,我们已经创建了 WebSocket 服务器和客户端,我们可以运行代码并测试它们。首先,我们需要在终端中运行 WebSocket 服务器:

然后,我们需要在浏览器中打开客户端文件(例如,index.html 文件)。在控制台中,我们应该看到一条消息,表示 WebSocket 连接已建立。我们可以在文本框中输入消息,并单击“发送”按钮发送消息。发送的消息将立即在所有连接的客户端之间进行广播。

总结

在本文中,我们介绍了如何使用 Deno 实现简单的 WebSocket 服务器。我们创建了一个简单的聊天室应用程序,允许多个客户端之间进行实时通信。我们还介绍了如何创建 WebSocket 客户端,并在页面上显示消息。Deno 提供了一种现代化的 JavaScript 和 TypeScript 运行时环境,可以帮助开发人员编写安全的 JavaScript 和 TypeScript 代码。

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


纠错
反馈