WebSocket 是前端进行实时通讯的常用技术之一,而 Deno 是近年来兴起的基于 TypeScript 的运行时环境。本文将介绍在 Deno 中如何使用 WebSocket 进行实时通讯,并讨论如何处理相关的异常。
WebSocket 简介
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以在客户端和服务器之间建立一条实时的双向通道。而 HTTP 协议是一种无状态的协议,每次请求和响应都是一个独立的 HTTP 报文,因此无法实现实时通讯。
WebSocket 的通讯过程如下所示:
- 客户端向服务器发出 WebSocket 握手请求。
- 服务器返回 WebSocket 握手响应,建立 WebSocket 连接。
- 客户端和服务器可以通过 WebSocket 连接进行实时通讯。
在 Deno 中使用 WebSocket
Deno 内置了 WebSocket 模块,可以方便地使用 WebSocket 进行实时通讯。以下是一个简单的 WebSocket 服务器示例代码:
-- -------------------- ---- ------- ------ - ----- - ---- --------------------------------------- ------ - ---------------- ---------------------- --------- - ---- ---------------------------------- ----- -------- -------------------------- ---------- - ---------------------- ------------ --- - --- ----- ------ ------- -- ---------- - ---------------------- ------- ----------- --------- ----- ------------------------ - - ----- ------- - ---------------------- -------- ------- -- ------------------------------- - ----- ------------------------------------------- - - ---------------------- --------- - ----- -------- ---------------------- - ----- ------ - ------- ----- ---- --- ---------------------- ------ ------- -- ---- ------- --- ----- ------ ------- -- ------- - ----- - ----- -- ---------- -- ---------- ------- - - -------- --- - ----- --------- - ----- ----------------- ----- ---------- ---------- ------- --- ----- --------------------------- - ----- ------- - ---------------------- ---------- -------- ------- - - - --------------------------------------------
在上述示例代码中,handleWebSocket
函数用于处理 WebSocket 连接的消息,如果接收到消息就打印日志并将消息发回客户端。在消息处理过程中如果发生错误,会先判断错误是否为 WebSocket 关闭事件,如果是则直接关闭 WebSocket,否则会关闭 WebSocket 并发送关闭码为 1000。
startWebSocketServer
函数用于启动 WebSocket 服务器,通过 acceptWebSocket
函数接受客户端的 WebSocket 连接请求,并调用 handleWebSocket
函数处理 WebSocket 连接的消息。
WebSocket 异常处理
在实际应用中,WebSocket 可能会遇到多种异常情况,如连接错误、连接关闭、消息发送失败等。针对这些异常情况,我们可以采取一些措施进行处理,以确保 WebSocket 的正常运行。
连接错误
连接错误可能由于多种原因引起,如 DNS 解析失败、TCP 连接错误、SSL 握手失败等。在 Deno 中,当发生 WebSocket 连接错误时,acceptWebSocket
函数会抛出一个错误对象,我们可以在 startWebSocketServer
函数中进行捕获和处理。
try { const webSocket = await acceptWebSocket({ conn, bufReader, bufWriter, headers }); await handleWebSocket(webSocket); } catch (error) { console.log("WebSocket connection error:", error); }
连接关闭
客户端或服务器可以随时关闭 WebSocket 连接,当连接关闭时,客户端和服务器都会收到一个关闭事件。在 Deno 中,当 WebSocket 连接关闭时,for await...of
循环会退出并抛出一个错误对象,我们可以在 handleWebSocket
函数中进行捕获和处理。
-- -------------------- ---- ------- --- - --- ----- ------ ------- -- ---------- - ---------------------- ------- ----------- --------- ----- ------------------------ - - ----- ------- - ---------------------- -------- ------- -- ------------------------------- - ----- ------------------------------------------- - -
消息发送失败
当发送消息时,可能出现发送失败的情况,如消息超过了最大传输单元或者连接已经关闭。在 Deno 中,当消息发送失败时,webSocket.send
函数会抛出一个错误对象,我们可以在 handleWebSocket
函数中进行捕获和处理。
-- -------------------- ---- ------- --- - --- ----- ------ ------- -- ---------- - ---------------------- ------- ----------- --------- ----- ------------------------ - - ----- ------- - ---------------------- -------- ------- -- ------------------------------- - ----- ------------------------------------------- - -
总结
本文介绍了在 Deno 中使用 WebSocket 进行实时通讯,并讨论了如何处理相关的异常。通过理解 WebSocket 的实现原理和异常情况,我们可以编写出更加健壮的 WebSocket 服务器代码,确保 WebSocket 的正常运行。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6499f58848841e98946dce67