Qt http网络编程

学习目标:Qt HTTP网络编程

学习内容

1、Http就是超文本传输协议(Hypertext Transfer Protocol)的缩写,它定义了浏览器和网页服务器之间的通信规范。是一个简单的请求一响应协议,它通常运行在 TCP 之上。

作用:规定 WWW 服务器与浏览器之间信息传递规范,是二者共同遵守的协议。
2.http 工作原理:HTTP 是基于客户/服务器模式,且面向连接的。HTTP 事务处理流程

  1. 客户与服务器建立连接;
  2. 客户向服务器提出请求;
  3. 服务器接受请求,并根据请求返回相应的文件作为应答:
  4. 客户与服务器关闭连接。

Qt 两种方式实现HTTP操作

1. 使用QNetworkAccessManager和QNetworkReply类:

  1. - QNetworkAccessManager是Qt的网络访问管理器,负责发送和接收HTTP/HTTPS请求。
  2. - 通过QNetworkAccessManager::get/post等发起GET/POST等请求,返回QNetworkReply对象。
  3. - 从QNetworkReply中获取响应码、头信息、内容等。实现同步和异步请求。

2. 使用QHttpEngine和QHttpNetworkRequest/Reply类(较低层级):

  1. - QHttpEngine负责管理HTTP连接并处理请求。
  2. - 使用QHttpNetworkRequest构建请求,通过QHttpEngine发送。 
  3. - 解析返回的QHttpNetworkReply获取响应。

一般来说,对于简单的HTTP操作,使用高层的QNetworkAccessManager接口就足够了。它可以方便地处理常见需求。

如果需要更低级的控制,如定制HTTP引擎或请求/响应细节,可以使用QHttpEngine等低层类。

总之,Qt提供了完整的HTTP客户机实现,开发者可以根据实际需求选择更合适的接口进行网络通信操作。这对开发Qt应用提供很好的支持。

总结:

第一种:QNetworkAccessManager 网络连接管理员, 2个行为:get/post 获取或提交请求,返回对象QNetworkReply里面有各种连接信息。

第二种:QHttpEngine 只管理连接请求,不负责发送,

  • 使用QHttpNetworkRequest构建请求,通过QHttpEngine发送。

  • 解析返回的QHttpNetworkReply获取响应。

项目效果和核心代码

http读取器

http服务器

核心代码 

http读取器

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


#include <QtNetwork> // 提供编程TCP/IP客户端和服务器的类
#include <QUrl> // 提供接口使用URLs


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager* accesssMgr;
};
#endif // MAINWINDOW_H


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    accesssMgr =new QNetworkAccessManager(this);

    QObject::connect(accesssMgr,QOverload<QNetworkReply*>::of(&QNetworkAccessManager::finished),this,
                     [this](QNetworkReply* reply){
            QString read=reply->readAll();
            ui->textBrowser->setText(read);
            reply->deleteLater();  //释放
    });

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
     ui->label->setText("数据正在下载中,请耐心等待......");
     QString url=ui->textEdit->toPlainText();
     qDebug()<<url;
     accesssMgr->get(QNetworkRequest(QUrl(url)));
}

http服务器

#include "httpserver.h"

HttpServer::HttpServer(QObject *parent) : QObject(parent)
{
    server =new QTcpServer(this);
    //连接回调
    connect(server,&QTcpServer::newConnection,this,&HttpServer::MyselfNewConnectCalllSlot);
    //开始监听
    if(!server->listen(QHostAddress::Any,8088))
    {
        qDebug()<<"\n致命错误:Web服务器没有启动,请重新检查!"<<endl;
    }
    else
    {
        qDebug()<<"\n正常启动:Web服务器端口:8088,等待客户端连接......"<<endl;;
    }
}
void HttpServer::MyselfNewConnectCalllSlot(){
    socket = server->nextPendingConnection();  //获取连接
    while(!(socket->waitForReadyRead(100))); //等待套接字是否有可读数据。 一直阻塞线程等待,直到有可读数据到达套接字,或者超时返回。

    QString webdata;
    webdata.resize(1000);
    webdata=socket->read(1000);

    qDebug()<<"正常运行:从浏览器读取数据信息......"<<webdata;

    //封装http协议
    socket->write("HTTP/1.1 200 OK\r\n");
    socket->write("Content-Type: text/html\r\n");
    socket->write("Connection: close\r\n");
    socket->write("Refresh: 3\r\n\r\n"); // 每秒刷新Web浏览器
    socket->write("<!DOCTYPE>"
                  "<html>"
                  "<header>"
                  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>"
                  "<title>HttpServer</title>"
                  "</header>"
                  "<body>客户端已经连接HttpSever服务器秒数为:");

    QByteArray byte;
    static qint16 icount=0;
    byte.setNum(icount++);
    socket->write(byte);
    socket->write("</html>");
/*
flush() 不会等待数据真正发送出去,只是把数据从本地缓冲区 flush 到内核缓冲区。
如果输出缓冲区没有数据,flush() 有可能不做任何操作。
调用 flush() 可以确保目前为止写到 socket 的所有数据都发送给对端,而不是 buffered 在本地。
一般在发送完请求或应答后调用,保证数据及时发送出去。
*/
    socket->flush(); //刷新 socket 对象的输出缓冲区。 并发送


    connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
    socket->disconnectFromHost();
}

 

总结

http是基于tcp的应用层协议,所以会使用到tcp的类,协议封装 是固定的。主要成员函数设计

请求:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0...
Accept: text/html

响应:
HTTP/1.1 200 OK
Date: Mon, 27 Jan 2020 08:12:31 GMT  
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 22 Jul 2020 19:15:56 GMT
ETag: "49092-5b6-52c65aa32f280"
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; charset=UTF-8

<html>
<head>
  <title>Welcome to example.com!</title>
</head>
<body>
  <h1>Hello World!</h1>
  <p>This is the hello world page for an example website.</p> 
</body>
</html>


这个示例演示了一个简单的HTTP请求和响应过程:
客户端发送GET请求获取index.html页面
服务器返回200状态码,表示请求成功
返回各种报头如日期、服务器信息等
返回HTML页面内容作为响应体

 

Qt HTTP编程的主要类是QNetworkAccessManager、QNetworkRequest和QNetworkReply。

QNetworkAccessManager:

  • 管理与网络的连接和请求。发送和接收数据。

  • 提供诸如get()、post()、put()等高级函数发起HTTP请求。

  • Signals: finished(), authenticationRequired()等。

QNetworkRequest:

  • 代表一个HTTP请求。包含URL、 headers等属性。

  • 设置请求方法、内容类型、头信息等。

QNetworkReply:

  • 代表一个HTTP响应。返回状态码和内容。

  • Signals: downloadProgress(), error()等通知处理结果。

  • 功能函数如readAll()读取响应内容。

主要使用步骤:

  1. 创建QNetworkAccessManager对象实例。

  2. 创建QNetworkRequest对象设置URL和属性。

  3. 调用QNetworkAccessManager::get()或post()等函数进行请求。

  4. 监听QNetworkReply的signals获取结果。

  5. 通过QNetworkReply读取内容,或处理错误。

  6. 删除QNetworkReply和请求对象防止内存泄漏。

最后附上源代码链接
对您有帮助的话,帮忙点个star

Qt demo: 学习qt过程 (gitee.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试常见面试题汇总(2024版)

一、常见的面试题汇总 1、你做了几年的测试、自动化测试&#xff0c;说一下 selenium 的原理是什么&#xff1f; 我做了五年的测试&#xff0c;1年的自动化测试&#xff1b; selenium 它是用 http 协议来连接 webdriver &#xff0c;客户端可以使用 Java 或者 Python 各种编…

软件测试想转职有适合的岗位吗?

软件测试被有些人看做技术含量低&#xff0c;但是软件测试实际上是万金油行业&#xff0c;如果你不是在很大的公司做的软件测试&#xff0c;相比你做的工作是很杂的&#xff0c;比如软件测试找bug&#xff0c;你的主业&#xff0c;帮着产品经理整理需求&#xff0c;帮着项目经理…

微软开源项目GraphRAG——基于知识图谱的RAG简介

前言 在大型语言模型&#xff08;LLM&#xff09;的前沿研究中&#xff0c;一个核心挑战与机遇并存的领域是扩展它们的能力&#xff0c;以解决超出其训练数据范畴的问题。这不仅要求模型在面对全新数据时仍能保持卓越表现&#xff0c;还意味着开辟了全新的数据分析可能性&…

【C++】C++ 汽车租赁管理系统(源码+论文)【500+行代码】【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

CAN总线实战项目:使用STM32和PCAN-View实现数据采集与监控系统(附完整代码)

摘要: 本文深入浅出地介绍CAN&#xff08;Controller Area Network&#xff0c;控制器局域网络&#xff09;总线协议&#xff0c;涵盖其基础概念、报文帧格式、仲裁机制、错误处理等关键知识。同时&#xff0c;文章结合STM32平台&#xff0c;从硬件设计、软件开发到实战案例&am…

【益起童行】为“来自星星的孩子”点亮希望之光

在未来的日子里&#xff0c; 我期望每一个孩子都能得到优质的干预治疗&#xff0c;让他们在未来能够过上正常、快乐的生活。 我也期望每一个家庭都能战胜困境&#xff0c;迎来美好。 作为社会的一份子&#xff0c;我愿意为这繁华人世贡献出自己微不足道但却真挚的力量&#xff…

24暑假计划

暑假计划&#xff1a; 1.从明天起开始将C语言的部分补充完整&#xff0c;这部分的预计在7月24日前完成 2.由于之前的文章内容冗余&#xff0c;接下来进行C语言数据结构的重新编写和后面内容的补充预计8月10号前完成 3.后续开始C的初级学习

新加坡很火的slots游戏代投Facebook广告新流量趋势

新加坡很火的slots游戏代投Facebook广告新流量趋势 在新加坡这片充满活力的土地上&#xff0c;Slots游戏以其独特的魅力和吸引力&#xff0c;迅速成为了许多玩家的心头好。而Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;为Slots游戏的推广提供了得天独厚的…

element-plus 按需导入问题 404等问题

场景 新开一个项目&#xff0c;需要用element-plus这个ui库&#xff0c;使用按需引入。 这是我项目的一些版本号 "element-plus": "^2.7.6","vue": "^3.2.13","vue-router": "^4.0.3",过程&#xff08;看解决方法…

【MySQL】常见的MySQL日志都有什么用?

MySQL日志的内容非常重要&#xff0c;面试中经常会被问到。同时&#xff0c;掌握日志相关的知识也有利于我们理解MySQL 底层原理&#xff0c;必要时帮助我们排查解决问题。 MySQL中常见的日志类型主要有下面几类(针对的是InnoDB 存储引擎): 错误日志(error log):对 MySQL 的启…

利用Python与uiautomator2实现【手机群控】

利用Python与uiautomator2实现多设备自动化测试 引言 在移动应用测试中&#xff0c;自动化测试是一种提高测试效率和覆盖率的有效手段。本文将介绍如何使用Python语言结合uiautomator2库来实现对多个设备的并行自动化测试。 老规矩先放实现的效果 环境准备 Python环境安装u…

评价妙笔生词智能写歌词软件:助力与局限并存

在音乐创作的领域&#xff0c;科技的发展催生了各种创新工具&#xff0c;妙笔生词智能写歌词软件便是其中引人注目的一项。对于这款软件&#xff0c;我们需要以客观和全面的视角来进行评估&#xff0c;因为它既带来了显著的助力&#xff0c;同时也存在不可忽视的局限。 妙笔生…

Iridient Developer:解锁Mac RAW图像处理的极致潜力,打造专业级色彩与细节

Iridient Developer for Mac是一款专为Mac用户设计的RAW图像调整软件&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;赢得了众多摄影师的青睐。以下是对这款软件的详细介绍&#xff1a; 一、强大的RAW图像处理能力 Iridient Developer专为处理RAW图像而设计&#xff0…

JAVA毕业设计146—基于Java+Springboot+vue+uniapp的景区旅游购票小程序(源代码+数据库+9000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvueuniapp的景区旅游购票小程序(源代码数据库9000字论文)146 一、系统介绍 本项目前后端分离&#xff0c;分为用户、管理员两种角色 1、用户&#xff1a; 注册…

PHP充电桩小程序系统源码

绿色出行新伴侣&#xff01;充电桩小程序&#xff0c;让充电不再烦恼✨ &#x1f50b; 开篇&#xff1a;告别电量焦虑&#xff0c;充电桩小程序来救场&#xff01; 在这个电动车日益普及的时代&#xff0c;电量不足成了不少车主的“心头大患”。但别担心&#xff0c;充电桩小…

神器!3个免费PPT成品网站推荐+3款AIPPT工具盘点!

熬夜加班做PPT却没有头绪&#xff1f;别再自己憋着想了&#xff01;现在凡事主打一个“抄作业”&#xff0c;想做ppt却没想法&#xff0c;可以去到ppt成品网站搜集PPT模板&#xff0c;或是使用时下流行的AI生成PPT工具&#xff0c;只需输入PPT主题&#xff0c;即可快速生成一份…

MongoDB教程(二):mongoDB引用shell

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

为企业提升销售工作效率的工作手机管理系统

在竞争日益激烈的市场环境中&#xff0c;企业的销售团队如同前线战士&#xff0c;其作战效率直接关乎企业的生存与发展。然而&#xff0c;传统销售管理模式下的信息孤岛、沟通不畅、数据混乱等问题&#xff0c;正悄然成为制约销售效率提升的瓶颈。今天&#xff0c;我们为您揭秘…

VR头显如何低延迟播放8K的RTSP|RTMP流

技术背景 我们在做Unity平台RTSP、RTMP播放器的时候&#xff0c;有公司提出来这样的技术需求&#xff0c;希望在头显播放全景的8K RTSP|RTMP直播流&#xff0c;8K的数据&#xff0c;对头显和播放器&#xff0c;都提出了新的要求&#xff0c;我们从几个方面&#xff0c;探讨下V…

mongo数据库迁移

前言 mongo数据库迁移的方式目前常见的有两种&#xff1a; 1&#xff0c;mongodump与mongorestore 2&#xff0c;mongoimport与mongoexport 二者主要区别有&#xff1a; 1、mongoexport 可以导出json和csv格式&#xff0c; mongodump导出的是bson可读性不如前者 2&#xff0c;…