本项目是一个网络聊天系统的演示示例,包含聊天服务器与客户端两部分。该系统借助 Socket 进行 TCP 流式网络通信,能够实现多用户之间的实时聊天交互。
开发日志,qps测试见:https://blog.csdn.net/JK01WYX/article/details/146803507?spm=1001.2014.3001.5502
-
事件通知与任务处理:
服务器运用 epoll 机制来高效监测事件的发生。一旦有事件触发,会将对应的文件描述符加入任务队列。
为了提升处理效率,系统采用线程池对任务队列中的任务进行处理。线程池会接收 基于Protobuf的KLV格式 的报文,解析其中的数据,并依据报文中 type 字段的不同,调用相应的处理方法,最后将处理结果发送回对应的文件描述符。 -
数据持久化存储与连接池实现:
服务器具备用户数据和离线消息的持久化存储能力。借助 MySQL Connector/C++ 这一专业的数据库连接库,服务器能够轻松建立与 MySQL 数据库的连接,并执行各类数据操作。
为进一步优化数据库连接的使用效率和性能,服务器实现了数据库连接池, 避免了频繁创建和销毁数据库连接带来的开销,显著提升了系统的响应速度和并发处理能力,确保大量用户数据和离线消息能够高效、稳定地存储到数据库中。 -
用户密码安全处理,用户身份验证与 Token 机制:
为保障用户密码的安全性,服务器采用加盐哈希的方式对用户密码进行处理。借助 OpenSSL 库,生成随机盐值,来对用户密码进行哈希加密。
当用户登录成功后,服务器会为其生成一个唯一的 token 令牌。这个 token 同样借助 OpenSSL 库生成,具有较高的安全性。在后续的网络交互过程中,客户端需要携带该 token 与服务器进行通信。服务器通过验证账号和 token 的组合来确认用户的身份,确保只有合法用户能够进行相关操作,进一步增强了系统的安全性和可靠性。 -
在线用户管理:
服务器采用 LRU(Least Recently Used,最近最少使用)算法实现的数据结构来管理在线用户。该数据结构会储存登录用户账号信息和token令牌,便于后续身份核验,确保每一次交互都源自合法且活跃的用户。 -
日志管理与信号处理:
服务器使用了自主开发的日志器(可参考https://github.com/DBWGLX/Cpp-Logging-Component-on-Independent-Threads),该日志器采用异步线程将日志信息写入文件,避免了日志记录操作对主线程的影响,提高了系统的性能。
服务器支持通过 Ctrl + C 发送的 2 号信号实现优雅退出。在接收到退出信号后,日志器会确保所有日志信息都完整地写入文件后,才会关闭服务器,保证了数据的完整性和一致性。
-
类 Shell 操作界面:
客户端的操作界面类似于 Shell 命令行,会明确提示用户支持的操作。用户可以在客户端进行注册、登录、查看当前在线人数、发送消息以及退出系统等操作,操作简单直观。 -
双线程设计:
客户端采用双线程架构,一个线程专门负责接收服务器发送的消息,另一个线程则负责向服务器发送用户输入的消息。这种设计使得客户端能够在接收消息的同时,及时响应用户的输入,提供流畅的交互体验。
报文协议见 MesgProtocol.md
数据库设计见 DATABASE.md