Files
quick-share/docs/03-WebSocket连接管理(连接-订阅-心跳-重连).md

50 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 03 - WebSocket连接管理连接 / 订阅 / 心跳 / 重连)
## 功能目标
- 建立浏览器到服务端的 WebSocket 连接SockJS + STOMP
- 订阅房间广播通道,实时接收消息。
- 具备心跳保活与自动重连UI 显示连接状态。
## 前端Vue
- **封装层**`src/api/websocket.js`
- `connect(url, onConnect, onError)`:创建 STOMP Client启用 `reconnectDelay` 与心跳参数。
- `subscribe(destination, callback)`:按 destination 保存订阅,便于统一退订。
- `send(destination, body)`publish JSON 消息。
- `disconnect()`:取消订阅并关闭连接。
- **连接时序(建议)**
1. connect 成功
2. subscribe `/topic/room/{roomCode}`
3. send `/app/room/{roomCode}/join`
4. 开始收发消息
- **连接状态 UI**
- 显示:连接中 / 已连接 / 断开 / 重连中
- 重连成功后:自动重新 subscribe + 重新 join
## 后端Spring Boot
- **WebSocket 配置**
- 端点:`/ws/data-transfer`
- broker`/topic`
- 应用前缀:`/app`
- SockJS`.withSockJS()`
- **跨域与握手**
- `setAllowedOriginPatterns("*")`(开发期)
- 生产期建议:限制 Origin + 启用 WSS
- **心跳**
- 与前端 STOMP 心跳保持一致(如需更严格,改用外部 broker 或自定义心跳策略)
## 协议与通道
- 订阅(接收)
- `/topic/room/{roomCode}`:房间内通用消息广播
- `/topic/room/{roomCode}/file/{fileId}`:某文件分片通道(可选设计)
- 发送(服务端处理)
- `/app/room/{roomCode}/join`
- `/app/room/{roomCode}/leave`
- `/app/room/{roomCode}/message`
- `/app/room/{roomCode}/file/chunk`
## 边界与注意点
- **重连后的状态恢复**:需要重新 join 才能恢复在线用户列表与系统消息一致性。
- **订阅泄漏**:房间切换、页面卸载必须 disconnect/退订,避免重复订阅造成重复消息。
- **代理/反代**:生产 Nginx 需支持 Upgrade`/ws` 走 ws 反代。