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

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值