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

news2025/6/3 3:27:50

前置知识的了解

  • 前言
  • 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.初始化asio
    server.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.coloradmin.cn/o/2395124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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表示绿…

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

一个创业型的企业&#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…

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

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

LeeCode 98. 验证二叉搜索树

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

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

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

threejsPBR材质与纹理贴图

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

深兰科技董事长陈海波受邀出席2025苏商高质量发展(常州)峰会,共话AI驱动产业升级

5月29日&#xff0c;2025苏商高质量发展峰会在常州隆重开幕。本次峰会聚焦新质生产力培育与产业创新转型&#xff0c;汇聚了众多江苏省内知名企业家、专家学者及政府代表。深兰科技创始人、董事长陈海波作为人工智能领域的领军企业代表&#xff0c;受邀出席盛会并参与重要活动环…

Git入门到精通:30分钟掌握核心技巧

目录 一、基础理论片 Git简介 Git安装 Git仓库 Git基本命令用法 仓库别名 二、实操命令篇 远程分支 分支的新建和合并 实操演示 1 本地新建仓库 2 gitee新建仓库 3 建立关系 4 新建分支 5 开发新功能 6 推送新分支 7 合并新分支到主分支 三、可视化工具篇 G…

Redis7底层数据结构解析

redisObject 在 Redis 的源码中&#xff0c;Redis 会将底层数据结构&#xff08;如 SDS、hash table、skiplist 等&#xff09;统一封装成一个对象&#xff0c;这个对象叫做 redisObject&#xff0c;也简称 robj。 typedef struct redisObject {unsigned type : 4; // 数…

多部手机连接同一wifi的ip一样吗?

在家庭和办公环境中&#xff0c;多台手机同时连接同一个WiFi路由器已成为常态。不少用户会产生疑问&#xff1a;这些设备的IP地址会相同吗&#xff1f;下面就一起来了解一下吧。 一、多部手机连接同一WiFi的IP‌一样吗 多部手机连接同一WiFi时的IP地址是否相同&#xff0c;需要…

大语言模型值ollama使用(1)

ollama为本地调用大语言模型提供了便捷的方式。下面列举如何在windows系统中快捷调用ollama。 winR打开运行框&#xff0c;输入cmd 1、输入ollama list 显示已下载模型 2、输入ollama pull llama3 下载llama3模型 3、 输入 ollama run llama3 运行模型 4、其他 ollama li…

thc-ssl-dos:SSL 压力测试的轻量级工具!全参数详细教程!Kali Linux教程!

简介 THC-SSL-DOS 是一款用于验证 SSL 性能的工具。 建立安全的 SSL 连接需要服务器比客户端高 15 倍的处理能力。 THC-SSL-DOS 利用这种不对称特性&#xff0c;通过使服务器过载并使其断网。 此问题影响当今所有 SSL 实现。供应商自 2003 年以来就已意识到这个问题&#x…

【速通RAG实战:进阶】17、AI视频打点全攻略:从技术实现到媒体工作流提效的实战指南

一、AI视频打点的技术底层与数据处理流程 (一)视频内容结构化的核心技术栈 AI视频打点的本质是将非结构化视频数据转化为带时间戳的结构化信息,其技术流程涵盖音视频处理、语音识别、自然语言处理三大核心模块,形成“数据采集-内容解析-智能标记-协同应用”的完整闭环。 …

立控信息智能装备柜:科技赋能军队装备管理现代化

在军事装备管理领域&#xff0c;高效、安全、智能化的存储解决方案至关重要。传统的人工管理模式不仅效率低下&#xff0c;还容易因人为疏忽导致装备丢失或管理混乱。​LKONE智能装备柜凭借先进的物联网技术、生物识别安全系统和智能管理功能&#xff0c;为军队提供了一套高效、…