基于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.mzph.cn/pingmian/60526.shtml

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

相关文章

机器学习 贝叶斯公式

这是条件概率的计算公式 &#x1d443;(&#x1d434;|&#x1d435;)&#x1d443;(B|A)&#x1d443;(&#x1d434;)/&#x1d443;(&#x1d435;) 全概率公式 &#x1d443;(&#x1d435;)&#x1d443;(&#x1d435;|&#x1d434;)&#x1d443;(&#x1d434;)&am…

【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)

第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 重要信息 三轮征稿时间&#xff1a;2024年11月30日23:5…

【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出

目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…

Java 责任链模式 减少 if else 实战案例

一、场景介绍 假设有这么一个朝廷&#xff0c;它有 县-->府-->省-->朝廷&#xff0c;四级行政机构。 这四级行政机构的关系如下表&#xff1a; 1、县-->府-->省-->朝廷&#xff1a;有些地方有完整的四级行政机构。 2、县-->府-->朝廷&#xff1a;直…

vue项目使用eslint+prettier管理项目格式化

代码格式化、规范化说明 使用eslintprettier进行格式化&#xff0c;vscode中需要安装插件ESLint、Prettier - Code formatter&#xff0c;且格式化程序选择为后者&#xff08;vue文件、js文件要分别设置&#xff09; 对于eslint规则&#xff0c;在格式化时不会全部自动调整&…

易考八股文之Elasticsearch合集

1、为什么要使用 Elasticsearch? 系统中的数据&#xff0c; 随着业务的发展&#xff0c; 时间的推移&#xff0c; 将会非常多&#xff0c;而业务中往往采用模糊查询进行数据的 搜索&#xff0c;而模糊查询会导致查询引擎放弃索引&#xff0c; 导致系统查询数据时都是全表扫描&…

Python 使用链式赋值

n n_ max(round(n * gd), 1) if n > 1 else n # depth gainPython 使用链式赋值将同一个值同时赋给多个变量。这意味着 n 和 n_ 会同时接收相同的结果值。我们可以将这行代码逐步拆解&#xff0c;以便理解传值的顺序和方法&#xff1a; 逐步解析 先计算右侧表达式的值&a…

Leetcode 整数转罗马数字

这段代码的算法思想是基于罗马数字的减法规则&#xff0c;将整数转换为罗马数字的字符串表示。下面是详细的解释&#xff1a; 算法步骤&#xff1a; 定义数值和符号对应关系&#xff1a;代码中定义了两个数组&#xff1a;values 和 symbols。values 数组包含了罗马数字的数值&…

web——sqliabs靶场——第六关——报错注入和布尔盲注

这一关还是使用报错注入和布尔盲注 一. 判断是否有sql注入 二. 判断注入的类型 是双引号的注入类型。 3.报错注入的检测 可以使用sql报错注入 4.查看库名 5. 查看表名 6.查看字段名 7. 查具体字段的内容 结束 布尔盲注 结束

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server &#xff1a;服务注册中心…

PowerShell 的执行策略限制了脚本的运行

问题 . : 无法加载文件 C:\Users\pumpkin84514\Documents\WindowsPowerShell\profile.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信 息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 3 …

计算机网络(3)网络拓扑和IP地址,MAC地址,端口地址详解

ok网络拓扑以及令人困惑的IP地址&#xff0c;MAC地址和端口地址来了&#xff01;&#xff01;&#xff01; 网络拓扑是指计算机网络中各个节点&#xff08;如计算机、路由器、交换机等&#xff09;以及它们之间连接的布局或结构。&#xff08;人话翻译过来也就是网络拓扑是计算…

Git - Think in Git

记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后&#xff0c;工作区 与其余三个区不同 当使用 add 将修改的代码暂存后&#xff0c;索引区与 工作区 相同 当使用 commit 将修改的代码提交后&#xff0c;仓库区 与 索引区 和 工作区 相…

CAN通讯演示(U90-M24DR)

概述 CAN通讯一般用的不多&#xff0c;相比于Modbus通讯不是特别常见&#xff0c;但也会用到&#xff0c;下面介绍一下CAN通讯&#xff0c;主要用U90军用PLC演示一下具体的数据传输过程。想更具体的了解的话&#xff0c;可以自行上网学习&#xff0c;此处大致介绍演示。…

时序论文19|ICML24 : 一篇很好的时序模型轻量化文章,用1k参数进行长时预测

论文标题&#xff1a;SparseTSF: Modeling Long-term Time Series Forecasting with 1k Parameters 论文链接&#xff1a;https://arxiv.org/pdf/2402.01533 代码链接&#xff1a;https://github.com/lss-1138/SparseTSF 前言 最近读论文发现时间序列研究中&#xff0c;模型…

(动画版)排序算法 -希尔排序

文章目录 1. 希尔排序&#xff08;Shellsort&#xff09;1.1 简介1.2 希尔排序的步骤1.3 希尔排序的C实现1.4 时间复杂度1.5 空间复杂度1.6 希尔排序动画 1. 希尔排序&#xff08;Shellsort&#xff09; 1.1 简介 希尔排序&#xff08;Shells Sort&#xff09;&#xff0c;又…

Python学习从0到1 day26 第三阶段 Spark ④ 数据输出

半山腰太挤了&#xff0c;你该去山顶看看 —— 24.11.10 一、输出为python对象 1.collect算子 功能: 将RDD各个分区内的数据&#xff0c;统一收集到Driver中&#xff0c;形成一个List对象 语法&#xff1a; rdd.collect() 返回值是一个list列表 示例&#xff1a; from …

DNS解析库

DNS解析库 dnsDNS的解析库以及域名的详解解析库dns解析的端口dns域名的长度限制流程优先级在现实环境中实现内网的dns解析 练习&#xff08;Ubuntu内网实现DNS解析&#xff09;主服务器备服务器 dns 域名系统&#xff0c;域名和ip地址互相映射的一个分布式的数据库&#xff0c…

kafka 生产经验——数据积压(消费者如何提高吞吐量)

bit --> byte --> kb -->mb -->gb --> tb --> pb --> eb -> zb -->yb

Database Advantages (数据库系统的优点)

数据库管理系统&#xff08;DBMS&#xff09;提供了一种结构化的方式来存储、管理和访问数据&#xff0c;与传统的文件处理系统相比&#xff0c;数据库提供了许多显著的优点。以下是数据库系统的主要优势&#xff1a; 1. Data Integrity (数据完整性) 概念&#xff1a;数据完整…