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

news2024/11/16 23:43:17

概述

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_OBJECT

public:
    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.coloradmin.cn/o/1314439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四十七、Redis分片集群

目录 一、分片集群结构 二、散列插槽 1、Redis如何判断某个key应该在哪个实例&#xff1f; 2、如何将同一类数据固定的保存在同一个Redis实例&#xff1f; 三、集群伸缩 四、故障转移 1、当集群中有一个master宕机时 &#xff08;1&#xff09;自动转移 &#xff08;2&…

Go delve调试工具的简单应用

Delve是个啥 Delve is a debugger for the Go programming language. The goal of the project is to provide a simple, full featured debugging tool for Go. Delve should be easy to invoke and easy to use. Chances are if you’re using a debugger, things aren’t go…

基于单片机的智能导盲杖设计 (论文+源码)

1. 系统设计 应用STC89C52单片机微处理器进行研究一种智能手杖系统&#xff0c;需要同时实现超声波自动测距、语音自动报警、距离自动显示、电机震动报警、LED指示灯灯光明灭自动提醒等多种功能&#xff0c;在手机通信提醒模式下手机用户可拨打固定手机电话信号实现手机通信提…

Helplook VS Salesforce:哪个知识库更好?

对于组织来说&#xff0c;选择一个合适的平台来管理在线知识库可能是一个具有挑战性的任务。而Salesforce的知识管理功能可以帮助组织更好地管理和分享他们的知识&#xff0c;从而更好地为客户提供服务。这是一种将知识管理集成到CRM平台中的方法&#xff0c;可以简化知识共享和…

IS-IS原理与配置3

IS-IS原理与配置 • IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP &#xff08;ConnectionL…

【深度学习目标检测】六、基于深度学习的路标识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

uni-app微信小程序隐藏左上角返回按钮

官方文档链接&#xff1a;uni.setNavigationBarTitle(OBJECT) | uni-app官网 (dcloud.net.cn) 首先要明确的是页面间的跳转方式有几种、每一种默认的作用是什么。 uniapp五种跳转方式 第一&#xff1a;wx.navigatorTo 【新页面打开&#xff0c;默认会有返回按钮】第二&#x…

ClickHouse Kafka 引擎教程

如果您刚开始并且第一次设置 Kafka 和 ClickHouse 需要帮助怎么办&#xff1f;这篇文章也许会提供下帮助。 我们将通过一个端到端示例&#xff0c;使用 Kafka 引擎将数据从 Kafka 主题加载到 ClickHouse 表中。我们还将展示如何重置偏移量和重新加载数据&#xff0c;以及如何更…

「构」向云端 - 我与 2023 亚马逊云科技 re:Invent 大会

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 2023年亚马逊AWS re:Invent大会宣布一项Amazon Q的创新项目&#x…

微信小程序---使用npm包安装Vant组件库

在小程序项目中&#xff0c;安装Vant 组件库主要分为如下3步: 注意&#xff1a;如果你的文件中不存在pakage.json&#xff0c;请初始化一下包管理器 npm init -y 1.通过 npm 安装(建议指定版本为1.3.3&#xff09; 通过npm npm i vant/weapp1.3.3 -S --production 通过y…

十六、YARN和MapReduce配置

1、部署前提 &#xff08;1&#xff09;配置前提 已经配置好Hadoop集群。 配置内容&#xff1a; &#xff08;2&#xff09;部署说明 &#xff08;3&#xff09;集群规划 2、修改配置文件 MapReduce &#xff08;1&#xff09;修改mapred-env.sh配置文件 export JAVA_HOM…

基于BWA,Bowtie2,samtools、checkm等工具计算宏基因组学序列分析中Contigs与Genes在样品中的丰度,多种计算方式和脚本对比

计算contigs和genes相对丰度可以提供有关微生物群落结构和功能的信息。以下是计算这两个指标的意义&#xff1a; 1. Contigs的相对丰度&#xff1a;contigs是利用基因组测序技术获得的碎片序列&#xff0c;通过计算contigs的相对丰度可以了解微生物群落中不同菌种的相对丰度。…

2023.12.14每日一题

2023.12.14 题目来源我的题解二维前缀和二维差分 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2132 我的题解 哈哈哈哈&#xff01;&#xff01;&#xff01;我不会&#xff0c;借鉴一下官方题解 二维前缀和二维差分 求二维前缀和&#xff0c;用于判断快速判断右下角…

GPT-4V被超越?SEED-Bench多模态大模型测评基准更新

&#x1f4d6; 技术报告 SEED-Bench-1&#xff1a;https://arxiv.org/abs/2307.16125 SEED-Bench-2&#xff1a;https://arxiv.org/abs/2311.17092 &#x1f917; 测评数据 SEED-Bench-1&#xff1a;https://huggingface.co/datasets/AILab-CVC/SEED-Bench SEED-Bench-2&…

Tomcat-安装部署(源码包安装)

一、简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个WEB应用程序的托管平台…

【期末复习向】长江后浪推前浪之ChatGPT概述

参考文章&#xff1a;GPT系列模型技术路径演进-CSDN博客 这篇文章讲了之前称霸NLP领域的预训练模型bert&#xff0c;它是基于预训练理念&#xff0c;采用完形填空和下一句预测任务2个预训练任务完成特征的提取。当时很多的特定领域的NLP任务&#xff08;如情感分类&#xff0c…

jenkins-Generic Webhook Trigger指定分支构建

文章目录 1 需求分析1.1 关键词 : 2、webhooks 是什么&#xff1f;3、配置步骤3.1 github 里需要的仓库配置&#xff1a;3.2 jenkins 的主要配置3.3 option filter配置用于匹配目标分支 实现指定分支构建 1 需求分析 一个项目一般会开多个分支进行开发&#xff0c;测试&#x…

Redis设计与实现之跳跃表

目录 一、跳跃表 1、跳跃表的实现 2、跳跃表的应用 3、跳跃表的时间复杂度是什么&#xff1f; 二、跳跃表有哪些应用场景&#xff1f; 三、跳跃表和其他数据结构&#xff08;如数组、链表等&#xff09;相比有什么优点和缺点&#xff1f; 四、Redis的跳跃表支持并发操作吗…

使用React实现随机颜色选择器,JS如何生成随机颜色

背景 在标签功能中&#xff0c;由于有「背景色」属性&#xff0c;每次新增标签时都为选择哪种颜色犯难。因此&#xff0c;我们思考如何通过JS代码生成随机颜色&#xff0c;提取一个通用的随机颜色生成工具&#xff0c;并基于React框架封装随机颜色选择器组件。 实际效果 原理…

智能插座是什么

智能插座 电工电气百科 文章目录 智能插座前言一、智能插座是什么二、智能插座的类别三、智能插座的原理总结 前言 智能插座的应用广泛&#xff0c;可以用于智能家居系统中的电器控制&#xff0c;也可以应用在办公室、商业场所和工业控制中&#xff0c;方便快捷地实现电器的远…