基于HTTP编写ping操作

基于HTTP编写ping操作

前言

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

需求分析

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

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

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

客户端

分析

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


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

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

代码

cpp 复制代码
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请求。

cpp 复制代码
/*
 * HTTP
 */
class HttpServer : public QObject{
    Q_OBJECT

private:
    static HttpServer* instance;

    HttpServer(){}

    QHttpServer httpServer;
    QProtobufSerializer serializer;

public:
    static HttpServer* getInstance();

    //Http Server进行初始化
    bool init();
};

代码

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

cpp 复制代码
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等操作。

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

启动服务进行测试

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

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

客户端也一样

cpp 复制代码
#if TEST_NETWORK
    network::NetClient netClient(nullptr);
    netClient.ping();

启动服务器

再启动客户端

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

相关推荐
HABuo14 小时前
【linux(四)】套接字编程--基于UDP协议的客户端服务端
linux·服务器·c++·网络协议·ubuntu·udp·centos
日取其半万世不竭14 小时前
服务器自动备份方案:用 rsync + cron 实现异地增量备份
运维·服务器·php
艾莉丝努力练剑14 小时前
【Linux网络】Linux 网络编程入门:UDP Socket 编程(下)
linux·运维·服务器·网络·计算机网络·安全·udp
j_xxx404_21 小时前
Linux:静态链接与动态链接深度解析
linux·运维·服务器·c++·人工智能
Johnstons21 小时前
Wireshark ExpertInfo是什么?一文讲透异常分级、适用场景、和传统抓包阅读的区别与排查标准
网络·测试工具·wireshark·es
alxraves21 小时前
医疗器械软件注册指导原则注意事项
网络·安全·健康医疗·制造
c++之路1 天前
C++23概述
java·c++·c++23
墨风如雪1 天前
别被“高价建站”劝退了!我跑了多年的 WordPress 架构,一年只花 $25.7
服务器
云飞云共享云桌面1 天前
东莞智能装备工厂数字化实践—研发部门10名SolidWorks设计共享一台云主机流畅设计
服务器·自动化·汽车·负载均衡·制造
专注API从业者1 天前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库