Skip to content

DBWGLX/SZU_system_programming

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基于 Linux 的 C++ 网络聊天服务器演示项目

项目概述

本项目是一个网络聊天系统的演示示例,包含聊天服务器与客户端两部分。该系统借助 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

效果展示

  • 服务器的启动与退出
    image image image

  • 客户端操作
    操作指南
    image
    注册
    image
    登录
    image
    获取在线用户
    image
    聊天
    image
    退出
    image

  • 数据库展示
    image

  • 日志展示
    image

About

school tasks

Resources

License

Stars

Watchers

Forks

Packages

No packages published