欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > Qt http网络编程

Qt http网络编程

2024/11/30 11:46:08 来源:https://blog.csdn.net/weixin_50873490/article/details/140323073  浏览:    关键词: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> // 提供接口使用URLsQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com