zhibo/Zhibo/WebSocket增强功能-README.md

8.5 KiB
Raw Permalink Blame History

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个

  1. WebSocket处理器
    • crmeb-front/src/main/java/com/zbkj/front/websocket/LiveChatHandler.java ✏️
    • crmeb-front/src/main/java/com/zbkj/front/websocket/PrivateChatHandler.java ✏️

文档和测试3个

  1. 文档
    • WebSocket增强功能实现说明.md - 详细的功能说明文档
    • WebSocket增强功能-README.md - 本文件
    • 测试WebSocket增强功能.html - 可视化测试工具

🚀 快速开始

1. 确保Redis运行

# 检查Redis是否运行
redis-cli ping
# 应该返回: PONG

2. 启动后端服务

cd Zhibo/zhibo-h/crmeb-front
mvn spring-boot:run

3. 测试功能

方式1: 使用HTML测试工具推荐

  1. 用浏览器打开 测试WebSocket增强功能.html
  2. 点击"连接直播间"或"连接私聊"
  3. 观察心跳消息和在线状态

方式2: 使用WebSocket客户端

// 连接直播间带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

# 检查用户在线状态
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秒检查一次超时连接

心跳消息格式:

// 服务器发送
{
  "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


🔍 监控和调试

查看日志

# 查看心跳日志
grep "Heartbeat" logs/application.log

# 查看在线状态日志
grep "OnlineStatus" logs/application.log

# 查看离线消息日志
grep "OfflineMessage" logs/application.log

Redis监控

# 查看在线用户数
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

性能指标

# 获取活跃连接数
curl http://localhost:8081/api/front/online/stats

# 获取房间在线人数
curl http://localhost:8081/api/front/online/room/101/count

⚙️ 配置说明

心跳配置

HeartbeatScheduler.java 中可调整:

private static final long HEARTBEAT_TIMEOUT = 90000;   // 90秒超时
private static final long HEARTBEAT_INTERVAL = 30000;  // 30秒间隔

在线状态配置

OnlineStatusServiceImpl.java 中可调整:

private static final long ONLINE_EXPIRE_SECONDS = 300; // 5分钟过期

离线消息配置

OfflineMessageServiceImpl.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缓存优化
易维护 - 清晰的日志和文档

开始使用吧! 🚀