【QT】基于HTTP协议的网络应用程序

server/2024/9/24 4:29:01/

目录

1 HTTP概述

2 QT中实现高层网络操作的类

3 使用HTTP类请求数据

4 基于HTTP协议的网络文件下载


HTTP概述

HTTP(超文本传输协议)是互联网上应用最为广泛的协议之一,它定义了客户端和服务器之间进行通信的规则。HTTP是一种无状态的协议,它通过请求-响应模型来实现客户端和服务器之间的数据传输。

2 QT中实现高层网络操作的类

Qt网络模块提供一些类实现OSI7层网络模型中高层的网络协议,如HTTP、FTP、SNMP等,这些类主要是QNetworkRequest、QNetworkRepIy和QNetworkAccessManager。
QAetworkRequest类通过一个URL地址发起网络协议请求,可以设置请求的URL、请求头、请求方法等属性,可以添加自定义的请求头字段,保存网络请求的信息,目前支持HTTP、FTP和局部文件URLs的下载或上传。
QNetworkAccessManager类用于协调网络操作。在QNetworkRequest发起一个网络请求后,QNetworkAccessManager类负责发送网络请求,创建网络响应。 QNetworkAccessManager类提供了信号和槽机制,允许处理请求的完成、错误和响应等事件。
QNetworkReply类表示网络请求的响应。由QNetworkAccessManager在发送一个网络请求后创建一个网络响应。QNetworkReply提供的信号finished()、readyRead()和downloadProgress()可以监测网络响应的执行情况,执行相应操作。
QNetworkReply是QIODevice的子类,所以QNetworkReply支持流读写功能,也支持异步或同步工作模式。 QNetworkReply类提供了获取响应状态码、响应头、响应正文等信息的方法,可以通过该类获取服务器返回的数据。
QNetworkCookieJar类是用于管理和存储HTTP请求和响应中的Cookie。可以设置和获取Cookie,并将其与请求关联起来。

使用HTTP类请求数据

使用HTTP类请求数据步骤:
1.使用QNetworkAccessManager类创建网络访问管理器
2.使用QNetworkRequest创建请求对象
3.使用QNetworkReply发出GET请求(在请求完成后一定要记得使用deleteLater来清理释放资源)
4.连接信号与槽得到数据
 说明:由HTTP客户端(qt程序)发起一个请求,建立一个到服务器制定端口的TCP连接(默认80端口);HTTP服务器在指定的端口监听客户端发送过来的请求,一旦收到请求,服务器端就会向客户端发回一个应答。在程序中,使用get()函数发出请求,返回一个QNetworkReply对象管理应答,当数据来临时,产生readyread信号;过程中出错会产生error信号;下载进度更新时会产生process信号;处理结束会产生finish信号。因此,发出请求,接收应答对象,关联相关信号槽,在槽内做处理即可。出错或者结束,打印告知用户,或者对话框;新数据来就往文件里面写;进度更新就去更新进度条。

4 基于HTTP协议的网络文件下载

基于上述三个类,设计一个基于HTTP协议的网络文件下载程序,实例程序名称samp14_5,图14-12是程序运行下载文件时的界面。
https://i-blog.csdnimg.cn/direct/eed1dbd8380448e78ee7bea0456e3bc8.png" width="600" />
图14-12
在URL地址编辑框里输入一个网络文件URL地址,设置下载文件保存路径后,单击“下载”按钮就可以开始下载文件到设置的目录下。进度条可以显示文件下载进度,下载完成后还可以用缺省的软件打开下载的文件。URL里的HTTP地址可以是任何类型的文件,如html、pdf、doc、exe等。
要下载文件,先在窗口上的URL编辑框里输入下载地址,再设置下载文件保存的目录。单击“缺省路径”按钮会在程序的当前目录下创建一个临时文件夹,输入这些设置后,单击“下载”按钮开始下载过程。
void MainWindow::on_btnDefaultPath_clicked()
{//缺省路径  按钮QString  curPath=QDir::currentPath();QDir    dir(curPath);QString  sub="temp";dir.mkdir(sub);ui->editPath->setText(curPath+"/"+sub+"/");
}void MainWindow::on_btnDownload_clicked()
{//开始下载 按钮QString urlSpec = ui->editURL->text().trimmed();if (urlSpec.isEmpty()){QMessageBox::information(this, "错误","请指定需要下载的URL");return;}QUrl newUrl = QUrl::fromUserInput(urlSpec);//URL地址if (!newUrl.isValid()){QMessageBox::information(this, "错误",QString("无效URL: %1 \n 错误信息: %2").arg(urlSpec, newUrl.errorString()));return;}QString tempDir =ui->editPath->text().trimmed();//临时目录if (tempDir.isEmpty()){QMessageBox::information(this, tr("错误"), "请指定保存下载文件的目录");return;}QString fullFileName =tempDir+newUrl.fileName(); //文件名if (QFile::exists(fullFileName))QFile::remove(fullFileName);downloadedFile =new QFile(fullFileName);//创建临时文件if (!downloadedFile->open(QIODevice::WriteOnly)){QMessageBox::information(this, tr("错误"),"临时文件打开错误");return;}ui->btnDownload->setEnabled(false);//发送网络请求,创建网络响应reply = networkManager.get(QNetworkRequest(newUrl));connect(reply, SIGNAL(finished()), this, SLOT(on_finished()));connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead()));connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(on_downloadProgress(qint64,qint64)));
}

代码在读取URL地址后,将其转换为一个QUrl类变量newUrl,并检查其有效性,再检查临时文件目录,创建临时文件downloadedFiIe。

这些准备好之后,用QNetworkAccessManager发布网络请求,请求下载URL地址表示的文件,并创建网络响应,关键代码为:

reply = networkManager.get(QNetworkRequest(newUrl));

        reply为网络响应,将其3个信号与相关的自定义槽函数相关联,实现相应的操作。这3个槽函数的代码如下:

void MainWindow::on_finished()
{//网络响应结束//    QFileInfo fileInfo;if (downloadedFile) {
//        fileInfo.setFile(downloadedFile->fileName());downloadedFile->close();delete downloadedFile;downloadedFile = Q_NULLPTR;}QFileInfo fileInfo;fileInfo.setFile(downloadedFile->fileName());downloadedFile->close();delete downloadedFile;downloadedFile = Q_NULLPTR;reply->deleteLater(); //reply = Q_NULLPTR;if (ui->checkOpen->isChecked())//打开下载的文件QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));ui->btnDownload->setEnabled(true);
}void MainWindow::on_readyRead()
{//读取下载的数据downloadedFile->write(reply->readAll());
}void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{//下载进程ui->progressBar->setMaximum(totalBytes);ui->progressBar->setValue(bytesRead);
}
在缓冲区有新下载的数据等待读取时,会发射readyRead()信号,槽函数on_readyRead()读取下载缓冲区的数据到临时文件。
downloadProgress()是表示网络操作进度的信号,传递bytesRead和totalBytes两个参数,表示己读取字节数和总的字节数;on_downloadProgress()函数将这两个参数用于进度条的显示,可以显示下载进度。
finished()信号在下载结束后发射,槽函数on_finished()的功能是关闭临时文件,删除文件变量和网络响应变量。然后用QDesktopServices::openUrl()函数调用缺省的应用软件打开下载的文件,例如,如果下载的是一个PDF文件,会自动用相关联的PDF阅读器软件打开此文件。

http://www.ppmy.cn/server/121162.html

相关文章

【2024】前端学习笔记8-内外边距-边框-背景

学习笔记 外边距:Margin内边距:Padding边框:Border背景:Background 外边距:Margin 用于控制元素周围的空间,它在元素边框之外创建空白区域,可用于调整元素与相邻元素(包括父元素和兄…

浅谈C#之SynchronizationContext

一、基本介绍 SynchronizationContext是一个抽象类,它提供了一种机制,允许代码与创建它的线程同步。这在UI编程中非常有用,比如在Windows Forms或WPF应用程序中,你可能需要确保某些操作在UI线程上执行,以避免跨线程操作…

Azure OpenAI and token limit

题意:Azure OpenAI 和令牌限制 问题背景: I want to use GPT model to analyze my data. Data is a suite of records (e.g. 1000 records) with 10 or even more properties. I want to say GPT (or other model): 我想使用 GPT 模型来分析我的数据。…

web - JavaScript

JavaScript 1,JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言,而Java语言也是跨平台的、面向对象的语言,只不过Java是编译语言,是需要编译成字节码文件才能运行的;JavaScript是脚本语言,不…

MySQL 数据库课程设计详解与操作示例

标题:MySQL 数据库课程设计详解与操作示例 简介 在数据库课程设计中,MySQL 是一个常用的关系型数据库管理系统 (RDBMS)。它以高效、稳定、易用而闻名,广泛应用于网站开发、数据分析和企业级应用中。本文将带你深入了解如何基于 MySQL 完成数…

【QT基础】创建项目项目代码解释

目录 前言一,使⽤Qt Creator 新建项目1. 新建项目2. 选择项⽬模板3. 选择项⽬路径4. 选择构建系统5. 填写类信息设置界⾯6. 选择语⾔和翻译⽂件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 二,项目代码说明1. main.cpp文件2. Widget.h文件3. Widget.cp…

[性能]高速收发的TCP/MQTT通信

Nagle算法‌是一种TCP/IP协议中的优化算法,旨在减少小数据包的数量,从而减少网络拥塞的可能性。该算法规定,在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后,如果收到确认(ACK)之前&#x…

进击J7:对于ResNeXt-50算法的思考

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 本周任务是自行探索解决问题,通过此次思考过程逐渐将知识层面的学习过渡到能力层面的培养上。 一、任务 📌 **你需要解决的疑问&…