365 lines
8.5 KiB
Markdown
365 lines
8.5 KiB
Markdown
|
|
# WebSocket 增强功能实现完成 ✅
|
|||
|
|
|
|||
|
|
## 🎉 完成概述
|
|||
|
|
|
|||
|
|
已成功为直播IM系统实现了三个核心增强功能:
|
|||
|
|
1. ✅ **心跳检测机制**
|
|||
|
|
2. ✅ **在线状态管理**
|
|||
|
|
3. ✅ **离线消息处理**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📁 新增文件清单
|
|||
|
|
|
|||
|
|
### 核心服务类(6个文件)
|
|||
|
|
|
|||
|
|
1. **在线状态管理**
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/service/OnlineStatusService.java`
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/service/impl/OnlineStatusServiceImpl.java`
|
|||
|
|
|
|||
|
|
2. **离线消息管理**
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/service/OfflineMessageService.java`
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/service/impl/OfflineMessageServiceImpl.java`
|
|||
|
|
|
|||
|
|
3. **心跳检测**
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/websocket/HeartbeatScheduler.java`
|
|||
|
|
|
|||
|
|
4. **REST API控制器**
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/controller/OnlineStatusController.java`
|
|||
|
|
|
|||
|
|
### 更新的文件(2个)
|
|||
|
|
|
|||
|
|
5. **WebSocket处理器**
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/websocket/LiveChatHandler.java` ✏️
|
|||
|
|
- `crmeb-front/src/main/java/com/zbkj/front/websocket/PrivateChatHandler.java` ✏️
|
|||
|
|
|
|||
|
|
### 文档和测试(3个)
|
|||
|
|
|
|||
|
|
6. **文档**
|
|||
|
|
- `WebSocket增强功能实现说明.md` - 详细的功能说明文档
|
|||
|
|
- `WebSocket增强功能-README.md` - 本文件
|
|||
|
|
- `测试WebSocket增强功能.html` - 可视化测试工具
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 快速开始
|
|||
|
|
|
|||
|
|
### 1. 确保Redis运行
|
|||
|
|
```bash
|
|||
|
|
# 检查Redis是否运行
|
|||
|
|
redis-cli ping
|
|||
|
|
# 应该返回: PONG
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 启动后端服务
|
|||
|
|
```bash
|
|||
|
|
cd Zhibo/zhibo-h/crmeb-front
|
|||
|
|
mvn spring-boot:run
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 测试功能
|
|||
|
|
|
|||
|
|
#### 方式1: 使用HTML测试工具(推荐)
|
|||
|
|
1. 用浏览器打开 `测试WebSocket增强功能.html`
|
|||
|
|
2. 点击"连接直播间"或"连接私聊"
|
|||
|
|
3. 观察心跳消息和在线状态
|
|||
|
|
|
|||
|
|
#### 方式2: 使用WebSocket客户端
|
|||
|
|
```javascript
|
|||
|
|
// 连接直播间(带userId参数)
|
|||
|
|
const ws = new WebSocket('ws://localhost:8081/ws/live/chat/101?userId=123');
|
|||
|
|
|
|||
|
|
ws.onmessage = (event) => {
|
|||
|
|
const data = JSON.parse(event.data);
|
|||
|
|
console.log('收到消息:', data);
|
|||
|
|
|
|||
|
|
// 自动响应心跳
|
|||
|
|
if (data.type === 'heartbeat') {
|
|||
|
|
ws.send(JSON.stringify({ type: 'heartbeat_response' }));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 方式3: 测试REST API
|
|||
|
|
```bash
|
|||
|
|
# 检查用户在线状态
|
|||
|
|
curl http://localhost:8081/api/front/online/status/123
|
|||
|
|
|
|||
|
|
# 获取房间在线人数
|
|||
|
|
curl http://localhost:8081/api/front/online/room/101/count
|
|||
|
|
|
|||
|
|
# 获取离线消息数量
|
|||
|
|
curl http://localhost:8081/api/front/online/offline/count/456
|
|||
|
|
|
|||
|
|
# 获取连接统计
|
|||
|
|
curl http://localhost:8081/api/front/online/stats
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 核心功能说明
|
|||
|
|
|
|||
|
|
### 1. 心跳检测 💓
|
|||
|
|
|
|||
|
|
**工作机制:**
|
|||
|
|
- 服务器每30秒向所有连接发送心跳消息
|
|||
|
|
- 客户端收到后应立即响应
|
|||
|
|
- 90秒无响应则自动断开连接
|
|||
|
|
- 每60秒检查一次超时连接
|
|||
|
|
|
|||
|
|
**心跳消息格式:**
|
|||
|
|
```json
|
|||
|
|
// 服务器发送
|
|||
|
|
{
|
|||
|
|
"type": "heartbeat",
|
|||
|
|
"timestamp": 1234567890123
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 客户端响应
|
|||
|
|
{
|
|||
|
|
"type": "heartbeat_response"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 在线状态管理 👥
|
|||
|
|
|
|||
|
|
**功能特性:**
|
|||
|
|
- 实时追踪用户在线/离线状态
|
|||
|
|
- 记录用户最后活跃时间
|
|||
|
|
- 管理直播间在线用户列表
|
|||
|
|
- 支持批量查询在线状态
|
|||
|
|
- 自动过期机制(5分钟无活动)
|
|||
|
|
|
|||
|
|
**Redis数据结构:**
|
|||
|
|
```
|
|||
|
|
user:online:{userId} = "1" # 在线标记
|
|||
|
|
user:last_active:{userId} = timestamp # 最后活跃时间
|
|||
|
|
room:online:{roomId} = Set<userId> # 房间在线用户
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 离线消息处理 📬
|
|||
|
|
|
|||
|
|
**功能特性:**
|
|||
|
|
- 自动保存离线消息到Redis
|
|||
|
|
- 用户上线时自动推送
|
|||
|
|
- 最多保存100条消息
|
|||
|
|
- 消息保留7天
|
|||
|
|
- 推送后自动清除
|
|||
|
|
|
|||
|
|
**工作流程:**
|
|||
|
|
1. 用户A发送消息给用户B
|
|||
|
|
2. 检查用户B是否在线
|
|||
|
|
3. 在线 → 直接推送
|
|||
|
|
4. 离线 → 保存到Redis
|
|||
|
|
5. 用户B上线 → 自动推送所有离线消息
|
|||
|
|
6. 推送完成 → 清除离线消息
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 REST API 接口
|
|||
|
|
|
|||
|
|
### 基础URL
|
|||
|
|
```
|
|||
|
|
http://localhost:8081/api/front/online
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 接口列表
|
|||
|
|
|
|||
|
|
| 方法 | 路径 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| GET | `/status/{userId}` | 检查用户在线状态 |
|
|||
|
|
| POST | `/status/batch` | 批量检查在线状态 |
|
|||
|
|
| GET | `/room/{roomId}/users` | 获取房间在线用户 |
|
|||
|
|
| GET | `/room/{roomId}/count` | 获取房间在线人数 |
|
|||
|
|
| GET | `/offline/count/{userId}` | 获取离线消息数量 |
|
|||
|
|
| GET | `/offline/messages/{userId}` | 获取离线消息 |
|
|||
|
|
| DELETE | `/offline/messages/{userId}` | 清除离线消息 |
|
|||
|
|
| GET | `/stats` | 获取连接统计 |
|
|||
|
|
|
|||
|
|
详细的API文档请查看 `WebSocket增强功能实现说明.md`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 监控和调试
|
|||
|
|
|
|||
|
|
### 查看日志
|
|||
|
|
```bash
|
|||
|
|
# 查看心跳日志
|
|||
|
|
grep "Heartbeat" logs/application.log
|
|||
|
|
|
|||
|
|
# 查看在线状态日志
|
|||
|
|
grep "OnlineStatus" logs/application.log
|
|||
|
|
|
|||
|
|
# 查看离线消息日志
|
|||
|
|
grep "OfflineMessage" logs/application.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Redis监控
|
|||
|
|
```bash
|
|||
|
|
# 查看在线用户数
|
|||
|
|
redis-cli KEYS "user:online:*" | wc -l
|
|||
|
|
|
|||
|
|
# 查看某个用户的在线状态
|
|||
|
|
redis-cli GET "user:online:123"
|
|||
|
|
|
|||
|
|
# 查看房间在线用户
|
|||
|
|
redis-cli SMEMBERS "room:online:101"
|
|||
|
|
|
|||
|
|
# 查看离线消息
|
|||
|
|
redis-cli LRANGE "offline:msg:456" 0 -1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能指标
|
|||
|
|
```bash
|
|||
|
|
# 获取活跃连接数
|
|||
|
|
curl http://localhost:8081/api/front/online/stats
|
|||
|
|
|
|||
|
|
# 获取房间在线人数
|
|||
|
|
curl http://localhost:8081/api/front/online/room/101/count
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚙️ 配置说明
|
|||
|
|
|
|||
|
|
### 心跳配置
|
|||
|
|
在 `HeartbeatScheduler.java` 中可调整:
|
|||
|
|
```java
|
|||
|
|
private static final long HEARTBEAT_TIMEOUT = 90000; // 90秒超时
|
|||
|
|
private static final long HEARTBEAT_INTERVAL = 30000; // 30秒间隔
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 在线状态配置
|
|||
|
|
在 `OnlineStatusServiceImpl.java` 中可调整:
|
|||
|
|
```java
|
|||
|
|
private static final long ONLINE_EXPIRE_SECONDS = 300; // 5分钟过期
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 离线消息配置
|
|||
|
|
在 `OfflineMessageServiceImpl.java` 中可调整:
|
|||
|
|
```java
|
|||
|
|
private static final int MAX_OFFLINE_MESSAGES = 100; // 最多100条
|
|||
|
|
private static final long OFFLINE_MESSAGE_EXPIRE_SECONDS = 7 * 24 * 3600; // 7天
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🐛 常见问题
|
|||
|
|
|
|||
|
|
### Q1: 心跳消息没有发送?
|
|||
|
|
**A:** 检查以下几点:
|
|||
|
|
1. 确保启动类有 `@EnableScheduling` 注解
|
|||
|
|
2. 检查 `HeartbeatScheduler` 是否被Spring扫描到
|
|||
|
|
3. 查看日志是否有错误信息
|
|||
|
|
|
|||
|
|
### Q2: 在线状态不准确?
|
|||
|
|
**A:** 可能原因:
|
|||
|
|
1. Redis连接失败 - 检查Redis是否运行
|
|||
|
|
2. 过期时间太短 - 调整 `ONLINE_EXPIRE_SECONDS`
|
|||
|
|
3. 没有正确响应心跳 - 检查客户端代码
|
|||
|
|
|
|||
|
|
### Q3: 离线消息没有推送?
|
|||
|
|
**A:** 检查:
|
|||
|
|
1. 用户连接时是否调用了推送逻辑
|
|||
|
|
2. Redis中是否有离线消息
|
|||
|
|
3. 查看日志中的错误信息
|
|||
|
|
|
|||
|
|
### Q4: WebSocket连接失败?
|
|||
|
|
**A:** 确认:
|
|||
|
|
1. 后端服务是否启动
|
|||
|
|
2. 端口8081是否被占用
|
|||
|
|
3. 防火墙是否允许WebSocket连接
|
|||
|
|
4. 连接URL是否正确(需要带userId参数)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📈 性能优化建议
|
|||
|
|
|
|||
|
|
### 1. Redis优化
|
|||
|
|
- 使用Redis集群提高可用性
|
|||
|
|
- 配置合适的过期策略
|
|||
|
|
- 定期清理过期数据
|
|||
|
|
|
|||
|
|
### 2. 连接管理
|
|||
|
|
- 限制单个用户的最大连接数
|
|||
|
|
- 实现连接池管理
|
|||
|
|
- 监控连接数量和资源使用
|
|||
|
|
|
|||
|
|
### 3. 消息处理
|
|||
|
|
- 使用消息队列处理高并发
|
|||
|
|
- 实现消息批量处理
|
|||
|
|
- 优化消息序列化
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 相关文档
|
|||
|
|
|
|||
|
|
1. **详细功能说明**: `WebSocket增强功能实现说明.md`
|
|||
|
|
- 完整的功能介绍
|
|||
|
|
- API文档
|
|||
|
|
- 配置说明
|
|||
|
|
- 监控建议
|
|||
|
|
|
|||
|
|
2. **开发指南**: `直播IM系统开发指南.md`
|
|||
|
|
- 系统架构
|
|||
|
|
- 模块说明
|
|||
|
|
- 开发规范
|
|||
|
|
|
|||
|
|
3. **测试工具**: `测试WebSocket增强功能.html`
|
|||
|
|
- 可视化测试界面
|
|||
|
|
- 实时日志查看
|
|||
|
|
- API测试功能
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 功能完成度
|
|||
|
|
|
|||
|
|
| 功能模块 | 状态 | 完成度 |
|
|||
|
|
|---------|------|--------|
|
|||
|
|
| 心跳检测 | ✅ | 100% |
|
|||
|
|
| 在线状态管理 | ✅ | 100% |
|
|||
|
|
| 离线消息处理 | ✅ | 100% |
|
|||
|
|
| REST API | ✅ | 100% |
|
|||
|
|
| 文档 | ✅ | 100% |
|
|||
|
|
| 测试工具 | ✅ | 100% |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 下一步建议
|
|||
|
|
|
|||
|
|
### 短期优化
|
|||
|
|
1. 添加消息加密
|
|||
|
|
2. 实现消息撤回功能
|
|||
|
|
3. 添加消息已读回执
|
|||
|
|
4. 实现群聊功能
|
|||
|
|
|
|||
|
|
### 长期规划
|
|||
|
|
1. 引入消息队列(RabbitMQ/Kafka)
|
|||
|
|
2. 实现分布式WebSocket(多服务器)
|
|||
|
|
3. 添加消息持久化到数据库
|
|||
|
|
4. 实现消息搜索功能
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 技术支持
|
|||
|
|
|
|||
|
|
如有问题,请查看:
|
|||
|
|
1. 日志文件: `logs/application.log`
|
|||
|
|
2. Redis监控: `redis-cli monitor`
|
|||
|
|
3. 测试工具: `测试WebSocket增强功能.html`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 总结
|
|||
|
|
|
|||
|
|
所有功能已完整实现并测试通过!你的WebSocket系统现在具备:
|
|||
|
|
|
|||
|
|
✅ **稳定性** - 心跳检测保证连接健康
|
|||
|
|
✅ **实时性** - 在线状态实时更新
|
|||
|
|
✅ **可靠性** - 离线消息不丢失
|
|||
|
|
✅ **可监控** - 完整的REST API
|
|||
|
|
✅ **高性能** - Redis缓存优化
|
|||
|
|
✅ **易维护** - 清晰的日志和文档
|
|||
|
|
|
|||
|
|
**开始使用吧!** 🚀
|