new WebSocket() 仅初始化实例并异步发起连接,不立即建立双向通道;需监听 onopen 确认连通,onmessage 接收数据,send() 发送数据,onclose 处理断开,并手动实现重连与心跳保活。

WebSocket 不能用 new WebSocket() 直接“创建连接并建立持久双向通道”——它确实用 new 实例化,但连接是异步发起的,需要监听事件才能确认是否真正连通、是否保持活跃。
用 new WebSocket() 初始化连接对象
构造函数接收一个 WebSocket 服务器 URL(必须是 ws:// 或 wss://),返回一个 WebSocket 实例。此时连接尚未建立,只是准备发起握手:
-
const ws = new WebSocket('wss://echo.websocket.org');—— 这行代码不阻塞,也不保证已连上 - URL 必须与当前页面协议匹配:
https://页面只能用wss://,http://页面可用ws:// - 可选传入子协议数组,如
new WebSocket(url, ['json', 'xml']),服务端需支持才生效
靠事件监听判断连接状态和收发数据
WebSocket 是事件驱动的,关键靠四个事件实现双向通信:
-
ws.onopen = () => { console.log('已连上'); }—— 握手成功后触发,此时才真正建立了双向通道 -
ws.onmessage = (event) => { console.log('收到:', event.data); }—— 接收服务端消息(text 或 ArrayBuffer) -
ws.send('hello')—— 主动发送字符串或二进制数据(仅在OPEN状态下有效) -
ws.onclose = (event) => { console.log('断开,code:', event.code, 'reason:', event.reason); }—— 连接关闭时触发,可能是服务端关闭、网络中断或主动调用ws.close()
手动处理重连和心跳保活
WebSocket 默认不自动重连,也无内置心跳机制。要维持“持久”通道,需自行补充逻辑:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 连接失败或关闭后,延迟几秒再
new WebSocket(...)尝试重建(避免密集重连) - 定时用
ws.send()发送简单 ping 消息,服务端响应 pong;若超时未收响应,视为掉线并触发重连 - 检查
ws.readyState:0=CONNECTING,1=OPEN,2=CLOSING,3=CLOSED;只在值为1时调用send()
关闭连接要显式调用 close()
不要依赖页面卸载自动清理。用户离开前应主动关闭,释放资源:
-
ws.close(1000, 'normal closure');—— 可传入状态码和原因(RFC 6455 定义了标准码) - 监听
onclose后清除定时器、取消 pending 请求,避免内存泄漏 - 若页面刷新或关闭,可在
beforeunload中尝试优雅关闭(注意部分浏览器限制)
本质上,new WebSocket() 只是起点,真正的双向通信始于 onopen,维系于事件监听与主动管理。不复杂但容易忽略细节。

















