Deno 中如何使用 WebSocket 实现即时通信?

阅读时长 6 分钟读完

WebSocket 是一种在单个 TCP 连接上进行双向通信的协议。它可以实现即时通信,包括聊天室、实时游戏、协作等场景。在 Deno 中,我们可以使用标准库中的 WebSocket 模块来实现 WebSocket 通信。本文将介绍如何在 Deno 中使用 WebSocket 实现即时通信。

WebSocket 基础知识

WebSocket 是一种基于 HTTP 协议的协议,它使用 HTTP 协议的 80 和 443 端口。在客户端和服务器建立连接后,双方都可以发送消息给对方。WebSocket 有以下几个特点:

  • 建立连接需要经过 HTTP 握手,但是之后的通信数据都是二进制数据而不是文本数据。
  • 可以在客户端和服务器之间双向传输数据。
  • WebSocket 连接是持久化的,一旦建立连接,客户端和服务器之间可以长时间保持连接。
  • 可以通过心跳机制保持连接不断开。

在 Deno 中,使用 WebSocket 的基本流程如下:

-- -------------------- ---- -------
------ -
  ------
  -------
  ----------
- ---- ----------------------------------

----- ------- ------ - ------- ----- ---- ---

---------------------- ------ ------- -- ---- -------

--- ----- ------ --- -- ------- -
  ----- - ----- -- ---------- -- ---------- ------- - - ----
  ----- ----- --------- - ----- -----------------
    -----
    ----------
    ----------
    --------
  ---
  ------------------- ------------
-

通过 serve 函数创建一个服务器,并监听端口 8080。当客户端连接到服务器时,会触发 for await (const req of server),然后通过 acceptWebSocket 函数建立一个 WebSocket 连接。在 acceptWebSocket 函数中,我们需要传入 connbufReaderbufWriterheaders 这几个参数。其中,conn 是一个 Deno.Conn 类型的对象,表示当前连接,bufReaderbufWriter 分别是读写缓冲区,headers 是 HTTP 请求头。通过 await acceptWebSocket 函数,我们可以获得一个 WebSocket 类型的对象 sock,通过这个对象就可以进行 WebSocket 通信了。

Deno 中的 WebSocket 通信

在 Deno 中使用 WebSocket 通信,我们需要分别编写客户端和服务器端的代码。

客户端

首先,让我们来编写一个简单的 WebSocket 客户端代码。客户端代码如下:

-- -------------------- ---- -------
----- ----- --------- - --- ----------------------------------

----------- - -- -- -
  ------------------- ------------
  ----------------- ---- ------------
--

-------------- - ------- ------------- -- -
  ---------------------- -- ------------
--

------------ - ------- ------ -- -
  ---------------------- ------ -- -------
--

------------ - ------- ----------- -- -
  ---------------------- ------- -- ----------- --------------
--

在客户端中,我们通过 new WebSocket 函数创建一个 WebSocket 对象,指定服务器的地址和端口号。通过对象的 onopenonmessageonerroronclose 四个事件监听函数,分别处理连接建立后的操作、收到消息后的处理、连接异常的处理和连接关闭的处理。在示例代码中,连接建立后,我们向服务器发送了一条消息,然后等待服务器发回响应,最后关闭连接。

服务器端

接下来,我们来编写 WebSocket 服务器端的代码。服务器端代码如下:

-- -------------------- ---- -------
------ -
  ------
  -------
  ----------
  ----------------------
  ---------------------
- ---- ----------------------------------

----- ------- ------ - ------- ----- ---- ---

---------------------- ------ ------- -- ---- -------

--- ----- ------ --- -- ------- -
  ----- - ----- -- ---------- -- ---------- ------- - - ----
  --- -
    ----- ----- --------- - ----- -----------------
      -----
      ----------
      ----------
      --------
    ---
    ------------------- ------------

    --- ----- ------ -- -- ----- -
      -- ------- -- --- --------- -
        ---------------------- -- ----
        --------------
      - ---- -- -------------------------- -
        --------------------- -------
      - ---- -- --------------------------- -
        ------------------- --------- -------- -----------
      -
    -
  - ----- ----- -
    --------------------- -- ------ ---------- ---------
    ----- ------------- ------- --- ---
  -
-

在服务器端的代码中,我们首先通过 serve 函数创建一个服务器,并监听端口 8080。当客户端连接到服务器时,会触发 for await (const req of server),然后通过 acceptWebSocket 函数建立一个 WebSocket 连接。

在建立连接后,我们通过 for await (const ev of sock) 循环来监听消息。当客户端发送消息时,我们通过 typeof ev === "string" 来判断消息类型是否为字符串,如果是字符串,说明客户端发送了一个文本消息,我们就将消息发回客户端。如果收到的是 ping 消息,我们只需要忽略即可。最后,如果客户端关闭了连接,我们会通过 isWebSocketCloseEvent(ev) 来判断,并输出关闭原因。

总结

WebSocket 是一种非常实用的协议,可以实现即时通信。在 Deno 中,我们可以使用标准库中的 WebSocket 模块来实现 WebSocket 通信。在本文中,我们介绍了 Deno 中使用 WebSocket 实现即时通信的基本流程,并提供了客户端和服务器端的示例代码。如果你打算使用 Deno 开发即时通信应用程序,希望本文对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66553e75d3423812e49c0d6e

纠错
反馈