WebSocket 是一种 web 通信协议,它可以使浏览器与服务器之间进行实时交互,无需通过轮询或 HTTP 长连接手段。Node.js 中有很多优秀的 WebSocket 库可供选择,其中最流行的是 ws
库。在本文中,我们将详细讨论 ws
库的用法和应用场景。
安装和基本用法
通过 npm 可以方便地安装 ws
库:
npm install ws
接下来,我们创建一个服务器并监听 WebSocket 连接:
-- -------------------- ---- ------- ----- --------- - -------------- ----- --- - --- ------------------ ----- ---- --- -------------------- ---- -- - ---------------- ------ ------------ ---------------- --------- -- - --------------------- ------- -- ------------ --- ---
在客户端使用 WebSocket
对象连接到服务器:
-- -------------------- ---- ------- ----- -- - --- --------------------------------- --------- - -- -- - ---------------------- -- --------- -------------- --------- -- ------------ - --------- -- - --------------------- ------- -- ------------------ --
运行服务器并打开客户端,你会看到如下输出:
New client connected Received message => Hello Server
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