C++基于websocket的多用户网页五子棋 ---- 模块介绍1

整体代码可以参考都在我的git仓库都能找到:

我的gobang-git仓库https://gitee.com/yaokong123/gobang项目设计思路,在上一篇博客,整理完思路再看模块会更清晰

项目设计思路https://blog.csdn.net/2302_80253411/article/details/154647338?spm=1001.2014.3001.5501

实用工具类模块代码实现

这一部分主要是负责提前实现一些项目中会用到的边缘功能代码,提前实现好了就可以在项目中直接用到的时候直接使用了。

  • 日志宏:实现程序打印
  • Mysql_APL封装: 数据库的连接&初始化,句柄的销毁,语句的执行
  • Jsoncpp-API封装: 封装实现Json的序列化与反序列化
  • String-Split封装:主要是封装了字符串分割的功能( 后面会用到
  • File-read封装:主要封装了文件数据的读取功能如读取html文件等

日志宏

主要思路就是:

时间戳 生成对应时间结构,然后将时间结构 按照一定的格式 放到对应的buf中

主要用到的函数有这些,若不太清楚的话,可以查一查

  • time_t time(NULL) ,获取系统时间戳 对应文件名 对应行号
  • struct tm *localtime(time_t *t);
  • char *strftime(char *buf, int max, char *format, struct tm *tm);
  • int fprintf(FILE *fp, char *format, ...);

Mysql_APL封装:

mysql的操作流程无非就是

  1. 初始化句柄
  2. 连接服务器
  3. 设置字符集
  4. 选择数据库
  5. 执行语句
  6. 保存结果到本地
  7. 获取结果条数遍历处理结果
  8. 释放句柄
    所以其类可以包括
cpp 复制代码
class mysql_util {

MYSQL *mysql_create()

bool mysql_exec(MYSQL *mysql, const std::string &sql)

void mysql_destroy(MYSQL *mysql);

}

Jsoncpp-API封装:

  1. json序列化:将多个数据对象,进行序列化得到一个json格式的字符串
  2. json反序列化:将json格式字符串,反序列化得到多个数据对象

所以其类可以包括

cpp 复制代码
class json_util{
public:
    static bool serialize(const Json::Value &root, std::string &str)
    static bool unserialize(const std::string &str, Json::Value &root)
}

String-Split封装

这个没什么说的,就是实现字符串的分割

如从123,123,,,136,要获取136;

split(const std::string &src, const std::string &sep, std::vector<std::string> &res)

File-read封装

注意一下,如何获得文件大小

cpp 复制代码
//获取文件大小
size_t fsize = 0;
ifs.seekg(0, std::ios::end);
fsize = ifs.tellg();
ifs.seekg(0, std::ios::beg);
body.resize(fsize);

参考代码:

参考代码见until.hpphttps://gitee.com/yaokong123/gobang

数据管理模块实现

参考项目设计文章中服务器流程图

我们需要一个 数据库和数据管理,这里会存放多个用户,也就是多张表;如此获取用户信息也简单了;

  • 数据管理模块主要负责对于数据库中数据进行统一的增删改查管理,其他模块要对数据操作都必须通过数据管理模块完成。

数据库设计

创建user表,用来表示用户信息及积分信息;

这里我们就要想,在user_table中, 我们需要什么东西: id, username, password, score, total_count, win_count, lose_count;

这些信息主要基于两点:

  • 用户信息,用来实现登录、注册、游戏对战数据管理等功能
  • 积分信息,用来实现匹配功能
代码:

我的git仓库

见gobang/soruce/db.sqhttps://gitee.com/yaokong123/gobang

建立完成可以验证:

数据管理模块的封装与实现

如开头介绍一样,数据库中有可能存在多个用户,也就是多张表,每张表中管理的数据有有不同,要进行的数据操作也各不相同;

为了方便管理,因此可以为每一张表中的数据操作都设计一个类 ,通过类实例化的对象来访问这张数据库表中的数据,这样的话当我们要访问哪张表的时候,使用哪个类实例化的对象即可。


封装思路(参考)

代码:

参考代码

见gobang/source/util.hpphttps://gitee.com/yaokong123/gobang

在线用户管理模块实现

简单介绍

如上篇服务器流程图中

对应已经长连接的用户来说,有时我们需要获得它们的 socket链接的关系;这对于 之后管理用户,创建对战房间等等来说,都要用到;

在线用户管理,是对于当前游戏大厅和游戏房间中的用户进行管理,主要是建立起用户与Socket连接的映射关系,这个模块具有两个功能:

  1. 能够让在房间,大厅获取用户的socket连接信息;或者说让程序中根据用户信息 ,找到能够与用户客户端进行通信的Socket连接,进而实现与客户端的通信。
  2. 判断一个用户是否在线,或者判断用户是否已经掉线。

封装思路(参考):

代码:

参考代码

见gobang/source/online.hpphttps://gitee.com/yaokong123/gobang

相关推荐
ouliten4 分钟前
C++笔记:流式异步日志库
c++·笔记
电饭叔6 分钟前
TypeError:unsupported operand type(s) for -: ‘method‘ and ‘int‘
开发语言·笔记·python
zfj3219 分钟前
排查java应用内存溢出的工具和方法
java·开发语言·jvm·内存溢出
橘子真甜~11 分钟前
C/C++ Linux网络编程13 - 传输层TCP协议详解(面向字节流和有连接)
linux·运维·服务器·c语言·网络·c++·tcp/ip
yugi98783812 分钟前
MATLAB在卫星姿态控制系统中的应用
开发语言·matlab
lightqjx16 分钟前
【算法】双指针
c++·算法·leetcode·双指针
历程里程碑19 分钟前
C++ 7vector:动态数组的终极指南
java·c语言·开发语言·数据结构·c++·算法
ss27319 分钟前
高并发读场景:写时复制容器(Copy-On-Write)
java·开发语言·rpc
czhc114007566320 分钟前
c# 1213
开发语言·数据库·c#
一人の梅雨1 小时前
淘宝商品视频接口深度解析:从视频加密解密到多端视频流重构
java·开发语言·python