Node.js 中的 WebSocket 库详解

阅读时长 12 分钟读完

WebSocket 是一种 web 通信协议,它可以使浏览器与服务器之间进行实时交互,无需通过轮询或 HTTP 长连接手段。Node.js 中有很多优秀的 WebSocket 库可供选择,其中最流行的是 ws 库。在本文中,我们将详细讨论 ws 库的用法和应用场景。

安装和基本用法

通过 npm 可以方便地安装 ws 库:

接下来,我们创建一个服务器并监听 WebSocket 连接:

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

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

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

在客户端使用 WebSocket 对象连接到服务器:

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

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

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

运行服务器并打开客户端,你会看到如下输出:

ws 库的基本用法和其他 WebSocket 库类似,我们接下来将详细介绍其高级用法和应用场景。

WebSocket 支持的协议和扩展

WebSocket 协议定义了标准化的握手流程和数据传输格式。ws 库支持的协议和扩展如下:

  • WebSocket 协议 version 8
  • WebSocket 协议 version 13
  • Permessage Deflate 扩展

WebSocket 协议的 version 8 和 version 13 是 WebSocket 的两个主要版本,它们具有互操作性。Permessage Deflate 扩展允许在传输时进行压缩,可有效减少数据传输量。你可以使用以下代码明确启用协议和扩展:

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

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

在实际应用中,你需要根据实际需求合理配置协议和扩展。

WebSocket 连接管理

ws 库提供了完善的 WebSocket 连接管理 API,你可以通过以下方法管理 WebSocket 连接:

  • WebSocket.Server.clients:获取连接到当前服务器的所有 WebSocket 连接。
  • WebSocket#close([code[, reason]]):关闭 WebSocket 连接并发送关闭码和原因。
  • WebSocket#terminate():立即关闭 WebSocket 连接。
  • WebSocket#ping([data[, mask[, cb]]]):向另一端发送 ping 帧。
  • WebSocket#pong([data[, mask[, cb]]]):向另一端发送 pong 帧。

例如,我们可以通过以下代码实现向所有连接发送消息:

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

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

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

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

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

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

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

通过 WebSocket.Server.clients 属性获取所有连接,通过 WebSocket#send() 方法向所有连接发送消息。

应用场景

WebSocket 可以应用在很多场景中,例如实时推送、实时聊天、多人协作等。在这里,我们介绍一个基于 WebSocket 的实时协作演示代码。

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

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

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

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

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

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

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

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

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

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

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

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

服务端代码:

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

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

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

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

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

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

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

这是一个简单的实时白板示例,你可以在浏览器中打开多个窗口,在不同画板上演示绘画操作。在这个示例中,我们使用 JSON.stringify()JSON.parse() 方法将数据转换为字符串格式,以方便传输。

总结

本文介绍了 ws 库的基本用法、协议和扩展、WebSocket 连接管理以及应用场景。WebSocket 是一种基于标准化协议的 web 通信协议,它可以实现实时通信、多人协作等功能,是 Web 开发中常用的技术。通过这篇文章,读者可以学到如何在 Node.js 中使用 WebSocket,以及如何应用 WebSocket 实现实时协作功能。

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

纠错
反馈