Deno 中的 WebSocket 断开连接处理

如果你正在开发一个实时应用程序,比如一个聊天室或在线游戏,那么 WebSockets 可能是你不能缺少的东西。使用 WebSockets,可以快速地在客户端和服务器之间建立实时双向连接。然而,在使用 WebSockets 过程中,我们必须要解决的一个严重问题就是当连接断开时该如何处理,在 Deno 中同样如此。

在本文中,我们将学习如何在 Deno 中处理 WebSocket 断开连接并提供一些指导意义和示例代码。

WebSocket 断开连接

WebSocket 断开连接意味着客户端和服务器之间的连接丢失了,通常是由于网络故障或客户端关闭浏览器造成的。一旦连接中断,就需要立即关闭该连接并释放所有相关资源。

在 Deno 中,可以使用 Deno.serveHttp()websocket.accept() 方法创建一个 WebSocket 服务器。以下是一个简单的 WebSocket 示例代码:

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

const server = serve({ port: 8080 });
console.log("WebSocket server is running on port 8080.");

for await (const req of server) {
  if (acceptable(req)) {
    const { conn, r: bufReader, w: bufWriter, headers } = req;
    acceptWebSocket({
      conn,
      bufReader,
      bufWriter,
      headers,
    })
      .then(async (ws) => {
        await ws.send("Hello, world!");

        for await (const msg of ws) {
          console.log("Received message:", msg);
          await ws.send(msg);
        }
      })
      .catch((err) => {
        console.error(`Failed to accept websocket: ${err}`);
        Deno.exit(1);
      });
  } else {
    req.respond({ status: 404, body: "Not found." });
  }
}

当 WebSocket 连接断开时,for await (const msg of ws) 将抛出一个错误并终止循环,这个错误也就是我们要处理的断开连接错误。

断开连接处理

当断开连接错误发生时,我们需要在服务器端运行一些代码来处理该错误并释放所有相关资源。在 Deno 中,我们可以使用 TypeScript 的 try-catch 语句来捕获异常。以下是一个捕获 WebSocket 断开连接异常的示例代码:

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

const server = serve({ port: 8080 });
console.log("WebSocket server is running on port 8080.");

for await (const req of server) {
  if (acceptable(req)) {
    const { conn, r: bufReader, w: bufWriter, headers } = req;
    acceptWebSocket({
      conn,
      bufReader,
      bufWriter,
      headers,
    })
      .then(async (ws) => {
        await ws.send("Hello, world!");

        try {
          for await (const msg of ws) {
            console.log("Received message:", msg);
            await ws.send(msg);
          }
        } catch (err) {
          console.error(`WebSocket closed: ${err}`);
        } finally {
          ws.close();
        }
      })
      .catch((err) => {
        console.error(`Failed to accept websocket: ${err}`);
        Deno.exit(1);
      });
  } else {
    req.respond({ status: 404, body: "Not found." });
  }
}

在这个示例代码中,我们在 try 块中执行了接收 WebSocket 消息的循环代码。当循环发生错误时,将触发 catch 块中的代码。在这里,我们使用 console.error() 打印了错误原因,并使用 finally 块关闭了 WebSocket 连接。

指导意义

WebSocket 能够大大简化实时应用程序的开发,但是对于一个优秀的实时应用程序,对 WebSocket 的错误处理是至关重要的。上述示例中,我们详细介绍了如何在 WebSocket 断开连接时捕获异常并执行清理代码的方法。这些示例代码可以帮助你更好地理解 WebSocket 断开连接问题,并提供了良好的参考。

在使用实时应用程序时,请始终跟踪客户端和服务器之间的网络连接状态,并编写适当的错误处理代码,以确保应用程序的稳定性和可靠性。

总结

在本文中,我们向您介绍了 WebSocket 断开连接的问题,并提供了一个示例代码,展示了如何在 Deno 中处理 WebSocket 断开连接。通过本文,您将学习到处理 WebSocket 断开连接的重要性以及如何在 Deno 中实现代码清理。

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