websocket 通信
WebSocket 是基于 TCP 的全双工、长连接通信协议,允许客户端 ↔ 服务器随时主动发送数据,一次连接永久通信。
要点速览
shell
WebSocket 是双向长连接实时协议,解决服务器主动推送问题。
握手用 HTTP,连接后独立通信,轻量高效。
开发必须做:重连、心跳、wss、鉴权、消息队列。
相比轮询,延迟更低、性能更好、资源消耗更小。
高并发需分布式 + 高性能服务器 + Nginx 代理配置。生命周期(4 个事件)
js
const ws = new WebSocket('wss://xxx.com/ws')
// 1. 连接成功
ws.onopen = () => {}
// 2. 收到消息
ws.onmessage = (e) => {}
// 3. 连接关闭
ws.onclose = () => {}
// 4. 异常错误
ws.onerror = () => {}拓展
shell
# websocket 协议标准
默认端口:80(ws://)、443(wss://),wss = WebSocket + TLS,生产环境必须用 wss
# Nginx 配置要点(必配)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400; # 长连接超时开发注意事项
shell
# 连接稳定性(最关键)
必须做自动重连(网络波动、服务重启都会断连)
重连加指数退避(1s → 2s → 4s → 8s),避免爆服务器
心跳检测(ping/pong),防止假连接
# 心跳机制(必实现),目的:防止连接被防火墙 / 代理静默断开
客户端定时发 ping
服务器回复 pong
超时无响应 → 判定断开 → 重连
# 数据格式
统一用 JSON 通信
必须约定:type 消息类型、data 内容、requestId 等
# 避免内存泄漏
ws.close()
ws = null