项目结构设计
- 1.项目模块划分
- 2.业务处理模块子模块的划分
- 3.实用工具类模板的实现
- 3.1 日志宏的实现
- 3.2 mysql工具
- 3.3 JsonCpp工具
- 3.4 string-Split工具 && file_util工具
1.项目模块划分
● 数据管理模块:依托 MySQL 数据库,负责用户数据的存储与管理,如注册信息、游戏记录等,为系统提供数据支撑。
● 前端界面模块:基于 JavaScript 开发,实现注册、登录、游戏大厅、游戏房间等页面的动态交互,同时处理与服务器的通信,确保用户操作(如匹配、对战、聊天)的实时反馈。
● 业务处理模块:搭建 WebSocket 服务器,作为客户端与服务器的通信桥梁,接收并处理各类业务请求(如用户认证、对战逻辑、消息转发等),是系统的核心业务处理层。
2.业务处理模块子模块的划分
- 网络通信模块
○ 基于websocketpp库,搭建 HTTP 和 WebSocket 服务器,提供网络通信能力,支持客户端与服务器的实时数据传输,是系统的通信基础。 - 会话管理模块
○ 利用cookie&session机制,在 HTTP 短连接场景下识别客户端身份,维持会话状态,解决 HTTP 无状态特性,确保用户身份一致性。 - 在线管理模块
○ 管理游戏大厅和房间内用户,监控在线状态,提供连接获取接口,支持实时对战和聊天的用户状态跟踪,确保离线用户不参与实时交互。 - 房间管理模块
○ 为匹配成功用户创建对战房间,处理五子棋对战(落子校验、胜负判断、棋盘同步)和聊天业务(消息广播),封装房间内业务逻辑,隔离多房间状态。 - 用户匹配模块
○ 按天梯分数分层匹配玩家,匹配成功后创建房间并加入用户,实现公平高效的玩家匹配,减少等待时间,提升对战体验。
3.实用工具类模板的实现
实用工具类模板主要负责提前实现一些代码中会用到的边缘代码,提前实现了就可以在项目中直接使用了。
3.1 日志宏的实现
在实现项目中,肯定会遇到bug,以及在项目上线之后也要定期观察项目的情况
所以日志的实现大致思想就是:设置一些日志等级,在测试项目的时候要打印出信息,项目上限之后把日志打印到文件中。
介绍一下关于时间戳的一些函数
time_t time(NULL) 获取时间戳
struct tm localtime(time_t * t) 根据时间戳生成时间格式
char strftime (char buff,int max,char* format, struct tm tm) 组织结构
int fprintf(FILE fp,char* fromat,…) 写入文件
#define INF 0
#define DBG 1
#define ERR 2
#define DEFAULT_LOG_LEVEL INF
//获得时间戳,将时间戳转换为一个时间结构,按照一定的格式放在指定空间中
#define LOG(level,format,...) do{\if(DEFAULT_LOG_LEVEL>level) break;\time_t t=time(NULL);\struct tm* lt=localtime(&t);\char buff[32]={0};\strftime(buff,31,"%H:%M:%S",lt);\fprintf(stdout,"[%s %s:%d] " format "\n",buff,__FILE__,__LINE__, ##__VA_ARGS__);\
}while(0)
//使用 do-while(0) 结构, 将多条语句组合成一个代码块,确保宏在展开时能够像一条语句一样使用
//##__VA_ARGS__是可变参数列表的占位符,## 用于处理可变参数为空的情况
#define ILOG(format,...) LOG(INF,format,##__VA_ARGS__)
#define DLOG(format,...) LOG(DBG,format,##__VA_ARGS__)
#define ELOG(format,...) LOG(ERR,format,##__VA_ARGS__)
3.2 mysql工具
这个工具主要用于数据库的连接&&初始化,句柄的销毁,语句的执行
3.3 JsonCpp工具
实现序列化和反序列化
3.4 string-Split工具 && file_util工具
一个是对字符串的分割,一个是文件数据的读取功能(对html文件数据进行读取)