基于HTTP编写ping操作

基于HTTP编写ping操作

前言

在上一集我们就完成了创建MockServer的任务,那么我们就可以正式开始进行网络的通讯,那么我们今天就来基于HTTP来做一个客户端ping服务端的请求,服务端返回pong的响应。

需求分析

基于HTTP,实现ping功能,客户端给服务器发送一个HTTP请求,GET/ping

服务端返回一个响应,相应的正文中包含pong!

那么我们就要分别完成客户端和服务端的内容

客户端

分析

我们需要创建一个请求用于发送ping,我们给这个请求设置一个发送的URL,那么我们就用客户端的http客户端发送一个get请求,我们的这个请求作为我们的参数,返回值是一个响应,我们也用一个resp来接收它!


但是有一个问题,我们发送了请求是立即执行的,我们返回的内容不是那么快就能拿到的,响应还需要一定的时间。所以我们不能直接写代码就将这个响应的内容进行读出。所以我们需要让整个响应回来了,才能读取数据。

那么我们的Qt中的信号槽就可以实现这个功能,当我们的响应完全回来了,我们就会触发信号槽,之后先看看我们的响应是否有error,如果没有错误就可以读出body的数据了。记得一定要把我们的resp给延迟释放!

代码

void NetClient::ping()
{QNetworkRequest httpReq;httpReq.setUrl(QUrl(HTTP_URL + "/ping"));QNetworkReply* httpResp = httpClient.get(httpReq);connect(httpResp, &QNetworkReply::finished, this, [=](){//响应回来了if(httpResp->error() != QNetworkReply::NoError){LOG() << "HTTP请求失败!" << httpResp->errorString();httpResp->deleteLater();return;}QByteArray body = httpResp->readAll();LOG() << "响应内容:" << body;httpResp->deleteLater();});
}

这里我们的客户端的ping请求就写完了,我们继续来看服务端的内容。

服务端

服务端这边由于我们是有两个协议进行通信,那么我们就创建两个类来分别完成两个协议的方法。

我们这里暂时只先做HTTP的内容。

成员

我们需要有一个Qt里的HttpServer以及一个protobuffer的序列化器,我们同时把这个HttpServer也弄成单例模式的。那么我们就弄一个init方法,里面配置一个路由让我们能够回应我们的ping请求。

/** HTTP*/
class HttpServer : public QObject{Q_OBJECTprivate:static HttpServer* instance;HttpServer(){}QHttpServer httpServer;QProtobufSerializer serializer;public:static HttpServer* getInstance();//Http Server进行初始化bool init();
};

代码

我们这里监听所有ip,之后监听的是我们的8000端口号,这也是我们之前的常量提起过的。我们这里要配置路由,这样能够让我们更好的配合ping请求,收到请求后我们放回一个pong即可。

HttpServer* HttpServer::instance = nullptr;HttpServer *HttpServer::getInstance()
{if(instance == nullptr){instance = new HttpServer();}return instance;
}bool HttpServer::init()
{int ret = httpServer.listen(QHostAddress::Any,8000);//配置路由httpServer.route("/ping", [](const QHttpServerRequest& req){(void) req;qDebug() << "[http] 收到ping请求";return "pong";});return ret == 8000;
}

哦对,我们的ret接收的这个listen方法的数据是一个端口号。

我们这里就只需要弄一个listen,如果是Linux下的网络编程还要有bind等操作。

这个配置路由其实是请求的路径的映射。

启动服务进行测试

我们在服务器端的主函数里添加一些内容

HttpServer* httpServer = HttpServer::getInstance();if(!httpServer->init()){qDebug() << "HTTP 服务器启动失败!";return 1;}qDebug() << "HTTP 服务器启动成功!";

客户端也一样

#if TEST_NETWORKnetwork::NetClient netClient(nullptr);netClient.ping();

启动服务器

再启动客户端

就可以看到内容了,那么这一集就先到这里吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15257.html

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

相关文章

数学几百年重大错误:将无穷多各异直线误为直线y=x

黄小宁 h定理&#xff1a;点集AB≌B的必要条件是A≌B。 证&#xff1a;若AB则A必可恒等变换地变为BA≌A&#xff0c;而恒等变换是保距变换。证毕。 直线Z&#xff1a;x-y0&#xff08;x的变域是x轴&#xff09;可放大&#xff08;拉伸&#xff09;变换为直线L&#xff08;不≌Z…

力扣 LeetCode 459. 重复的子字符串(Day4:字符串)

解题思路&#xff1a; KMP算法 len - next[len - 1]作为最小公共子串的长度 len % (len - next[len - 1]) 0检测能否构成重复串&#xff0c;能构成整数倍&#xff0c;代表可以构成 注意&#xff1a; i 从 j 的下一位开始&#xff0c;即 i 初始化为 1 next[len - 1]需要大…

【MMIN】缺失模态想象网络用于不确定缺失模态的情绪识别

代码地址&#xff1a;https://github.com/AIM3RUC/MMIN abstract&#xff1a; 在以往的研究中&#xff0c;多模态融合已被证明可以提高情绪识别的性能。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到模态丢失的问题&#xff0c;而哪些模态会丢失是不确定的。这使得…

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟&#xff0c;由于内部HSI存在较大的误差&#xff0c;因此我们在系统完成上电初始化&#xff0c;之后需要将STM32的时钟切换到外部HSE作为系统时钟&#xff0c;那么我…

离散数学笔记

第 1 章 数理逻辑 1.1 命题 1.1.1 基本概念 非真即假的陈述句称作命题 作为命题的陈述句所表达的判断结果称作命题的真值 真值只取两个值&#xff1a;真&#xff08;1或T&#xff09;或假&#xff08;0或F&#xff09; 真值为真的命题称作真命题&#xff0c;真值为假的命…

华大严选生物基因科技有限公司:基因检测行业十佳优质品牌

在 DNA 基因检测领域&#xff0c;华大严选生物基因科技有限公司以其卓越的品质和专业的服务脱颖而出&#xff0c;荣获 DNA 基因检测行业十佳优质品牌。 华大严选拥有先进的技术和设备&#xff0c;确保检测结果的准确性和可靠性。其专业的团队由经验丰富的科学家和技术人员组成…

spring boot整合https协议

注意&#xff1a;此方式是跳过SSL认证的。 整体目录 1. 生成SSL证书 首先&#xff0c;使用keytool生成一个自签名证书。打开命令行工具并运行以下命令&#xff1a; keytool -genkeypair -alias myserver -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 这…

python3 pyinstaller编译相关 和 python2兼容的一些问题

一: python2 和 python3的兼容问题 如果本地同时安装了python2 和 python3, 且都配置了环境变量的情况下, 在命令行里如何区分呢? python2: py -2 python3: py -3如何区分python2的pip 与 python3 的pip呢 python2: pip install xxx python3: pip3 install xxx二: pyin…

互联网行业面对大数据时代新挑战如何实现数据高速传输

随着互联网技术的飞速发展&#xff0c;我们正处在一个数据量爆炸增长的时代。据IDC预测&#xff0c;到2024年&#xff0c;全球数据总量将飙升至159.2ZB&#xff0c;而到了2028年&#xff0c;这一数字更是将达到384.6ZB。这样的增长速度&#xff0c;无疑为互联网行业带来了巨大的…

Python自动化小技巧24——实现自动化输出模板表格报告

背景 很多人拿到数据excel文件&#xff0c;然后要写报告&#xff0c;做表格&#xff0c;要各种计算&#xff0c;各种排序&#xff0c;分组聚合&#xff0c;数据透视&#xff0c;然后合并单元格&#xff0c;添加边框&#xff0c;加粗&#xff0c;添加显示规则&#xff0c;添加数…

python爬虫获得店铺的所有商品

在编写Python爬虫以获取店铺的所有商品信息时&#xff0c;通常涉及到发送HTTP请求、解析响应内容以及处理API返回的数据。以下是一个详细的Python爬虫示例&#xff0c;用于获取店铺的商品信息。这个示例假设API返回的是JSON格式的数据&#xff0c;并且需要API密钥进行认证。 步…

单片机设计电流与温度监控python上位机监控平台设计

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代工业自动化和智能设备管理中&#xff0c;对电流和温度的实时监控是…

HarmonyOS本地存储-Preferences(用户首选项)的使用

一&#xff0c;用户首选项简述 ohos.data.preferences (用户首选项) 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。 数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据…

【springboot使用sqlite数据库】Java后台同时使用mysql、sqlite

环境&#xff1a;根据业务的需要&#xff0c;老版程序使用的数据库是sqlite&#xff0c;版本升级成前后台分离模式&#xff0c;因此需要兼容mysql与sqlite数据库同时使用。 pom.xml设置&#xff1a; application.yml文件配置&#xff1a; mapper.java文件&#xff1a; service.…

【IC每日一题:AXI4协议时序及Verilog示例】

IC每日一题&#xff1a;AXI4协议时序及Verilog示例 1 AXI4协议1.1 AXI4通道1.1.0 握手机制1.1.1 写操作1.1.2 读操作 1.2 握手相关时序1.2.1 握手防死锁 1.3 AXI传输时序1.3.0 Burst传输1.3.1 AXI_Lite Write 传输1.3.2 Read读传输1.3.3. 非对齐传输1.3.4 Outstanding传输1.3.5…

Linux操作系统 -----(4.用户账户及组账户管理)

目录 前言 本章学习目标 1.用户分类 2.用户账户文件 3.用户影子文件 4.用户账户管理命令 4.1.新增用户命令 4.2.修改密码命令 4.3.修改用户属性命令 4.4.删除用户命令 5.组用户管理 5.1.组账户分类 5.2.组账户管理文件 5.3.组账户管理命令 5.3.1.新建组命令 5.3…

JUC基础类-AbstractQueuedSynchronizer

AbstractQueuedSynchronizer 1、AbstractQueuedSynchronizer概述2、AbstractQueuedSynchronizer源码分析2.1 AQS源码2.2 Node类 如有侵权&#xff0c;请联系&#xff5e; 如有问题&#xff0c;也欢迎批评指正&#xff5e; 1、AbstractQueuedSynchronizer概述 AbstractQueuedSy…

LIS系统:质控管理

LIS系统定义 LIS系统&#xff0c;全称为Laboratory Information System&#xff08;实验室信息系统&#xff09;&#xff0c;是专为临床检验实验室设计的信息管理系统。它在医院和实验室中扮演着至关重要的角色&#xff0c;通过自动化管理流程&#xff0c;显著提高了检验工作的…

应用jar包使用skywalking8(Tongweb7嵌入式p11版本 by lqw)

文章目录 声明linux使用skywalking安装包下载Elasticsearch安装Skywalking 安装Skywalking 如何使用Agent探针 window本地使用skywalking 声明 1.安装参考&#xff1a; SkyWalking 部署&#xff08;包含ES 2.首先安装一定要根据本帖所建议的版本进行安装和测试&#xff0c;不…

Python学习------第七天

for循环的基础语法 依次取出&#xff0c;遍历循环 for 变量 in 被处理的数据 2.range语句 for循环嵌套 使用for循环打印99乘法表 continue的使用