在 Deno 中使用 WebSocket

随着 Web 应用程序变得越来越复杂和互动,WebSockets 已成为一种极具价值的通信协议。在 Deno 中使用 WebSocket,可以让我们在 Web 应用程序开发中更加灵活和方便。

WebSocket 是什么?

WebSocket 是一种双向通信协议,它可以在单个 TCP 连接上提供长期和实时通信。使用 WebSocket 可以在客户端和服务器之间建立持久连接,从而实现数据的实时传输和共享。它不仅可以用于 Web 应用程序,还可以用于移动应用程序和 IoT 设备等各种场景。

Deno 是一个基于 V8 引擎的高性能运行时环境,它支持 JavaScript 和 TypeScript。在 Deno 中使用 WebSocket,需要安装官方提供的 WebSocket 包。

import { serve } from "http/server.ts";
import { acceptWebSocket, WebSocket } from "ws/mod.ts";

const server = serve({ port: 8080 });

console.log("WebSocket server started on port 8080.");

for await (const req of server) {
  const { conn, r: bufReader, w: bufWriter, headers } = req;
  const socket = await acceptWebSocket({
    conn,
    bufReader,
    bufWriter,
    headers,
  });

  console.log("client connected");

  // 处理 WebSocket 消息
  for await (const data of socket) {
    const textData = new TextDecoder().decode(data);
    console.log(`Received message: ${textData}`);

    // 发送 WebSocket 消息
    await socket.send(`Hello, world!`);
  }

  console.log("client disconnected");
}

上述示例代码通过 import 引入了 Deno 官方提供的 WebSocket 包,并启动了一个 WebSocket 服务器。当有客户端连接时,它会打印“client connected”的消息。当客户端发送消息时,它会打印接收到的消息并回复“Hello, world!”。当客户端断开连接时,它会打印“client disconnected”的消息。

WebSocket 示例应用

为了更好的说明 WebSocket 在 Deno 中的使用,这里我们简单实现一个聊天室的例子。

服务端实现

import { serve } from "http/server.ts";
import { acceptWebSocket, WebSocket } from "ws/mod.ts";

const server = serve({ port: 8080 });

console.log("WebSocket server started on port 8080.");

let sockets: WebSocket[] = [];

for await (const req of server) {
  const { conn, r: bufReader, w: bufWriter, headers } = req;
  const socket = await acceptWebSocket({
    conn,
    bufReader,
    bufWriter,
    headers,
  });
  
  sockets.push(socket);

  // 处理 WebSocket 消息
  for await (const data of socket) {
    const textData = new TextDecoder().decode(data);
    console.log(`Received message: ${textData}`);
    
    // 广播 WebSocket 消息
    sockets.forEach((s: WebSocket) => s.send(textData));
  }
}

上述示例代码是一个简单的 WebSocket 服务器,它监听端口 8080,并且在每个 WebSocket 连接成功后,将连接的客户端添加到 sockets 数组中。每次收到消息后,它会广播这个消息给所有客户端。

客户端实现

const socket = new WebSocket("ws://localhost:8080");

// 连接成功后回调
socket.addEventListener("open", (event) => {
  console.log("WebSocket connected");
});

// 收到消息后回调
socket.addEventListener("message", (event) => {
  const message = event.data;
  console.log(`Received message: ${message}`);
});

// 发送消息
function sendMessage() {
  const message = document.getElementById("message").value;
  socket.send(message);
}

上述示例代码是一个简单的 WebSocket 客户端,它连接到指定的 WebSocket 服务器,并在连接成功后打印一条欢迎消息。当收到服务器发送的消息时,它会打印这个消息。另外,它还有一个发送消息的函数,可以将用户的输入发送到服务器。

总结

WebSocket 是一种非常有用的通信协议,它可以使我们实现实时的双向通信。在 Deno 中使用 WebSocket,可以通过官方提供的 WebSocket 包轻松完成。本文提供了一个简单的聊天室示例,读者可以尝试在实战中使用 WebSocket 实现更多有趣的功能。

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