Node.js 中的 Websocket 技术详解

阅读时长 7 分钟读完

Websocket 是一种协议,用于在浏览器和服务器之间建立双向的通信连接。在前端开发中,我们可以利用 Websocket 技术来实现实时的数据交互、通知、即时聊天等功能。

在 Node.js 中,我们可以使用 ws 模块来实现 Websocket 技术。本文将为您详细介绍 Node.js 中的 Websocket 技术,并提供示例代码以供参考。

Websocket 的优势

在传统的 HTTP 协议中,客户端和服务器之间的通信是单向的,即客户端向服务器发送请求,服务器响应请求并返回数据。但是在某些场景下,我们希望客户端和服务器之间建立实时的双向通信连接,这时候 Websocket 协议就能发挥它的优势。

Websocket 与 HTTP 协议一样基于 TCP 协议,但是 Websocket 的优势在于:

  • 实时性

Websocket 可以实现客户端和服务器之间的实时双向通信,数据传输的延迟非常小。

  • 长连接

在 Websocket 中,客户端和服务器之间建立的连接是持久化的,不需要频繁地断开和重新连接,减少了资源的占用和网络的负担。

  • 轻量级

Websocket 消息头较小(只有 2~14 字节),不会对网络带宽造成太大的压力。

  • 兼容性

Websocket 协议目前已经得到广泛的应用和支持,在各种现代浏览器和服务器都得到支持。

使用 Node.js 实现 Websocket

在 Node.js 中,我们可以使用 ws 模块来实现 Websocket 技术。下面是使用 ws 模块实现 Websocket 的示例代码:

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

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

  --------------- ---------
---
展开代码
  • 首先,我们在 Node.js 中引入 ws 模块,并创建一个 WebSocket 服务器,监听在 8080 端口。

  • 当有客户端连接到 WebSocket 服务器时,服务器会触发 connection 事件,我们可以在事件回调函数中处理客户端的连接。

  • 在客户端连接成功后,服务器会触发 message 事件,我们可以在事件回调函数中处理客户端发送的消息。

  • 在事件回调函数中,我们可以使用 ws.send() 方法向客户端发送消息。

Websocket 实现聊天室功能

下面我们来实现一个简单的聊天室功能,使用 ws 模块实现 Websocket 服务器,并使用 socket.io 实现客户端的通信。

Websocket 服务器端代码

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

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

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

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

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

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

-------- --------------- -
  ---------------------------- ------------ -
    -- ------------------ --- --------------- -
      ----------------------------------
    -
  ---
-
展开代码

在代码中,我们监听了 loginmessage 两种消息类型。当客户端发送 login 消息时,我们将客户端的用户名保存在 users Map 中,并将所有在线用户列表广播给所有连接的客户端。当客户端发送 message 消息时,我们将消息内容和发送者的用户名一起广播给所有连接的客户端。

Websocket 客户端代码

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

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

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

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

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

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

-------------------- -------- --------- -
  ----- ----------- - ----------------------------------------
  ----- -------- - -----------------------------
  ------------------ - --------------------- --------------------
  ----------------------------------
---
展开代码

在代码中,我们使用 socket.io 来连接到 Websocket 服务器,并监听了 loginmessageusers 三种消息类型。当用户登录成功后,将用户名发送给服务器;当用户发送消息后,将消息发送给服务器。当服务器广播 usersmessage 消息时,将在线用户列表和聊天消息显示在页面上。

以上就是使用 Node.js 实现 Websocket 技术的详细介绍和示例代码。Websocket 技术在前端开发中得到越来越广泛的应用,相信本文能够帮助您加深对 Websocket 的理解和运用。

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

纠错
反馈

纠错反馈