当前位置: 首页 > article >正文

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

前置知识的了解

  • 前言
  • 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;
}

相关文章:

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

前置知识的了解 前言1.Websocketpp1.1 使用Websocketpp的原因1.2 Websocket常用接口1.3 Websocket搭建服务器流程 2.JsonCpp2.1 Json 数据对象类的表示2.2序列化和反序列化的接口2.3 演示代码 3.Mysql![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93305f423b544fc1…...

历年中国科学技术大学计算机保研上机真题

2025中国科学技术大学计算机保研上机真题 2024中国科学技术大学计算机保研上机真题 2023中国科学技术大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 拆分数字 题目描述 给定一个数字&#xff0c;拆分成若干个数字之和&#xff…...

内联盒模型基本概念?——前端面试中的隐形考点剖析

导语 在前端开发中&#xff0c;盒模型是基础知识&#xff0c;但“内联盒模型”往往容易被忽视。它不是“能不能写出页面”的问题&#xff0c;而是“写出的页面为何错位、如何精准定位”的问题。很多面试官会借这个考点&#xff0c;判断候选人对浏览器渲染机制的理解是否深入。…...

HackMyVM-Art

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-31 03:00 EDT Nmap scan report for 192.168.43.1 Host is up (0.0047s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan rep…...

网页前端开发(基础进阶1)

颜色表示方法3种&#xff1a; 1.关键字&#xff1a; color&#xff1a;green&#xff1b; gray red yellow 2.rgb表示法&#xff1a;红&#xff0c;绿&#xff0c;蓝三原色。rgb&#xff08;r&#xff0c;g&#xff0c;b&#xff09;&#xff0c;r表示红色&#xff0c;g表示绿…...

const ‘不可变’到底是值不变还是地址不变

const的基础规则 声明时必须初始化​ const a; // ❌ 报错&#xff1a;Missing initializer in const declaration const b 10; // ✅ 正确块级作用域​&#xff08;const 的作用域仅限于声明它的代码块&#xff09; if (true) {const x 100; } console.log(x); // ❌ 报错…...

如何找到一条适合自己企业的发展之路?

一个创业型的企业&#xff0c;开始就需要面向市场&#xff0c;通过自己的服务或产品&#xff0c;帮助用户解决问题&#xff0c;为客户创造价值&#xff0c;通过为客户创造的价值&#xff0c;出创造一定的的现金流&#xff0c;让企业存活下来&#xff01; 企业的运营过程中&…...

Vue-数据监听

数据监听 基础信息 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>数据监听</title><!-- 引入Vue --><script type"text/javascript" src"../js/vue.js&qu…...

当前用户的Git全局配置情况:git config --global --list

通过config命令可以查询当前用户的全局配置情况。这些配置项定义了 Git 在全局范围内的行为&#xff0c;包括如何处理大文件、SSL 证书验证以及提交时的用户信息。 git config --global --list http.sslVerifyfalse 这个配置项禁用了 SSL 证书验证。这在与自签名证书的 Git 服…...

AI生态警报:MCP协议风险与应对指南(中)——MCP Server运行时安全​​

作为连接AI模型与外部工具的“USB-C接口”&#xff0c;MCP协议成为AI生态的核心枢纽&#xff0c;其安全风险已从理论威胁转化为实际攻击目标。 AI生态警报&#xff1a;MCP协议风险与应对指南&#xff08;上&#xff09;——架构与供应链风险https://blog.csdn.net/WangsuSecur…...

day15 leetcode-hot100-29(链表8)

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 1.暴力法 思路 &#xff08;1&#xff09;先获取链表的长度L &#xff08;2&#xff09;然后再次遍历链表到L-n的位置&#xff0c;直接让该指针的节点指向下下一个即可。 2.哈希表 思路 &#xff0…...

DeepSeek 赋能文化遗产数字化修复:AI 重构千年文明密码

目录 一、引言二、文化遗产数字化修复概述2.1 文化遗产数字化修复的意义2.2 传统数字化修复方法与局限 三、DeepSeek 技术剖析3.1 DeepSeek 技术原理与核心优势3.2 相比其他技术的独特之处 四、DeepSeek 在文化遗产数字化修复中的应用4.1 破损文物的智能修复4.2 文化遗产的虚拟…...

MonitorSDK_性能监控(从Web Vital性能指标、PerformanceObserver API和具体代码实现)

性能监控 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量化和优化网页在实际用户终端上的性能体验。Web Vitals 强调“以用户为中心”的度量&#xff0c;而不…...

Spring Boot整合JWT实现认证与授权

概述 JSON Web Token (JWT) 是一种开放标准 (RFC 7519)&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间安全地传输信息。在Web应用中&#xff0c;JWT常用于身份验证和信息交换。 依赖配置 首先需要在项目中添加JWT依赖&#xff1a; <!-- JWT依赖…...

在 Linux 系统上连接 GitHub 的方法 (适用2025年)

在2025年&#xff0c;使用 Linux 系统连接 GitHub 的推荐方式是通过 SSH (Secure Shell) 协议进行身份验证。这种方式不仅安全&#xff0c;还能免去每次操作时输入用户名和密码的繁琐。 &#x1f6e0;️ 步骤一&#xff1a;检查并安装 Git 首先&#xff0c;确保你的系统已安装…...

解决matlab两个库文件名冲突的问题

解决matlab两个库文件名冲突的问题 1、删除一个路径的文件&#xff08;不推荐&#xff09;2、改变优先级&#xff08;让不想要的版本shadowed&#xff09;3、更改文件名 添加一个库&#xff0c;发现总是调用另一个库的同名文件&#xff0c;这是由于路径中优先级问题。 which -…...

PHP 垃圾回收机制解析与应用案例

PHP 垃圾回收机制解析与应用案例 什么是 PHP 垃圾回收机制&#xff1f; PHP 的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是其内存管理的重要组成部分。它的主要职责是管理内存的分配与释放&#xff0c;尤其是处理复杂的循环引用问题&#xff0c;确保 PHP …...

es6 函数解构

对象的解构赋值是内部机制&#xff0c;先找回同名属性&#xff0c;再赋值给对应的变量&#xff0c;真正被赋值的是后者。 let node {type:Identifier,name:foo,loc:{start:{line:1,column:1},end:{line:1,column:4}},method:function(){console.log(method);},range:[0,3] };…...

offset三大家族

以下是关于 offset 三大家族的知识点总结&#xff1a; 1. offsetParent 定义&#xff1a;offsetParent 是距离目标元素最近的已定位&#xff08;position 不为 static&#xff09;的祖先元素。特点&#xff1a; 如果父级元素都没有定位&#xff0c;则 offsetParent 为 body。…...

RSTP介绍加实操

简介 STP协议虽然能够解决环路问题&#xff0c;但是收敛速度慢&#xff0c;影响了用户通信质量。如果STP网络的拓扑结构频繁变化&#xff0c;网络也会频繁失去连通性&#xff0c;从而导致用户通信频繁中断。IEEE于2001年发布的802.1w标准定义了快速生成树协议RSTP&#xff08;R…...

Elasticsearch父子关系解析

引言 在复杂业务场景中&#xff0c;数据关联查询是搜索与分析的核心需求。以电商订单、文章评论、客户关系等场景为例&#xff0c;传统关系型数据库通过外键实现的多表关联&#xff0c;在分布式搜索场景下面临性能与扩展性挑战。Elasticsearch通过父子关系&#xff08;Parent-…...

33、请求处理【源码分析】Servlet API参数解析原理

33、请求处理【源码分析】Servlet API参数解析原理 在 Spring Boot 中&#xff0c;请求处理过程中涉及到 **Servlet API 参数解析** 的核心机制&#xff0c;主要依赖于 HandlerMethodArgumentResolver 接口及其相关实现类。以下是其原理的详细分析&#xff1a; --- ### **1. 参…...

基于深度学习的三维图像生成项目开发方案

基于深度学习的三维图像生成项目开发方案 一、项目概述 本项目旨在开发一个基于生成对抗网络(GAN)的三维图像生成系统,能够从随机噪声中生成高质量的三维体素数据。该系统可应用于医学影像合成、游戏内容生成、材料科学等领域。 二、技术架构 #mermaid-svg-JZqC6oWtS9sQ6…...

面试题——计算机网络:HTTP和HTTPS的区别?

HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff1a;作为互联网上应用最广泛的网络通信协议&#xff0c;HTTP是基于TCP/IP协议族的应用层协议。它采用标准的请求-响应模式进行通信&#xff0c;通过简洁的报文格式&#xff08;包含请求行、请求头、请求体等&a…...

Flutter 包依赖升级指南:让项目保持最新状态

在 Flutter 开发过程中&#xff0c;依赖项管理是确保项目顺利运行和持续优化的关键环节。依赖项是项目中不可或缺的外部库&#xff0c;它们提供了各种功能&#xff0c;从 UI 组件到数据处理工具&#xff0c;帮助开发者快速构建应用。然而&#xff0c;随着时间的推移&#xff0c…...

LeeCode 98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 提示&#xff1a; 树中节…...

JVM类加载高阶实战:从双亲委派到弹性架构的设计进化

前言 作为Java开发者&#xff0c;我们都知道JVM的类加载机制遵循"双亲委派"原则。但在实际开发中&#xff0c;特别是在金融支付、插件化架构等场景下&#xff0c;严格遵循这个原则反而会成为系统扩展的桎梏。本文将带你深入理解双亲委派机制的本质&#xff0c;并分享…...

[网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发

文章目录 数据库数据库设计配置 MyBatis1. Spring 配置2. 创建实体类3. 创建 Mapper 接口4. 使用 MyBatis 约定前后端交互接口登录接口注册接口获取用户信息 服务器开发loginregistergetUserInfo完整代码 数据库 数据库设计 完成注册登录以及用户分数管理 使用数据库来保存上…...

maven编译时跳过test过程

如果代码里有无法在打包环境中测试的部分&#xff0c;则直接运行mvn clean package&#xff0c;因为测试失败&#xff0c;会导致打包失败。目前有两种方式可以跳过测试&#xff1a; 1. mvn clean package -DskipTests&#xff0c;这会跳过执行阶须&#xff0c;但仍会生成测试所…...

threejsPBR材质与纹理贴图

1. PBR材质简介 本节课没有具体的代码&#xff0c;就是给大家科普一下PBR材质&#xff0c;所谓PBR就是&#xff0c;基于物理的渲染(physically-based rendering)。 Three.js提供了两个PBR材质相关的APIMeshStandardMaterial和MeshPhysicalMaterial,MeshPhysicalMaterial是Mes…...