【五子棋在线对战】一.前置知识的了解

article/2025/6/15 14:57:09

前置知识的了解

  • 前言
  • 1.Websocketpp
    • 1.1 使用Websocketpp的原因
    • 1.2 Websocket常用接口
    • 1.3 Websocket搭建服务器流程
  • 2.JsonCpp
    • 2.1 Json 数据对象类的表示
    • 2.2序列化和反序列化的接口
    • 2.3 演示代码
  • 3.Mysql![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93305f423b544fc18d88f43310260013.png)
    • 3.1 演示代码

前言

本文章旨在对五子棋在线对战的代码进行实现的全过程,包括了代码的环境,前置知识的了解,和项目的整体架构。

1.Websocketpp

WebSocket是从HTML5开始⽀持的⼀种⽹⻚端和服务端保持⻓连接的消息推送机制。

1.1 使用Websocketpp的原因

传统的web程序都是一问一答的形式,就是客户端给服务器发送数据,服务器给客户端返回一个相应,这种情况下服务端是被动的一方,他无法主动的给客户端发送数据,
但是这个项目非常依赖消息推送,我们需要服务器主动的给客户端发送消息,如果只是使用原生的http协议,很难满足需求。

基于上述,就产⽣了WebSocket协议。WebSocket更接近于TCP这种级别的通信⽅式,⼀旦连接建⽴完成客⼾端或者服务器都可以主动的向对⽅发送数据。

1.2 Websocket常用接口

在这里插入图片描述

1.3 Websocket搭建服务器流程

int main(){// 1.使用websocketpp库创建服务器websocketsvr server;// 2.设置websocketpp库的日志级别// all表示打印全部级别日志// none表示什么日志都不打印server.set_access_channels(websocketpp::log::alevel::none);// 3.初始化asioserver.init_asio();// 4.注册http请求的处理函数server.set_http_handler(bind(&OnHttp, &server, ::_1));// 5.注册websocket请求的处理函数server.set_open_handler(bind(&OnOpen, &server, ::_1));server.set_close_handler(bind(&OnClose, &server, _1));server.set_message_handler(bind(&OnMessage,&server,_1,_2));// 6.监听8888端口server.listen(8888);// 7.开始接收tcp连接server.start_accept();// 8.开始运行服务器server.run();return 0;
}

2.JsonCpp

Json 是⼀种数据交换格式,它采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据

//C语言
char *name = "xx";
int age = 18;
float score[3] = {88.5, 99, 58};//Json
{"姓名" : "xx","年龄" : 18,"成绩" : [88.5, 99, 58]
}[{"姓名":"小明", "年龄":18, "成绩":[23, 65, 78]},{"姓名":"小红", "年龄":19, "成绩":[88, 95, 78]}
]

2.1 Json 数据对象类的表示

class Json::Value{Value &operator=(const Value &other); //Value重载了[]和=,因此所有的赋值和获取数据都可以通过Value& operator[](const std::string& key); //简单的方式完成 val["name"] = "xx";Value& operator[](const char* key);Value removeMember(const char* key); //移除元素const Value& operator[](ArrayIndex index) const; //val["score"][0]Value& append(const Value& value); //添加数组元素val["score"].append(88);ArrayIndex size() const; //获取数组元素个数 val["score"].size();bool isNull();  //用于判断是否存在某个字段std::string asString() const; //转string string name = val["name"].asString();const char* asCString() const; //转char* char *name = val["name"].asCString();Int asInt() const; //转int int age = val["age"].asInt();float asFloat() const; //转float float weight = val["weight"].asFloat();bool asBool() const; //转 bool bool ok = val["ok"].asBool();
};

2.2序列化和反序列化的接口

在这里插入图片描述

2.3 演示代码

#include <iostream>
#include <string>
#include <sstream>
#include <jsoncpp/json/json.h>std::string serialize()
{// 1.将序列化的数据,存储在Json::Value中Json::Value root;root["name"] = "kang";root["age"] = 22;root["num"].append(120);root["num"].append(104);root["num"].append(111);// 2.实例化一个StreamWriterBuilder工厂类中Json::StreamWriterBuilder swb;// 3.通过StreamWriterBuilder工厂类对象生产一个StreamWriter对象Json::StreamWriter *sw = swb.newStreamWriter();// 4.使用StreamWriter对象,对存储在Json::Value中的数据进行序列化std::stringstream ss;int ret = sw->write(root, &ss);if (ret != 0){std::cout << "Json 序列化 faild" << std::endl;return nullptr;}std::cout << ss.str() << std::endl;delete sw;return ss.str();
}void unserialize(const std::string &str)
{//1.实例化一个CharReaderBuilder工厂类对象Json::CharReaderBuilder crb;//2.使用这个工厂类对象生产一个CharReader对象Json::CharReader *cr=crb.newCharReader();//3.定义一个Json::Value对象存储解析后的数据Json::Value root;std::string error;//4.使用CharReader对象进行Json格式字符串str的反序列化//parse(char* start, char* end, Json::Value *val, string *err)bool ret=cr->parse(str.c_str(),str.c_str()+str.size(),&root,&error);if(ret==false){std::cout<<"json unserialize failed"<<std::endl;return ;}//5.逐个元素去访问Json::Value的数据std::cout<<"name: "<<root["name"].asString()<<std::endl;std::cout<<"age: "<<root["age"].asInt()<<std::endl;int len=root["num"].size();for(int i=0;i<len;i++){std::cout<<"num: "<<root["num"][i].asFloat()<<std::endl;}delete cr;
}
int main()
{std::string str=serialize();unserialize(str);return 0;
}

3.Mysql在这里插入图片描述

3.1 演示代码

#include <stdio.h>
#include <string.h>
#include <mysql/mysql.h>#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PASS "yangjuntao"
#define DBNAME "gobang"
int main()
{// 1. 初始化mysql操作句柄// MYSQL *mysql_init(MYSQL *mysql)MYSQL *mysql = mysql_init(NULL);if (mysql == NULL){printf("mysql init failed\n");return -1;}// 2. 连接mysql服务器// MYSQL *mysql_real_connect(mysql,host,user,pass,dbname,port,unix_socket,flag)if (mysql_real_connect(mysql, HOST, USER, PASS, DBNAME, PORT, NULL, 0) == NULL){printf("connect mysql server failed : %s \n", mysql_error(mysql));mysql_close(mysql);return -1;}// 3. 设置客户端的字符集// int mysql_set_character_set(mysql, "utf8");if (mysql_set_character_set(mysql, "utf8") != 0){printf("set client character failed : %s\n", mysql_error(mysql));mysql_close(mysql);return -1;}// 4. 选择想要操作的数据库// int mysql_select_db(mysql, dbname)// mysql_select_db(mysql, dbname);// 5. 执行sql语句// int mysql_query(MYSQL* mysql,char *sql);char* sql="insert stu values(null,'kangchu',24,23,25,19);";// char * sql="updata stu set ch=ch+40 where sn=1;";// char * sql="delete from stu where sn=1;";//char *sql = "select * from stu;";int ret = mysql_query(mysql, sql);if (ret != 0){printf("%s\n", sql);printf("mysql query,failed : %s\n", mysql_error(mysql));mysql_close(mysql);return -1;}// 6. 如果是查询语句则需要保存到本地// MYSQL_RES *mysql_store_result(MYSQL *mysql)MYSQL_RES *res = mysql_store_result(mysql);if (res == NULL){mysql_close(mysql);return -1;}// 7. 获取结果集中的结果条数目// int mysql_num_rows(MYSQL_RES *result)// int mysql_num_fields(MYSQL_RES *result)int num_row = mysql_num_rows(res);int num_col = mysql_num_fields(res);// 8. 遍历保存到本地的结果集// MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)for (int i = 0; i < num_row; i++){MYSQL_ROW row = mysql_fetch_row(res);for (int i = 0; i < num_col; i++){printf("%s\t", row[i]);}printf("\n");}// 9. 释放结果集mysql_free_result(res);// 10. 关闭连接,释放句柄mysql_close(mysql);return 0;
}

http://www.hkcw.cn/article/uoGeSdRmuo.shtml

相关文章

数据中台(大数据平台)之主数据管理

主数据管理是为了确保主数据一致性和准确性而进行的一系列管理活动&#xff0c;包括主数据的收集、存储、分析、更新和共享等&#xff0c;旨在确保一个组织中使用的各个系统都有准确、一致的主数据。 1.主数据编码管理&#xff1a;主数据编码是主数据的唯一标识符。主数据编码…

Leetcode 1908. Nim 游戏 II

1.题目基本信息 1.1.题目描述 Alice 和 Bob 交替进行一个游戏&#xff0c;由 Alice 先手。 在游戏中&#xff0c;共有 n 堆石头。在每个玩家的回合中&#xff0c;玩家需要 选择 任一非空石头堆&#xff0c;从中移除任意 非零 数量的石头。如果不能移除任意的石头&#xff0c…

飞致云开源社区月度动态报告(2025年5月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…

湖北秭归:屈原故里过端午 龙舟竞渡展非遗

5月30日,2025年屈原故里传统龙舟大赛在湖北省秭归县茅坪镇徐家冲港湾激情开赛。秭归作为屈原的故乡,也是中国龙舟运动的重要发源地之一,端午节期间赛龙舟、祭屈原的传统习俗一直延续至今。今年的比赛继续展示了“点睛、下水、游江、竞渡、抢红”等传统的龙舟仪式,追溯历史岁…

Target店铺应该如何入驻?

Target作为美国知名的零售巨头&#xff0c;其电商平台为众多商家提供了一个拓展业务、提升品牌知名度的绝佳机会。然而&#xff0c;入驻Target平台并非易事&#xff0c;需要商家满足一系列的条件并支付相应的费用。 以下是&#xff0c;明月跨境&#xff0c;总结出的详细的入驻指…

基于PyQt5 开发的Todo应用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-pyqt.git PyQt Todo 应用 一个使用 PyQt5 开发的现代化任务管理应用&#xff0c;帮助您高效管理日常任务和待办事项。 &#x1f4cb; 应用简介 这是一个功能完整的桌面任务管理应用&#xff0c;具有直观的图形…

springboot集成websocket给前端推送消息

一般通常情况下&#xff0c;我们都是前端主动朝后端发送请求&#xff0c;那么有没有可能&#xff0c;后端主动给前端推送消息呢&#xff1f;这时候就可以借助websocket来实现。下面给出一个简单的实现样例。 首先创建一个websocketDemo工程&#xff0c;该工程的整体结构如下&a…

002医护人员排班系统技术解析:构建高效医疗人力管理平台

医护人员排班系统技术解析&#xff1a;构建高效医疗人力管理平台 在医疗行业高速发展的今天&#xff0c;科学合理的医护人员排班对保障医疗服务质量和效率至关重要。医护人员排班系统作为医疗信息化管理的重要工具&#xff0c;通过整合医院信息管理、医护信息管理、医护类型管…

CTFHub-RCE 命令注入-过滤目录分隔符

观察源代码 代码里面可以发现过滤了目录分隔符\和/ 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 打开flag文件 发现存在一个flag_is_here的文件夹&#xff0c;我们需要打开这个文件夹找到目标文件我们尝试分步&#xff0c;先利…

使用curlconverter网站快速生成requests请求包

在python写requests请求的时候&#xff0c;抓包后需要复制粘贴包的内容&#xff0c;然后手动修改和写代码。 最近发现一个好的网站 https://curlconverter.com/python/ 可以复制curl(bash)数据后&#xff0c;直接生成数据包&#xff0c;非常便捷。 举例说明&#xff1a; 选…

产品规格书写作结构、规范(编写指南)

一、产品规格书定义 产品规格书是一种综合性文档&#xff0c;它将产品需求、交互设计、业务流程和界面原型有机结合在一起。与传统文字为主的规格书不同&#xff0c;产品规格书通过高保真原型、动态交互和详细注释来完整表达产品功能和用户体验要求。 产品规格书是产品设计阶…

Webug4.0靶场通关笔记16- 第16关MySQL配置文件下载

目录 第16关 MySQL配置文件下载 1.打开靶场 2.源码分析 3.渗透实战 &#xff08;1&#xff09;Windows系统 &#xff08;2&#xff09;Linux系统 4、防御方法 本文通过《webug4.0靶场第16关MySQL配置文件下载》来进行渗透实战。文件下载是指 Web 应用程序在处理文件下载…

Java开发经验——阿里巴巴编码规范实践解析10

摘要 这篇文章主要介绍了阿里巴巴Java开发的编码规范实践解析&#xff0c;重点聚焦于系统设计规范。文中强调了存储方案和底层数据结构设计的重要性&#xff0c;指出其需要经过严格评审并形成文档。同时&#xff0c;详细阐述了设计与评审流程&#xff0c;包括设计方案初稿、建…

AutoML详解:自动化机器学习的未来

AutoML详解&#xff1a;自动化机器学习的未来 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AutoML详解&#xff1a;自动化机器学习的未来摘要引言技术架构对比1. 核心组件&#xff1a;从算法到工作流2. 算法实现…

(8)-Fiddler抓包-Fiddler如何设置捕获会话

1.简介 在前面我们介绍了Fiddler界面内容以及作用。那么我们接下来讲解和分享如何设置Fiddler后&#xff0c;我们就可以捕获会话&#xff0c;进行抓包了。 2.捕获会话的设备 常见的捕获会话的设备分为PC&#xff08;电脑&#xff09;端和手机&#xff08;Android和IOS苹果&am…

虚拟DOM和DOM是什么?有什么区别?虚拟DOM的优点是什么?

虚拟DOM与真实DOM的概念 虚拟DOM&#xff08;Virtual DOM&#xff09;是一种对真实DOM的抽象表示&#xff0c;其结构通常为一个JavaScript对象&#xff0c;保存了DOM节点的标签、属性、子节点等信息。真实DOM则是浏览器中的实际文档对象模型&#xff0c;由HTML代码解析生成&am…

电赛TIMSPM0G3507 CCS环境安装在D盘的方法

前言 安装TI的环境内存占用还是比较大的&#xff0c;但是大家默认安装到C盘&#xff0c;本篇就教大家从0到一安装到D盘 先把3个要下载的下载了 1.安装SDK 登录LP-MSPM0G3507 评估板 | TI.com.cn这个网站 选择Windows的下载 2.下载图形配置软件 登录SYSCONFIG IDE、配置、编译器…

电力高空作业安全检测(3)RT-DETR模型

背景与挑战 YOLO 系列模型长期以来在实时目标检测领域占据主导地位&#xff0c;因其在速度与精度之间取得了良好的平衡。然而&#xff0c;这些模型在处理多尺度特征时&#xff0c;往往依赖于非极大值抑制&#xff08;NMS&#xff09;后处理步骤&#xff0c;这不仅增加了计算…

项目架构初始化,底部导航页面切换

引言 在移动端应用开发中&#xff0c;底部导航栏是一种常见的用户界面元素&#xff0c;用于在不同的页面之间进行快速切换。本文将介绍如何初始化一个 Vue.js 项目&#xff0c;并实现底部导航栏页面切换的功能。 &#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &…

51c大模型~合集133

我自己的原文哦~ https://blog.51cto.com/whaosoft/13948969 #用Veo 3Suno做了个AI Rapper 吊打音乐节上的流量明星 太疯狂了&#xff01;AI生成的嘻哈歌手唱Rap以假乱真&#xff0c;网友直呼「看不出破绽」。 来来来&#xff0c;眼尖的朋友请告诉我&#xff0c;下面这个…