Qt中的Qt Network模块用来编写基于TCP/IP的网络程序。
低层次的:QTcpSocket、QTcpServer、QUdpSocket等。
高层次的:QNetworkRequest、QNetworkReply和QNetworkAccessManager
负载管理:QNetworkConfiguration、QNetworkConfigurationManager和QNetworkSession
使用方法:在pro文件中添加如下一行:
QT += network
1. 网络访问接口
QNetworkRequest:网络请求,创建请求对象时指定的URL决定了请求使用的协议,目前支持HTTP、FTP和本地文件URL的上传和下载。
QNetworkAccessManager:协调网络操作,可以调度创建好的请求,并发射信号来报告进度。该类还可以协调cookies的使用、身份验证请求和代理的使用等。
QNetworkReply:网络请求应答,他会在请求调度完成时由QNetworkAccessManager创建。QNetworkReply提供的信号可以用来单独监视每一个应答,也可以使用QNetworkAccessManager的信号来实现,这样就可以丢弃应答对象的引用。因为QNetworkReply是QIODevice的子类,应答可以使用同步或异步的方式来处理,比如作为阻塞或者非阻塞操作。
1.1 HTTP
HyperText Transfer Protocol 超文本传输协议。是一个客户端和服务端之间进行请求和应答的标准。通常由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接,服务器端就会向客户端发回一个应答。下面先来看一个通过网络访问接口实现HTTP通信的例子:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class QNetworkReply;
class QNetworkAccessManager;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;
private slots:
void replyFinished(QNetworkReply *);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QFile>
#include <QCoreApplication>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager = new QNetworkAccessManager(this);
connect(manager,&QNetworkAccessManager::finished,this,&MainWindow::replyFinished);
manager->get(QNetworkRequest(QUrl("http://www.baidu.com/")));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::replyFinished(QNetworkReply *reply)
{
QString all = reply->readAll();
ui->textBrowser->setText(all);
QString fileName = QCoreApplication::applicationDirPath() + "/output.txt";
QFile file(fileName);
if (file.open(QIODevice::ReadWrite)) {
file.write(all.toLatin1());
}
file.close();
reply->deleteLater();
}
这里先创建了一个QNetworkAccessManager类的实例,它用来发送网络请求和接收应答。然后关联了finished()信号和自定义的槽,每当网络应答结束时都会发射这个信号。最后使用了get()函数来发送一个网络请求,网络请求使用QNetworkRequest类表示,get()函数返回一个QNetworkReply对象。除了get()函数,管理器还提供了发送HTTP POST请求的post()函数、HTTP PUT请求的put函数以及HTTP DELETE请求的deleteResource()函数。
因为QNetworkReply继承自QIODevice类,所以可以像操作一般的I/O设备一样来操作该类。这里使用了readAll()函数来读取所有的数据应答,完成数据的读取后需要使用deleteLater()来删除reply对象。