WebSocket通过持久化全双工连接实现服务端主动推送与客户端实时交互,需借助ws等第三方库搭建服务端,约定消息类型结构以解耦业务逻辑,并注重连接管理、心跳、鉴权与并发控制。

WebSocket 实现服务端双向通信,核心在于建立一个持久化的全双工连接,让客户端和服务端能随时主动发送和接收消息,而不是依赖 HTTP 的请求-响应模式。
服务端需使用 WebSocket 服务器库(如 ws 或 Socket.IO)
原生 Node.js 不内置 WebSocket 服务支持,必须借助第三方库。以轻量级 ws 库为例:
- 创建 WebSocket 服务器实例,监听 HTTP 服务器升级请求(upgrade 事件)
- 每个连接被接受后,会生成一个 WebSocket 对象(即 socket),代表与该客户端的独立通道
- 通过
socket.send()向特定客户端发消息;用socket.on('message', ...)接收其发送的数据
客户端发起连接并监听事件
浏览器中用 new WebSocket(url) 建立连接:
- 连接成功触发
open事件,此时可调用socket.send()发送首条消息 - 收到服务端消息时触发
message事件,event.data即为内容(可能是字符串或 ArrayBuffer) - 断开时触发
close,异常时触发error,应做重连或提示处理
服务端可主动推送,无需客户端轮询
这是 WebSocket 区别于传统 AJAX 的关键:
立即学习“Java免费学习笔记(深入)”;
- 服务端可在任意时刻调用某个 socket 的
send()方法,比如广播通知、实时数据更新、指令下发 - 若需向所有客户端广播,可遍历服务端维护的 socket 集合(如
wss.clients.forEach(client => client.send(...))) - 注意:发送前需检查
client.readyState === WebSocket.OPEN,避免向已断开连接写入数据报错
消息格式与业务逻辑解耦建议
实际项目中,原始字符串或 JSON 不足以支撑复杂交互:
- 约定统一消息结构,例如
{ type: 'chat', data: { from: 'user1', text: 'hi' } } - 服务端根据
type字段分发到不同处理器(如 chatHandler、authHandler) - 客户端也按 type 做差异化渲染或状态更新,避免 if-else 泛滥
不复杂但容易忽略:连接生命周期管理、错误重试、心跳保活、鉴权(如在 upgrade 阶段校验 token)、以及并发连接下的内存控制。这些决定了 WebSocket 能否稳定支撑真实业务场景。










