解决 Deno 中 WebSocket 服务端和客户端版本不匹配的问题

阅读时长 5 分钟读完

背景

WebSocket 是一种实现了双向通信的协议,可以用于实时信息传输。在 Deno 中,我们可以使用 std/ws 模块来创建 WebSocket 服务端和客户端。但有时会遇到一个常见问题:服务端和客户端使用的 WebSocket 版本不匹配,导致无法建立连接。

原因

WebSocket 每个版本都有自己的协议,服务端和客户端需要使用相同的版本才能进行通信。当服务端使用较新版本的协议,而客户端使用较旧版本的协议时,就会出现版本不匹配的错误。

解决方法

有两种解决方法:

1. 使用相同版本的 WebSocket

最简单的解决方法是确保服务端和客户端使用相同版本的 WebSocket。一般情况下,服务端使用较新版本的 WebSocket 不会影响通信,因为较新版本的 WebSocket 相对于旧版更加完善和安全。可以通过在服务端和客户端中都使用同一版本的方式来解决版本不匹配的问题。

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

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

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

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

2. 使用版本适配器

如果服务端和客户端必须使用不同版本的 WebSocket,我们可以使用版本适配器来解决版本不匹配的问题。版本适配器是一个中间件,可以将服务端和客户端的 WebSocket 版本进行转换。

我们可以使用 std/ws/compat 模块中提供的 compatibilityShim 函数来创建一个版本适配器。这个函数接受两个参数:接收 WebSocket 连接的回调函数和期望的 WebSocket 版本号。

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

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

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

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

总结

WebSocket 服务端和客户端的版本不匹配是一个常见的问题,通过使用相同版本的 WebSocket 或使用版本适配器可以解决这个问题。版本适配器允许服务端和客户端使用不同版本的 WebSocket,并将版本进行转换。使用版本适配器需要注意请求头和子协议的设置。

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

纠错
反馈