Qt – 网络编程

欢迎转载,请注明出处: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 <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"

网络代理支持
参考文章


小白发文,欢迎指正
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>