【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_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协议的基础上增加了加密和身份验证等安全功能,提供更为可靠的文件传输。
在这里插入图片描述

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

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

相关文章

CSS对文本的简单修饰

CSS格式&#xff1a; 格式一&#xff1a;在head中的style标签范围内。 < style> 在style内的只写名字不写 &#xff1a; < > 选择器 { 属性的名称 &#xff1a; 样式&#xff1b; 属性的名称&#xff1a;样式&#xff1b; } < style> style中的注释用/* *…

前端如何设置模板参数

1.背景&#xff1a; 最近接到一个需求&#xff0c;在一个类似chatGpt的聊天工具中&#xff0c;要在对话框中设置模板&#xff0c;后端提供了很多模板参数&#xff0c;然后要求将后端返回的特殊字符转成按钮&#xff0c;编辑完成后在相应的位置拼接成字符串。 2.效果&#xff1a…

关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

关于嵌入式开发的一些信息汇总&#xff1a;嵌入式C开发人员、嵌入式系统Linux 1 关于嵌入式 C 开发人员1.1 嵌入式 C 开发人员必须具备的一些基本技能是&#xff1a;1.2 嵌入式C开发的应用案例 2 如何学习用于嵌入式系统的 Linux2.1 如何学习Linux2.1.1 第一步&#xff1a;创建…

openGauss学习笔记-155 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-概述

文章目录 openGauss学习笔记-155 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-概述155.1 概述155.2 注意事项 openGauss学习笔记-155 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-概述 155.1 概述 op…

邮件服务下载安装详细步骤、汉化、配置

Foxmail for Mac 下载地址&#xff1a;Download - hMailServer - Free open source email server for Microsoft Windows 教程地址 hMailServer安装使用教程 - 诸子流 - 博客园 (cnblogs.com) 设置密码为:dzqdb123 设置好端口 添加账号密码 (9条消息) hMailServer 配置DKIM…

IO流学习

IO流:存储和读取数据的解决方案 import java.io.FileOutputStream; import java.io.IOException;public class Test {public static void main(String[] args) throws IOException {//1.创建对象//写出 输入流 OutputStream//本地文件fileFileOutputStream fos new FileOutputS…

TrustGeo代码理解(七)preprocess.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # Load data and IP clusteringimport math import random import pandas as pd import numpy as np import argparse from sklearn import preprocessing from lib.utils import MaxMinScaler …

列表优先于数组

在Java中&#xff0c;列表&#xff08;List&#xff09;通常优于数组&#xff0c;因为列表提供了更灵活的操作和动态调整大小的能力。下面是一个例子&#xff0c;展示了为什么在某些情况下使用列表比数组更好&#xff1a; import java.util.ArrayList; import java.util.List;…

AtCoder ABC周赛2023 12/10 (Sun) D题题解

目录 原题截图&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注&#xff1a; 代码&#xff1a; 原题截图&#xff1a; 题目大意&#xff1a; 给定两个 的矩阵 和 。 你每次可以交换矩阵 的相邻两行中的所有元素或是交换两列中的所有元素。 请问要使 变换至…

python封装执行cmd命令的方法

一、前置说明 在自动化时&#xff0c;经常需要使用命令行工具与系统进行交互&#xff0c;因此可以使用python封装一个执行cmd命令的方法。 二、代码实现 import subprocess import timefrom common.exception import RunCMDError from common.logger import loggerclass Cmd…

使用Matlab实现声音信号处理

利用Matlab软件对声音信号进行读取、放音、存储 先去下载一个声音文件&#xff1b;使用这个代码即可 clear; clc; [y, Fs] audioread(xxx.wav); plot(y); y y(:, 1); spectrogram(y); sound(y, Fs); % player audioplayer(y, Fs);y1 diff(y(:, 1)); subplot(2, 1, 1); pl…

【Spark精讲】Spark五种JOIN策略

目录 三种通用JOIN策略原理 Hash Join 散列连接 原理详解 Sort Merge Join 排序合并连接 Nested Loop 嵌套循环连接 影响JOIN操作的因素 数据集的大小 JOIN的条件 JOIN的类型 Spark中JOIN执行的5种策略 Shuffle Hash Join Broadcast Hash Join Sort Merge Join C…

关于MySQL的bigint问题

MySQL的bigint(8)能存多大数值&#xff1f; MySQL的BIGINT(8)可以存储的数值范围是从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。这是因为BIGINT数据类型在MySQL中使用8字节进行存储&#xff0c;每个字节有8位&#xff0c;所以总共可以表示2^64个不同的整数。 …

亚太地区是Aleo下一个重点市场!ZK技术将重塑区块链世界!

4 年&#xff0c;3 亿美元&#xff0c;基于 ZK 的隐私公链&#xff0c;是 Aleo 最直观的三个标签。区块链的致富效应&#xff0c;已经让传统金融蠢蠢欲动&#xff0c;想参与Aleo私募和头矿的朋友请于文末添加微信。 对于Aleo副总裁兼业务发展主管Joanna Zeng来说&#xff0c;近…

[NAND Flash 4.1] Flash(闪存)存储器底层原理 | 闪存存储器重要参数

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 5000 字。 从底层物理原理上了解 Nand Flash。 1. 存储器诞生&#xff1a; 现代计算机使用存储器来存储数据&#xff0c;其…

【FPGA】Verilog:解码器 | 实现 2-4 解码器

实践内容&#xff1a;解释 2 至 4 解码器的结果和仿真过程 (包括真值表创建和 k 映射、AND 门&#xff09;。 0x00 解码器&#xff08;Decoder&#xff09; 解码器是一种根据输入信号从多个输出 bit 中只选择一个的设备。 例如&#xff0c;如果有一个解码器接收一个 2 位二进…

章鱼网络 Community Call #16|逐步过渡到回购和销毁模型

香港时间2023年12月8日12点&#xff0c;章鱼网络举行第16期 Community Call。 自2023年4月份提出 Octopus 2.0 计划以来&#xff0c;我们一直致力于将这一愿景变为现实。感谢核心团队和章鱼社区的共同努力&#xff0c;我们决定于 12月17日正式推出 Octopus 2.0。 Community Ca…

node.js mongoose Aggregate介绍

目录 简述 Aggregate的原型方法 aggregate进行操作 简述 在 Mongoose 中&#xff0c;Aggregate 是用于执行 MongoDB 聚合操作的类。MongoDB 聚合操作是一种强大的数据处理工具&#xff0c;可以用于对集合中的文档进行变换和计算 通过Model.aggregate创建一个aggregate(Agg…

python批量实现labelImg标注的 xml格式数据转换成 txt格式保存

# -*- coding: utf-8 -*- import os import xml.etree.ElementTree as ETdirpath ********** # 原来存放xml文件的目录 newdir ********* # 修改label后形成的txt目录if not os.path.exists(newdir):os.makedirs(newdir)dict_info {sf6: 0, thermometer: 1,…

jmeter 如何循环使用接口返回的多值?

有同学在用jmeter做接口测试的时候&#xff0c;经常会遇到这样一种情况&#xff1a; 就是一个接口请求返回了多个值&#xff0c;然后下一个接口想循环使用前一个接口的返回值。 这种要怎么做呢&#xff1f; 有一定基础的人&#xff0c;可能第一反应就是先提取前一个接口返回…