websocket连接需用ws/wss协议,避免syntaxerror;event.data类型需判断处理;连接关闭后须手动重连并加退避策略;send前须确保readystate为1;事件应立即绑定防丢消息。

直接用 WebSocket 构造函数就能连上,但连得稳、收得全、断了能恢复——这些才是实际项目里真正卡住人的地方。
WebSocket 连接必须用 ws:// 或 wss:// 协议
浏览器不允许用 http:// 或 https:// 地址初始化 WebSocket 实例,否则会立刻抛出 SyntaxError: The URL's scheme must be either 'ws' or 'wss'。常见错误包括:
- 本地开发时写成
new WebSocket('http://localhost:8080')—— 必须改成ws://localhost:8080 - 部署到 HTTPS 站点后仍用
ws://—— 浏览器会拦截,必须升级为wss://,且服务端要配好 TLS 证书 - 代理转发时没透传 WebSocket 升级头(
Connection: Upgrade、Upgrade: websocket)—— Nginx 需显式配置proxy_set_header Upgrade $http_upgrade;等三行
onmessage 收到的 event.data 类型不固定
event.data 可能是 string、Blob 或 ArrayBuffer,取决于服务端发来的内容类型和浏览器实现。不能默认当字符串处理:
- 服务端用
ws.send(JSON.stringify(obj))发送,客户端可直接JSON.parse(event.data) - 若服务端发送的是二进制(如图片流、protobuf),
event.data是Blob,需调用event.data.text()或event.data.arrayBuffer()转换 - 未做类型判断就直接
.split()或.length,遇到Blob会报TypeError: event.data.split is not a function
连接关闭后无法自动重连,必须手动实现
WebSocket 对象一旦进入 CLOSED 状态(socket.readyState === 0),就不可复用。浏览器不会帮你重连,也无内置重试机制:
-
onclose触发时,仅表示连接已断,不代表服务端下线;多数情况应立即尝试重建连接 - 简单轮询重连(如 1s 后
new WebSocket(...))容易打爆服务端,建议加退避策略:第 1 次 1s,第 2 次 2s,第 3 次 4s,上限设为 30s - 重连前检查
navigator.onLine,避免离线时疯狂新建失败实例 - 重复绑定
onopen等事件会导致多次触发,每次新建实例前应先清空旧引用
send() 调用前必须确保 readyState === 1
刚执行 new WebSocket(url) 时,readyState 是 0(CONNECTING),此时调用 send() 会静默失败,不报错也不触发 onerror:
- 所有发送逻辑必须包裹在
onopen回调内,或自行轮询readyState - 若需在连接建立前缓存消息,应维护一个待发队列,在
onopen中逐条send() - 服务端主动推送消息时,客户端可能尚未完成初始化,
onmessage绑定晚于首条消息到达,就会丢消息——务必在new WebSocket()后立即绑定事件,不要等onopen再绑
真正难的不是“连上”,而是连上之后怎么扛住网络抖动、怎么识别假在线、怎么让消息不重复不丢失——这些都得自己补,浏览器只提供裸通道。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











