# QT聊天软件服务端 **Repository Path**: Jaklin/qt-chat-software-server ## Basic Information - **Project Name**: QT聊天软件服务端 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-20 - **Last Updated**: 2025-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WeChat 服务端 基于 Qt 开发的即时通讯服务器,为客户端提供账号管理、消息转发、好友管理等核心功能。 ## 📋 项目简介 这是一个功能完整的即时通讯服务端程序,采用 Qt 网络模块实现 TCP 服务器,支持多客户端并发连接。使用 JSON 文件存储用户数据,部署简单,适合学习和中小规模应用。 ## ✨ 功能特性 ### 服务器管理 - ✅ 可配置端口启动/停止服务器 - ✅ 实时显示在线客户端列表 - ✅ 在线人数统计 - ✅ 服务器状态监控 - ✅ 日志系统(INFO/WARNING/ERROR 分级) ### 用户管理 - ✅ 用户注册(账号、密码、昵称) - ✅ 用户登录验证 - ✅ 用户数据持久化(JSON 文件) - ✅ 用户资料更新(昵称等) - ✅ 管理员用户管理界面 ### 好友系统 - ✅ 好友申请发送/接收 - ✅ 好友申请状态管理(pending/accepted/rejected) - ✅ 双向添加好友 - ✅ 删除好友(双向删除) - ✅ 联系人列表查询 ### 消息处理 - ✅ 单聊消息转发 - ✅ 离线消息队列 - ✅ 聊天记录存储 - ✅ 消息历史查询 - ✅ 广播消息功能 ### 连接管理 - ✅ 心跳检测机制 - ✅ 超时连接自动断开 - ✅ 连接状态监控 - ✅ 异常连接处理 ### 管理员功能 - ✅ 用户列表查看 - ✅ 用户信息查看(昵称、注册时间、在线状态、联系人数量、聊天记录数量) - ✅ 删除用户 - ✅ 清空用户聊天记录 - ✅ 修改用户密码 ## 🛠️ 技术栈 - **框架**: Qt 5.x / Qt 6.x - **语言**: C++11 - **网络**: QTcpServer / QTcpSocket - **数据存储**: JSON 文件 - **UI**: Qt Widgets ## 📦 依赖要求 - Qt 5.12+ 或 Qt 6.x - C++11 或更高版本编译器 - CMake 或 qmake(推荐使用 Qt Creator) ## 🔨 编译与运行 ### 使用 Qt Creator 1. 打开 Qt Creator 2. 选择 `文件` → `打开文件或项目` 3. 选择 `wechat_server.pro` 文件 4. 配置构建套件(Kit) 5. 点击 `构建` → `运行` ### 使用命令行 ```bash # 进入项目目录 cd wechat_server # 生成 Makefile qmake wechat_server.pro # 编译 make # Linux/Mac # 或 mingw32-make # Windows MinGW # 运行 ./wechat_server # Linux/Mac # 或 wechat_server.exe # Windows ``` ## 📁 项目结构 ``` wechat_server/ ├── main.cpp # 程序入口 ├── mainwindow.cpp/h/ui # 服务器主窗口(GUI) ├── servermanager.cpp/h # 服务器管理器(核心) ├── clientmanager.cpp/h # 客户端管理器 ├── messagehandler.cpp/h # 消息处理器 ├── heartbeatmonitor.cpp/h # 心跳检测器 ├── logger.cpp/h # 日志系统 ├── usermanagerdialog.cpp/h/ui # 用户管理对话框 ├── wechat_server.pro # Qt 项目文件 └── userdata/ # 用户数据目录(运行时生成) └── *.json # 用户数据文件(每个用户一个) ``` ## 🚀 使用说明 ### 启动服务器 1. **运行程序** - 运行编译后的可执行文件 - 服务器 GUI 窗口会自动打开 2. **配置端口** - 在"端口"输入框中输入端口号(默认建议:8888) - 端口范围:1-65535 3. **启动服务器** - 点击"启动服务器"按钮 - 状态栏显示"状态: 运行中"(绿色) - 日志窗口显示"服务器启动成功,监听端口: XXXX" 4. **停止服务器** - 点击"停止服务器"按钮 - 所有客户端连接将被断开 - 状态栏显示"状态: 未启动" ### 查看在线客户端 - 服务器启动后,右侧"在线客户端"列表会实时显示所有已登录的客户端 - 显示信息包括: - 用户名 - IP 地址和端口 - 上线时间 ### 发送广播消息 1. 在"广播消息"输入框中输入消息内容 2. 点击"发送广播"按钮 3. 所有在线客户端都会收到这条消息 ### 用户管理 1. **打开用户管理界面** - 点击"用户管理"按钮 - 打开用户管理对话框 2. **查看用户信息** - 在左侧用户列表中选择一个用户 - 右侧显示该用户的详细信息: - 用户名 - 昵称 - 注册时间 - 在线状态 - 联系人数量 - 聊天记录数量 3. **删除用户** - 选择用户后,点击"删除用户"按钮 - 确认删除操作 - ⚠️ **注意**:此操作不可恢复,会删除用户的所有数据 4. **清空聊天记录** - 选择用户后,点击"清空聊天记录"按钮 - 确认操作 - 会清空该用户的所有聊天记录 5. **修改密码** - 选择用户后,在"新密码"输入框中输入新密码 - 点击"修改密码"按钮 - 确认操作 ### 查看日志 - 日志窗口实时显示服务器运行日志 - 日志级别颜色区分: - **黑色**:INFO(信息) - **橙色**:WARNING(警告) - **红色**:ERROR(错误) - 点击"清空日志"按钮可清空日志窗口 ## ⚙️ 配置说明 ### 数据存储 - **用户数据目录**: `程序运行目录/userdata/` - **用户数据文件**: `userdata/<用户名>.json` - 每个用户一个 JSON 文件,包含: - 账号信息(用户名、密码、昵称) - 注册时间 - 联系人列表 - 聊天记录 - 好友申请列表 - 离线消息队列 - 最后消息记录 ### 心跳检测配置 心跳检测参数在 `servermanager.cpp` 中设置: ```cpp m_heartbeatMonitor->start(30, 60); // 参数1:心跳间隔(秒) // 参数2:超时时间(秒) ``` - **心跳间隔**: 客户端应每隔 30 秒发送一次心跳 - **超时时间**: 如果 60 秒内未收到心跳,断开连接 ### 日志配置 日志系统使用单例模式,自动记录所有服务器事件: - 客户端连接/断开 - 用户登录/注册 - 消息处理 - 错误信息 ## 🔌 通信协议 ### 消息格式 - **传输方式**: TCP 长连接 - **数据格式**: JSON(UTF-8 编码) - **消息分隔**: 每条消息以 `\n`(换行符)结尾 ### 消息示例 **客户端 → 服务端(登录)**: ```json {"type":"login","username":"user1","password":"123456"} ``` **服务端 → 客户端(登录成功)**: ```json {"type":"login","success":true,"message":"登录成功","username":"user1","contacts":[...]} ``` ### 支持的消息类型 #### 客户端请求类型 - `login`: 用户登录 - `register`: 用户注册 - `message`: 发送聊天消息 - `getContacts`: 获取联系人列表 - `getChatHistory`: 获取聊天记录 - `addContact`: 添加联系人(已废弃,改用好友申请) - `removeContact`: 删除联系人 - `friendRequest`: 发送好友申请 - `acceptFriendRequest`: 接受好友申请 - `rejectFriendRequest`: 拒绝好友申请 - `getFriendRequests`: 获取好友申请列表 - `updateProfile`: 更新个人资料 - `heartbeat`: 心跳消息 #### 服务端推送类型 - `welcome`: 连接欢迎消息 - `userOnline`: 用户上线广播 - `contactsUpdated`: 联系人列表更新 - `friendRequestReceived`: 收到好友申请通知 - `friendRequestAccepted`: 好友申请被接受通知 - `contactRemoved`: 被删除联系人通知 - `profileUpdated`: 用户资料更新广播 - `offlineMessages`: 离线消息推送 ### 响应格式 所有请求响应统一格式: ```json { "type": "请求类型", "success": true/false, "message": "响应消息", "data": {...} // 可选,附加数据 } ``` ## ⚠️ 注意事项 1. **端口占用** - 确保选择的端口未被其他程序占用 - 常见端口冲突:8888、8080、3306 等 2. **数据安全** - 当前版本密码以明文存储(仅用于学习演示) - 生产环境请使用密码哈希(如 bcrypt、PBKDF2) - 建议使用 TLS/SSL 加密传输 3. **性能限制** - JSON 文件存储适合中小规模应用(< 1000 用户) - 大规模应用建议迁移到数据库(SQLite/MySQL/PostgreSQL) 4. **数据备份** - 定期备份 `userdata` 目录 - 用户数据文件损坏可能导致数据丢失 5. **并发处理** - 使用互斥锁(QMutex)保护共享数据 - 注意避免死锁情况 6. **资源清理** - 服务器停止时会断开所有客户端连接 - 确保所有资源正确释放 ## 🐛 常见问题 ### Q: 服务器启动失败,提示端口被占用? A: 检查端口是否被其他程序占用,或更换其他端口号。 ### Q: 客户端连接后立即断开? A: 检查心跳检测配置,确保客户端正确发送心跳消息。 ### Q: 用户数据文件损坏怎么办? A: 备份数据文件,尝试手动修复 JSON 格式,或删除损坏的用户数据文件(用户需重新注册)。 ### Q: 日志窗口显示过多信息? A: 可以点击"清空日志"按钮清空,或调整日志级别(需修改代码)。 ### Q: 如何查看用户数据? A: 用户数据存储在 `userdata/<用户名>.json` 文件中,可直接用文本编辑器打开查看。 ## 📝 开发说明 ### 核心模块 - **ServerManager**: 服务器管理器,负责监听端口、处理新连接 - **ClientManager**: 客户端管理器,管理在线客户端和用户数据 - **MessageHandler**: 消息处理器,解析并处理所有客户端请求 - **HeartbeatMonitor**: 心跳检测器,定期检查客户端连接状态 - **Logger**: 日志系统,统一记录服务器运行日志 ### 数据流程 1. **客户端连接** → `ServerManager::onNewConnection()` 2. **接收消息** → `ServerManager::onClientReadyRead()` 3. **消息解析** → `MessageHandler::handleMessage()` 4. **业务处理** → `ClientManager` 相关方法 5. **响应发送** → `MessageHandler::sendMessage()` ### 扩展开发 如需添加新功能: 1. 在 `MessageHandler::handleMessage()` 中添加新的消息类型处理 2. 在 `ClientManager` 中添加对应的业务逻辑方法 3. 更新用户数据结构(如需要) 4. 更新通信协议文档 ### 线程安全 - `ClientManager` 使用 `QMutex` 保护共享数据 - 所有数据访问都通过互斥锁保护 - 注意避免在持有锁的情况下进行网络操作 ## 🔒 安全建议 1. **密码存储** - 使用密码哈希算法(bcrypt、PBKDF2) - 不要存储明文密码 2. **传输加密** - 使用 TLS/SSL 加密 TCP 连接 - 防止密码和消息被窃听 3. **输入验证** - 验证所有客户端输入 - 防止 SQL 注入、XSS 等攻击(如迁移到数据库) 4. **访问控制** - 实现权限系统 - 限制管理员操作权限 5. **日志审计** - 记录敏感操作日志 - 定期审查日志文件 ## 📄 许可证 本项目仅供学习交流使用。 ## 👥 贡献 欢迎提交 Issue 和 Pull Request! --- **版本**: 1.0 **最后更新**: 2025