【Qt开发流程】之网络编程:`HTTP`和`FTP`的高级网络操作

概述

Qt Network模块提供了可以编写TCP/IP客户端和服务器的类。它提供了较低层次的类,如QTcpSocketQTcpServerQUdpSocket,来代表低层次网络概念,以及高级层次类,如QNetworkRequestQNetworkReplyQNetworkAccessManager,它们使用通用协议执行网络操作。它还提供了诸如QNetworkConfigurationQNetworkConfigurationManagerQNetworkSession等实现承载管理的类。

HTTPFTP的高级网络操作

网络访问API是用于执行常见网络操作的类的集合。API为所使用的特定操作和协议(例如,通过HTTP获取和发布数据)提供了一个抽象层,开发者只需要使用其提供的类,函数或者信号即可完成操作,而不需要知道底层是如何实现的。
网络请求由QNetworkRequest类表示,它还充当与请求相关的信息的通用容器,例如任何标头信息和所使用的加密。构造请求对象时指定的URL决定了请求所使用的协议。目前支持HTTPFTP本地文件url进行上传和下载。
网络操作的协调是由QNetworkAccessManager类执行的。一旦创建了请求,就使用这个类来分派请求并发出信号以报告其进度。管理器还协调使用cookie在客户机上存储数据、身份验证请求和代理的使用。
对网络请求的应答由QNetworkReply类表示;这些是由QNetworkAccessManager在分派请求时创建的。QNetworkReply提供的信号可用于单独监视每个应答,或者开发人员可以选择使用管理器的信号来代替此目的,并放弃对应答的引用。由于QNetworkReplyQIODevice的子类,应答可以同步或异步处理;即,作为阻塞或非阻塞操作。
每个应用程序或库都可以创建一个或多个QNetworkAccessManager实例来处理网络通信。

HTTP

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(例如HTML)的协议。它是一个客户端-服务器协议,在Web浏览器与Web服务器之间进行通信。

HTTP的基本工作原理是客户端发送请求给服务器,服务器根据请求的内容进行处理,并发送响应给客户端。请求和响应的内容都是由一系列的报文组成,包括请求行、请求头部和请求主体(在请求中),以及状态行、响应头部和响应主体(在响应中)。

HTTP的通信是无状态的,这意味着每个请求都是独立的,服务器不会在不同请求之间保留任何状态信息。为了解决这个问题,HTTP引入了一些机制,如CookieSession,以便在不同请求之间共享状态信息。

HTTP有多个版本,最常用的是HTTP/1.1。它支持持久连接、传输压缩、分块传输编码等功能,可以提高传输效率。最新的版本是HTTP/2,它引入了二进制协议、多路复用等新特性。

除了传输超媒体文档之外,HTTP还可以用于其他用途,例如API调用、文件上传和下载等。
在这里插入图片描述
以下是一个通过网络访问接口实现HTTP通信的示例:
.pro中添加:

QT       +=  network

在头文件中,创建QNetworkAccessManager及声明replyFinished(QNetworkReply* reply)槽。

#include <QMainWindow>#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void replyFinished(QNetworkReply* reply);private:Ui::MainWindow *ui;QNetworkAccessManager* m_pAceessManager;
};

在源文件中进行初始化及实现槽:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_pAceessManager = new QNetworkAccessManager(this);// 当get完成时,进入replyFinished函数connect(m_pAceessManager, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished);m_pAceessManager->get(QNetworkRequest(QUrl("http://httpbin.org/")));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::replyFinished(QNetworkReply *reply)
{ui->textBrowser->setText(QString(reply->readAll()));reply->deleteLater();
}

执行后,显示如下:
在这里插入图片描述
除了get()函数,管理器还提供了发送http post请求的post()函数,http put请求的put()函数,http delete请求的deleteResource()函数。

实现文件下载及显示进度示例

  1. 首先是UI
    在这里插入图片描述
  2. 在头文件中添加以下槽函数
	// 连接QNetworkReply的finished信号void slot_httpFinished();// 连接QNetworkReply的readyRead信号void slot_httpReadyRead();// 连接QNetworkReply的updateDataReadProgress信号void slot_updataProgress(qint64, qint64);// 下载按钮槽函数void on_btn_download_clicked();
  1. 在头文件中添加以下私有函数及成员变量
private:// 开始请求void startRequest(const QUrl& url);QNetworkAccessManager* m_pAceessManager; // 网络访问管理QNetworkReply*  m_pReply; // 回复QFile*  m_pFile; // 文件指针QUrl m_url; // url
  1. 在构造里初始化
    m_pAceessManager = new QNetworkAccessManager(this);ui->progressBar->setValue(0);
  1. 实现上述槽函数和私有成员函数

void MainWindow::startRequest(const QUrl &url)
{m_pReply = m_pAceessManager->get(QNetworkRequest(url));connect(m_pReply, &QNetworkReply::readyRead, this, &MainWindow::slot_httpReadyRead);connect(m_pReply, &QNetworkReply::downloadProgress, this, &MainWindow::slot_updataProgress);connect(m_pReply, &QNetworkReply::finished, this, &MainWindow::slot_httpFinished);
}void MainWindow::on_btn_download_clicked()
{m_url = ui->lineEdit->text();QFileInfo fileInfo(m_url.path());QString fileName(fileInfo.fileName());if(fileName.isEmpty()){fileName = "helloworld.html";}m_pFile = new QFile(fileName);if(m_pFile->open(QIODevice::WriteOnly)){startRequest(m_url);}
}void MainWindow::slot_httpFinished()
{if(m_pFile){m_pFile->close();m_pFile->deleteLater();m_pFile = nullptr;}m_pReply->deleteLater();m_pReply = nullptr;
}void MainWindow::slot_httpReadyRead()
{if(m_pFile){m_pFile->write(m_pReply->readAll());}
}void MainWindow::slot_updataProgress(qint64 readSize, qint64 totalBytes)
{ui->progressBar->setMaximum(totalBytes);ui->progressBar->setValue(readSize);
}

运行程序,点击下载
在这里插入图片描述
显示如下:
在这里插入图片描述

FTP

FTP协议(File Transfer Protocol,文件传输协议)是用于在计算机网络中进行文件传输的标准协议之一。它允许用户通过TCP/IP网络将文件从一个计算机传输到另一个计算机。FTP协议包括两个部分:控制连接和数据传输连接。

控制连接用于进行命令和响应之间的通信,包括用户身份验证、文件目录浏览和文件操作等。控制连接使用默认的端口号21。

数据传输连接用于实际的文件传输。在FTP协议中,有两种不同的数据传输模式:主动模式和被动模式。在主动模式下,服务器从端口20上发起数据连接,而客户端则在高端口上等待连接。在被动模式下,服务器在高端口上等待连接,而客户端则从端口20上发起数据连接。

FTP协议支持大多数操作系统,包括Windows、Linux和macOS。它提供了许多功能,例如文件上传和下载、文件重命名、文件删除等。此外,FTP协议还支持匿名登录,允许用户使用匿名身份访问公共FTP服务器上的文件。

然而,由于FTP协议的安全性较差,易受到数据泄露和恶意攻击的威胁,因此通常建议使用更加安全的协议,如SFTP(SSH File Transfer Protocol)或FTPS(FTP over SSL/TLS)。这些协议在FTP协议的基础上增加了加密和身份验证等安全功能,提供更为可靠的文件传输。
在这里插入图片描述

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

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

相关文章

什么是供应链安全及其工作原理?

6000公里长的丝绸之路将丝绸、谷物和其他货物从中国运送到帕尔米拉。尽管蒙古治下的和平保护丝绸之路免受海盗、强盗和内部盗窃的侵害&#xff0c;但商人仍然装备精良&#xff0c;并依赖于大型商队旅行和战略性放置的小型堡垒所提供的安全。 为什么供应链安全很重要&#xff1…

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 数据库 文章目录 前言合并区间问题&#x1f4d5;现实应用大致思路代码实现代码讲解 最长不连续子序列&a…

机器学习支持向量机(SVM)

svm与logstic异同 svm支持向量机&#xff0c;因其英文名为support vector machine&#xff0c;故一般简称SVM&#xff0c;通俗来讲&#xff0c;它是一种二类分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的线性分类器&#xff0c;其学习策略便是间隔最大化&#x…

【深度学习】机器学习概述(二)优化算法之梯度下降法(批量BGD、随机SGD、小批量)

​ 文章目录 一、基本概念二、机器学习的三要素1. 模型a. 线性模型b. 非线性模型 2. 学习准则a. 损失函数b. 风险最小化准则 3. 优化机器学习问题转化成为一个最优化问题a. 参数与超参数b. 梯度下降法梯度下降法的迭代公式具体的参数更新公式学习率的选择 c. 随机梯度下降批量…

DevEco Studio 项目鸿蒙(HarmonyOS)资源引用(自定统和系统)

DevEco Studio 项目鸿蒙&#xff08;HarmonyOS&#xff09;资源引用&#xff08;自定统和系统&#xff09; 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、资源访问 HarmonyOS应用资源分为两类&#xff0c;一类是应用资源&…

调用第三方http接口 hutool工具类

1、引入依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.0.M2</version> </dependency>2、请求组装 String params"<BSXml>" " <MsgHeader>&…

【数组Array】力扣-304 二维区域和检索 - 矩阵不可变

目录 题目描述 解题过程 labuladong题解 题目描述 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&#xf…

逻辑回归的介绍和应用

逻辑回归的介绍 逻辑回归&#xff08;Logistic regression&#xff0c;简称LR&#xff09;虽然其中带有"回归"两个字&#xff0c;但逻辑回归其实是一个分类模型&#xff0c;并且广泛应用于各个领域之中。虽然现在深度学习相对于这些传统方法更为火热&#xff0c;但实…

基于YOLOv8深度学习的高精度车辆行人检测与计数系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

YOLOv8 图片目标计数 | 特定目标进行计数

全类别计数特定类别计数如何使用 YOLOv8 进行对象计数 有很多同学留言说想学 YOLOv8 目标计数。那么今天这篇博客,我将教大家如何使用 YOLOv8 进行对象计数。YOLOv8 是一种非常强大的对象检测模型,它可以识别图像中的各种对象。我们将学习如何利用这个模型对特定对象进行计数…

Unity中URP Shader 的 SRP Batcher

文章目录 前言一、SRP Batcher是什么二、SRP Batcher的使用条件1、可编程渲染管线2、我们用URP作为例子3、URP 设置中 Use SRP Batcher开启4、使 SRP Batcher 代码路径能够渲染对象5、使着色器与 SRP Batcher 兼容&#xff1a; 三、不同合批之间的区别BuildIn Render Pipeline下…

IDEA新建jdk8 spring boot项目

今天新建spring boot项目发现JDK版本最低可选17。 但是目前用的最多的还是JDK8啊。 解决办法 Server URL中设置&#xff1a; https://start.aliyun.com/设置完成后&#xff0c;又可以愉快的用jdk8创建项目了。 参考 https://blog.csdn.net/imbzz/article/details/13469117…