欢迎转载,请注明出处:https://blog.csdn.net/qq_39453936?spm=1010.2135.3001.5343
原文链接: https://blog.csdn.net/qq_39453936/article/details/121304236
To include the definitions of the module’s classes, use the following directive:
#include
To link against the module, add this line to your qmake .pro file:
QT += network
Qt网络模块提供了允许您编写TCP/IP客户端和服务器的类。提供了如下:
还提供实现承载管理的类,如:
QNetworkConfiguration、QNetworkConfigurationManager和QNetworkSession。
类名 | 作用 |
---|---|
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 |
Qt网络编程提供了大量的API用于网络操作。API为特定的操作和协议提供了一个抽象层(如通过HTTP收发数据)。并且仅公开一般或高级概念的类、函数和信号。
QNetworkRequest 网络请求:,充当与请求相关联的信息的通用容器,例如请求头信息、加密等。构造请求对象时指定的URL确定用于请求的协议。目前,支持HTTP、FTP和本地文件URL上传和下载。
QNetworkAccessManager操作管理:请求创建后,管理类会分发请求,然后对外发送信号标识请求进度。还可使用cookies在客户端存储数据、请求认证、代理使用。
QNetworkReply请求响应;该对象由QNetworkAccessManager在发送请求时创建。QNetworkReply提供的信号可以用于单独监控每个请求响应,或者开发人员可以选择使用管理器QNetworkAccessManager的信号来代替,并放弃对请求响应的引用。由于QNetworkReply是QIODevice的一个子类,因此响应可以被同步或异步的处理(阻塞或非阻塞)。
每个应用程序或库都可以创建一个或多个QNetworkAccessManager实例来处理网络通信。
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(用户数据报协议)是一种轻量级、不可靠、面向数据报、无连接的协议。当可靠性不重要时,可以使用它。例如,报告时间的服务器可以选择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
在建立网络连接之前,QTcpSocket和QUdpSocket执行名称查找,将要连接的主机名转换为IP地址。此操作通常使用DNS(域名服务)协议执行。提供如下两种方式:
代码示例如下:
头文件
//主机信息测试验证
#include
#include
class HostInfoDemo : public QObject
{
Q_OBJECT
private slots:
void lookUp(const QHostInfo& oHostInfo);
};
void testHostInfoDemo();
源文件
#include "HostInfoDemo.h"
#include
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"
网络代理支持
参考文章