websocket是浏览器与服务器间持久化全双工通信标准,适用于实时场景;需用ws://或wss://协议创建连接,通过send()和onmessage实现双向文本/json消息收发,并需手动处理重连、心跳及close资源清理。

WebSocket 是浏览器与服务器之间建立持久化、全双工通信通道的标准方案,适合聊天、实时通知、协同编辑等场景。它比轮询或长连接更高效,能真正实现客户端和服务端随时互相发消息。
创建 WebSocket 连接
使用 new WebSocket(url) 初始化连接,URL 必须是 wss://(生产)或 ws://(开发)。注意:协议必须匹配,且服务端需支持 WebSocket(如 Node.js 的 ws 库、Nginx 需配置升级头)。
示例:
const socket = new WebSocket('ws://localhost:3000');
socket.onopen = () => {
console.log('连接已建立');
socket.send(JSON.stringify({ type: 'login', userId: 'u123' }));
};
socket.onerror = (err) => {
console.error('连接出错', err);
};
socket.onclose = () => {
console.log('连接已关闭');
};
收发消息(双向通信核心)
发送用 socket.send(),接收用 socket.onmessage。所有数据需为字符串,二进制需用 Blob 或 ArrayBuffer;JSON 最常用,记得 JSON.parse() 和 JSON.stringify() 转换。
- 发送文本:直接传字符串,如
socket.send('hello')或socket.send(JSON.stringify({ msg: 'hi' })) - 接收处理:在
onmessage回调中解析,推荐加 try-catch 防止 JSON 解析失败崩溃 - 检查就绪状态:发消息前建议判断
socket.readyState === WebSocket.OPEN,避免连接未建立就发包
处理重连与心跳保活
网络波动或服务重启会导致断连。不能依赖浏览器自动重连,需手动实现:
- 监听
onclose,延迟几秒后尝试重建连接(如指数退避:1s、2s、4s…) - 服务端定期发 ping,客户端响应 pong;或客户端定时 send 心跳包(如
{ type: 'ping' }),服务端收到即刷新连接活跃状态 - 避免无限重连:设置最大重试次数,或用户手动点击“重连”按钮触发
关闭连接与资源清理
页面卸载或用户退出时应主动关闭连接,释放服务端资源:
- 调用
socket.close(code, reason),code 常用 1000(正常关闭) - 移除事件监听器(尤其使用箭头函数定义时可不手动移除,但显式
removeEventListener更稳妥) - 在
beforeunload或visibilitychange中处理关闭逻辑,防止后台标签页持续占用连接
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











