歡迎轉載,請注明出處:https://blog.csdn.net/qq_39453936?spm=1010.2135.3001.5343
原文鏈接: https://blog.csdn.net/qq_39453936/article/details/121304236
QtNetwork
- 概述
- Qt網路編程相關類
- 高級網路操作 HTTP和FTP
- TCP編程QTcpSocket/QTcpServer
- UDP編程QUdpSocket
- QHostInfo決議主機名
概述
To include the definitions of the module’s classes, use the following directive:
#include <QtNetwork>
To link against the module, add this line to your qmake .pro file:
QT += network
Qt網路模塊提供了允許您撰寫TCP/IP客戶端和服務器的類,提供了如下:
- 低級網路操作:QTcpSocket/QTcpServer/QUdpSocket
- 高級網路操作:QNetworkRequest/QNetworkReply/QNetworkAccessManager
還提供實作承載管理的類,如:
QNetworkConfiguration、QNetworkConfigurationManager和QNetworkSession,
Qt網路編程相關類
| 類名 | 作用 |
|---|---|
| QAbstractNetworkCache | The interface for cache implementations |
| QNetworkCacheMetaData | Cache information |
| QHstsPolicy | Specifies that a host supports HTTP Strict Transport Security policy (HSTS) |
| QHttpMultiPart | Resembles a MIME multipart message to be sent over HTTP |
| QHttpPart | Holds a body part to be used inside a HTTP multipart MIME message |
| QNetworkAccessManager | Allows the application to send network requests and receive replies |
| QNetworkCookie | Holds one network cookie |
| QNetworkCookieJar | Implements a simple jar of QNetworkCookie objects |
| QNetworkDiskCache | Very basic disk cache |
| QNetworkReply | Contains the data and headers for a request sent with QNetworkAccessManager |
| QNetworkRequest | Holds a request to be sent with QNetworkAccessManager |
| QNetworkConfigurationManager | Manages the network configurations provided by the system |
| QNetworkConfiguration | Abstraction of one or more access point configurations |
| QNetworkSession | Control over the system’s access points and enables session management for cases when multiple clients access the same access point |
| QHostAddress | IP address |
| QNetworkDatagram | The data and metadata of a UDP datagram |
| QNetworkAddressEntry | Stores one IP address supported by a network interface, along with its associated netmask and broadcast address |
| QNetworkInterface | Listing of the host’s IP addresses and network interfaces |
| QAbstractSocket | The base functionality common to all socket types |
| QLocalServer | Local socket based server |
| QLocalSocket | Local socket |
| QSctpServer | SCTP-based server |
| QSctpSocket | SCTP socket |
| QTcpServer | TCP-based server |
| QTcpSocket | TCP socket |
| QUdpSocket | UDP socket |
| QDtls | This class provides encryption for UDP sockets |
| QDtlsClientVerifier | This class implements server-side DTLS cookie generation and verification |
| QDtlsClientVerifier::GeneratorParameters | This class defines parameters for DTLS cookie generator |
| QOcspResponse | This class represents Online Certificate Status Protocol response |
| QSslCertificate | Convenient API for an X509 certificate |
| QSslCertificateExtension | API for accessing the extensions of an X509 certificate |
| QSslCipher | Represents an SSL cryptographic cipher |
| QSslConfiguration | Holds the configuration and state of an SSL connection |
| QSslDiffieHellmanParameters | Interface for Diffie-Hellman parameters for servers |
| QSslEllipticCurve | Represents an elliptic curve for use by elliptic-curve cipher algorithms |
| QSslError | SSL error |
| QSslKey | Interface for private and public keys |
| QSslPreSharedKeyAuthenticator | Authentication data for pre shared keys (PSK) ciphersuites |
| QSslSocket | SSL encrypted socket for both clients and servers |
| QAuthenticator | Authentication object |
| QDnsDomainNameRecord | Stores information about a domain name record |
| QDnsHostAddressRecord | Stores information about a host address record |
| QDnsLookup | Represents a DNS lookup |
| QDnsMailExchangeRecord | Stores information about a DNS MX record |
| QDnsServiceRecord | Stores information about a DNS SRV record |
| QDnsTextRecord | Stores information about a DNS TXT record |
| QHostInfo | Static functions for host name lookups |
| QNetworkProxy | Network layer proxy |
| QNetworkProxyFactory | Fine-grained proxy selection |
| QNetworkProxyQuery | Used to query the proxy settings for a socket |
高級網路操作 HTTP和FTP
Qt網路編程提供了大量的API用于網路操作,API為特定的操作和協議提供了一個抽象層(如通過HTTP收發資料),并且僅公開一般或高級概念的類、函式和信號,
-
QNetworkRequest 網路請求:,充當與請求相關聯的資訊的通用容器,例如請求頭資訊、加密等,構造請求物件時指定的URL確定用于請求的協議,目前,支持HTTP、FTP和本地檔案URL上傳和下載,
-
QNetworkAccessManager操作管理:請求創建后,管理類會分發請求,然后對外發送信號標識請求進度,還可使用cookies在客戶端存盤資料、請求認證、代理使用,
-
QNetworkReply請求回應;該物件由QNetworkAccessManager在發送請求時創建,QNetworkReply提供的信號可以用于單獨監控每個請求回應,或者開發人員可以選擇使用管理器QNetworkAccessManager的信號來代替,并放棄對請求回應的參考,由于QNetworkReply是QIODevice的一個子類,因此回應可以被同步或異步的處理(阻塞或非阻塞),
每個應用程式或庫都可以創建一個或多個QNetworkAccessManager實體來處理網路通信,
TCP編程QTcpSocket/QTcpServer
TCP(傳輸控制協議)是大多數Internet協議(包括HTTP和FTP)用于資料傳輸的低級網路協議,它是一種可靠的、面向流的、面向連接的傳輸協議,它特別適合于資料的連續傳輸:

QTcpSocket類為TCP提供了一個介面,您可以使用QTcpSocket實作標準網路協議,如POP3、SMTP和NNTP,以及自定義協議,
在開始任何資料傳輸之前,必須建立到遠程主機和埠的TCP連接,建立連接后,對等方的IP地址和埠可通過QTcpSocket::peerAddress()和QTcpSocket::peerPort()使用,在任何時候,對等方都可以關閉連接,然后資料傳輸將立即停止,
QTcpSocket異步作業,并發出信號報告狀態更改和錯誤,就像QNetworkAccessManager一樣,它依賴事件回圈來檢測傳入資料并自動重繪輸出資料,您可以使用QTcpSocket::write()將資料寫入套接字,并使用QTcpSocket::read()讀取資料,QTcpSocket表示兩個獨立的資料流:一個用于讀取,一個用于寫入,
由于QTcpSocket繼承了QIODevice,因此可以將其與QTextStream和QDataStream一起使用,從QTcpSocket讀取資料時,必須事先呼叫QTcpSocket::bytesAvailable()確保有足夠的資料可用,
如果需要處理傳入的TCP連接(例如,在服務器應用程式中),請使用QTcpServer類,呼叫QTcpServer::listen()來設定服務器,并連接到QTcpServer::newConnection()信號,該信號對于每個連接的客戶端都會發出一次,在插槽中,呼叫QTcpServer::nextPendingConnection()以接受連接,并使用回傳的QTcpSocket與客戶端通信,
雖然它的大部分功能是異步作業的,但也可以同步使用QTcpSocket(即阻塞),要獲得阻塞行為,請呼叫qtcsocket的waitFor…()函式;這些執行緒將掛起呼叫執行緒,直到發出信號為止,例如,在呼叫非阻塞QTcpSocket::connectToHost()函式后,呼叫QTcpSocket::waitForConnected()來阻塞執行緒,直到發出connected()信號,
同步套接字通常導致代碼具有更簡單的控制流,waitFor…()方法的主要缺點是,當waitFor…()函式阻塞時,不會處理事件,如果在GUI執行緒中使用,這可能會凍結應用程式的用戶界面,因此,我們建議您僅在非GUI執行緒中使用同步套接字,同步使用時,QTcpSocket不需要事件回圈,
如何使用QTcpSocket和QTcpServer編寫TCP客戶端服務器應用程式示例:
Fortune Client
Fortune Server
如何在單獨的執行緒中使用同步QTcpSocket(不使用事件回圈)的示例:
Blocking Fortune Client
多執行緒TCP服務器,每個活動客戶端有一個執行緒的實體:
Threaded Fortune Server
UDP編程QUdpSocket
UDP(用戶資料報協議)是一種輕量級、不可靠、面向資料報、無連接的協議,當可靠性不重要時,可以使用它,例如,報告時間的服務器可以選擇UDP,如果一天中某個時間的資料報丟失,客戶端只需發出另一個請求即可,

QUdpSocket類允許您發送和接收UDP資料報,它繼承QAbstractSocket,因此它共享QTcpSocket的大部分介面,主要區別在于,QUdpSocket將資料傳輸為資料報,而不是連續的資料流,簡言之,資料報是大小有限(通常小于512位元組)的資料包,除了傳輸的資料外,還包含資料報發送方和接收方的IP地址和埠,
QUdpSocket支持IPv4廣播,廣播通常用于實作網路發現協議,例如查找網路上哪個主機的可用硬碟空間最多,一臺主機向所有其他主機接收的網路廣播資料報,每個接收到請求的主機都會向發送方發回一個回復,其中包含其當前可用磁盤空間量,發端人等待收到來自所有主機的回復,然后可以選擇具有最多可用空間的服務器來存盤資料,要廣播資料報,只需將其發送到特殊地址QHostAddress::broadcast(255.255.255.255)或本地網路的廣播地址,
QUdpSocket::bind()準備接受傳入資料報的套接字,就像TCP服務器的QTcpServer::listen()一樣,每當一個或多個資料報到達時,QUdpSocket就會發出readyRead()信號,呼叫QUdpSocket::readDatagram()讀取資料報,
如何使用Qt撰寫UDP發送方和UDP接收方的實體:
Broadcast Sender
Broadcast Receiver
QUdpSocket還支持多播,如何使用寫UDP多播客戶端的示例,
Multicast Sender
Multicast Receiver
QHostInfo決議主機名
在建立網路連接之前,QTcpSocket和QUdpSocket執行名稱查找,將要連接的主機名轉換為IP地址,此操作通常使用DNS(域名服務)協議執行,提供如下兩種方式:
- QHostInfo::lookupHost() 異步查找,通過信號槽機制,查找在單獨的執行緒中實作,
- QHostInfo::forName() 同步查找,在呼叫者所在執行緒實行查找,在GUI執行緒中呼叫此函式可能會導致用戶界面凍結,而函式在執行查找時會阻塞,
代碼示例如下:
頭檔案
//主機資訊測驗驗證
#include <QObject>
#include <QHostInfo>
class HostInfoDemo : public QObject
{
Q_OBJECT
private slots:
void lookUp(const QHostInfo& oHostInfo);
};
void testHostInfoDemo();
源檔案
#include "HostInfoDemo.h"
#include <QDebug>
void HostInfoDemo::lookUp(const QHostInfo& oHostInfo)
{
if (oHostInfo.error() != QHostInfo::NoError)
{
qDebug() << "failed: " << oHostInfo.errorString();
return;
}
const auto addresses = oHostInfo.addresses();
for (const QHostAddress &oAddress : addresses)
{
qDebug() << "asynchronous Found address: " << oAddress.toString();
}
}
void testHostInfoDemo()
{
//異步方式
qDebug() << QStringLiteral("異步方式...");
HostInfoDemo* pDemo = new HostInfoDemo;
QHostInfo::lookupHost("www.kde.org", pDemo, SLOT(lookUp(QHostInfo)));
//同步方式
qDebug() << QStringLiteral("同步方式...");
QHostInfo oHostInfo = QHostInfo::fromName("www.kde.org");
const auto addresses = oHostInfo.addresses();
for (const QHostAddress &oAddress : addresses)
{
qDebug() << "synchronous Found address: " << oAddress.toString();
}
}
輸出資訊
"異步方式..."
"同步方式..."
synchronous Found address: "91.189.93.5"
asynchronous Found address: "91.189.93.5"
網路代理支持
參考文章
小白發文,歡迎指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356949.html
標籤:其他
下一篇:TCP四次揮手詳解
