概述
Qt Network
模块提供了可以编写TCP/IP
客户端和服务器的类。它提供了较低层次的类,如QTcpSocket
、QTcpServer
和QUdpSocket
,来代表低层次网络概念,以及高级层次类,如QNetworkRequest
、QNetworkReply
和QNetworkAccessManager
,它们使用通用协议执行网络操作。它还提供了诸如QNetworkConfiguration
、QNetworkConfigurationManager
和QNetworkSession
等实现承载管理的类。
HTTP
和FTP
的高级网络操作
网络访问API
是用于执行常见网络操作的类的集合。API
为所使用的特定操作和协议(例如,通过HTTP
获取和发布数据)提供了一个抽象层,开发者只需要使用其提供的类,函数或者信号即可完成操作,而不需要知道底层是如何实现的。
网络请求由QNetworkRequest
类表示,它还充当与请求相关的信息的通用容器,例如任何标头信息和所使用的加密。构造请求对象时指定的URL
决定了请求所使用的协议。目前支持HTTP
、FTP
和本地文件url
进行上传和下载。
网络操作的协调是由QNetworkAccessManager
类执行的。一旦创建了请求,就使用这个类来分派请求并发出信号以报告其进度。管理器还协调使用cookie
在客户机上存储数据、身份验证请求和代理的使用。
对网络请求的应答由QNetworkReply
类表示;这些是由QNetworkAccessManager
在分派请求时创建的。QNetworkReply
提供的信号可用于单独监视每个应答,或者开发人员可以选择使用管理器的信号来代替此目的,并放弃对应答的引用。由于QNetworkReply
是QIODevice
的子类,应答可以同步或异步处理;即,作为阻塞或非阻塞操作。
每个应用程序或库都可以创建一个或多个QNetworkAccessManager
实例来处理网络通信。
HTTP
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(例如HTML)的协议。它是一个客户端-服务器协议,在Web浏览器与Web服务器之间进行通信。
HTTP的基本工作原理是客户端发送请求给服务器,服务器根据请求的内容进行处理,并发送响应给客户端。请求和响应的内容都是由一系列的报文组成,包括请求行、请求头部和请求主体(在请求中),以及状态行、响应头部和响应主体(在响应中)。
HTTP的通信是无状态的,这意味着每个请求都是独立的,服务器不会在不同请求之间保留任何状态信息。为了解决这个问题,HTTP引入了一些机制,如Cookie
和Session
,以便在不同请求之间共享状态信息。
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()
函数。
实现文件下载及显示进度示例
- 首先是UI
- 在头文件中添加以下槽函数
// 连接QNetworkReply的finished信号
void slot_httpFinished();
// 连接QNetworkReply的readyRead信号
void slot_httpReadyRead();
// 连接QNetworkReply的updateDataReadProgress信号
void slot_updataProgress(qint64, qint64);
// 下载按钮槽函数
void on_btn_download_clicked();
- 在头文件中添加以下私有函数及成员变量
private:
// 开始请求
void startRequest(const QUrl& url);
QNetworkAccessManager* m_pAceessManager; // 网络访问管理
QNetworkReply* m_pReply; // 回复
QFile* m_pFile; // 文件指针
QUrl m_url; // url
- 在构造里初始化
m_pAceessManager = new QNetworkAccessManager(this);
ui->progressBar->setValue(0);
- 实现上述槽函数和私有成员函数
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协议的基础上增加了加密和身份验证等安全功能,提供更为可靠的文件传输。