如何在 Deno 应用程序中使用 WebSocket 进行实时数据传输

WebSocket 是一种在 Web 应用程序中实现实时数据传输的协议。它允许客户端和服务器之间建立一个持久的连接,以便在双方之间实时地发送数据。在前端开发中,我们通常使用 WebSocket 来实现实时聊天、实时数据更新等功能。而在 Deno 应用程序中,我们同样可以使用 WebSocket 来进行实时数据传输。

本文将详细介绍如何在 Deno 应用程序中使用 WebSocket 进行实时数据传输,包括如何创建 WebSocket 服务器和客户端,以及如何在它们之间传输数据。

创建 WebSocket 服务器

要创建一个 WebSocket 服务器,我们需要使用 Deno 自带的标准库中的 WebSocket 类。首先,我们需要创建一个 HTTP 服务器,然后将其升级为 WebSocket 服务器,如下所示:

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

const server = serve({ port: 8080 });
console.log("HTTP server listening on port 8080");

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);
  } else {
    req.respond({
      status: 200,
      body: "Hello, Deno!",
    });
  }
}

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

  for await (const event of ws) {
    if (typeof event === "string") {
      console.log("Received text message:", event);
      await ws.send(`You said: ${event}`);
    } else if (event instanceof Uint8Array) {
      console.log("Received binary message:", event);
      await ws.send(event);
    }
  }

  console.log("WebSocket closed!");
}

在上面的代码中,我们首先创建了一个 HTTP 服务器,并监听在 8080 端口。当客户端发送一个 HTTP 请求到该服务器时,如果请求的 URL 是 /ws,则将其升级为 WebSocket 连接,并将其传递给 handleWebSocket 函数进行处理。handleWebSocket 函数中,我们可以接收客户端发送的消息,并向客户端发送消息。

创建 WebSocket 客户端

要创建一个 WebSocket 客户端,我们同样需要使用 Deno 自带的标准库中的 WebSocket 类。我们可以使用该类的 connect 方法来连接到 WebSocket 服务器,如下所示:

import { connectWebSocket } from "https://deno.land/std/ws/mod.ts";

const ws = await connectWebSocket("ws://localhost:8080/ws");

console.log("WebSocket connected!");

for await (const event of ws) {
  if (typeof event === "string") {
    console.log("Received text message:", event);
  } else if (event instanceof Uint8Array) {
    console.log("Received binary message:", event);
  }
}

在上面的代码中,我们使用 connectWebSocket 方法连接到 ws://localhost:8080/ws 地址上的 WebSocket 服务器,并监听来自服务器的消息。当服务器发送一个消息时,我们可以在 for 循环中接收到该消息,并进行相应的处理。

传输数据

在 WebSocket 连接建立之后,我们可以使用 send 方法向服务器或客户端发送消息。发送消息时,我们需要将消息格式化为字符串或二进制数据。例如,要向服务器发送一条文本消息,我们可以使用以下代码:

await ws.send("Hello, server!");

而服务器收到该消息后,可以在 handleWebSocket 函数中使用以下代码进行相应的处理:

console.log("Received text message:", event);
await ws.send(`You said: ${event}`);

这样,服务器就会将该消息回传给客户端,并在客户端中打印出来。

示例代码

下面是一个完整的示例代码,它演示了如何在 Deno 应用程序中创建 WebSocket 服务器和客户端,并进行实时数据传输:

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

const server = serve({ port: 8080 });
console.log("HTTP server listening on port 8080");

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);
  } else {
    req.respond({
      status: 200,
      body: "Hello, Deno!",
    });
  }
}

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

  for await (const event of ws) {
    if (typeof event === "string") {
      console.log("Received text message:", event);
      await ws.send(`You said: ${event}`);
    } else if (event instanceof Uint8Array) {
      console.log("Received binary message:", event);
      await ws.send(event);
    }
  }

  console.log("WebSocket closed!");
}

// client.ts
import { connectWebSocket } from "https://deno.land/std/ws/mod.ts";

const ws = await connectWebSocket("ws://localhost:8080/ws");

console.log("WebSocket connected!");

for await (const event of ws) {
  if (typeof event === "string") {
    console.log("Received text message:", event);
  } else if (event instanceof Uint8Array) {
    console.log("Received binary message:", event);
  }
}

await ws.send("Hello, server!");

要启动该应用程序,我们可以在终端中分别输入以下命令:

deno run --allow-net server.ts
deno run --allow-net client.ts

在客户端中,我们可以输入一些文本消息,然后按回车键发送给服务器。服务器收到该消息后,会将其回传给客户端,并在客户端中打印出来。这样,我们就成功地在 Deno 应用程序中使用 WebSocket 进行实时数据传输了。

总结

本文详细介绍了如何在 Deno 应用程序中使用 WebSocket 进行实时数据传输。我们首先介绍了如何创建 WebSocket 服务器和客户端,然后讲解了如何在它们之间传输数据。通过本文的学习,读者可以了解如何在 Deno 应用程序中使用 WebSocket 实现实时聊天、实时数据更新等功能。

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


纠错
反馈