Qt Network
Qt Network为使用TCP/IP的编程应用程序提供了一组api。像requests、cookie和通过HTTP发送数据这样的操作是由各种c++类处理的。
要使用Qt Network类,请将此指令添加到c++文件中:
#include <QtNetwork>
要链接到Qt Network模块,请将这一行添加到项目文件中:
QT += network
Qt Network模块提供了允许您编写TCP/IP客户端和服务器的类。它提供了低级类,如QTcpSocket, QTcpServer和QUdpSocket,它们代表低级网络概念,以及高级类,如QNetworkRequest, QNetworkReply和QNetworkAccessManager,以使用通用协议执行网络操作。它还提供了类,如QNetworkConfiguration, QNetworkConfigurationManager和QNetworkSession实现承载管理。
Qt网络编程中的C++类
要学好Qt的网络编程,必须学习相关的C++类,下面是类的列表:
QAbstractNetworkCache | 缓存实现的接口 |
QNetworkCacheMetaData | 缓存信息 |
QHstsPolicy | 指定主机支持HTTP HSTS (Strict Transport Security)策略。 |
QHttpMultiPart | 类似于通过HTTP发送的MIME多部分消息 |
QHttpPart | 保存要在HTTP多部分MIME消息中使用的主体部分 |
QNetworkAccessManager | 允许应用程序发送网络请求和接收响应 |
QNetworkCookie | 保存一个网络cookie |
QNetworkCookieJar | 实现了一个简单的罐子QNetworkCookie对象 |
QNetworkDiskCache | 非常基本的磁盘缓存 |
QNetworkReply | 包含用QNetworkAccessManager发送的请求的数据和头 |
QNetworkRequest | 保存要用QNetworkAccessManager发送的请求 |
QNetworkConfigurationManager | 管理系统提供的网络配置 |
QNetworkConfiguration | 一个或多个接入点配置的抽象 |
QNetworkSession | 控制系统的接入点,并在多个客户端访问同一接入点的情况下支持会话管理 |
QAuthenticator | 认证对象 |
QDnsDomainNameRecord | 存储域名记录信息 |
QDnsHostAddressRecord | 存储主机地址记录的信息 |
QDnsLookup | 表示DNS查找 |
QDnsMailExchangeRecord | 存储关于DNS MX记录的信息 |
QDnsServiceRecord | 存储DNS SRV记录信息 |
QDnsTextRecord | 存储DNS TXT记录信息 |
QHostAddress | IP地址 |
QHostInfo | 用于主机名查找的静态函数 |
QNetworkDatagram | UDP数据报的数据和元数据 |
QNetworkAddressEntry | 存储一个网络接口支持的一个IP地址,以及与其相关联的网掩码和广播地址 |
QNetworkInterface | 主机的IP地址和网络接口的列表 |
QNetworkProxy | 网络层代理 |
QNetworkProxyFactory | 细粒度的代理选择 |
QNetworkProxyQuery | 查询套接字的代理设置 |
QAbstractSocket | 所有套接字类型通用的基本功能 |
QLocalServer | 本地套接字服务器 |
QLocalSocket | 本地套接字 |
QSctpServer | SCTP-based服务器 |
QSctpSocket | SCTP套接字 |
QTcpServer | 基于tcp的服务器 |
QTcpSocket | TCP套接字 |
QUdpSocket | UDP套接字 |
QSslCertificate | 方便的API为X509证书 |
QSslCertificateExtension | 用于访问X509证书扩展的API |
QSslCipher | 表示SSL加密密码 |
QSslConfiguration | 保存SSL连接的配置和状态 |
QSslDiffieHellmanParameters | 服务器的Diffie-Hellman参数接口 |
QSslEllipticCurve | 表示椭圆曲线,供椭圆曲线密码算法使用 |
QSslError | SSL错误 |
QSslKey | 用于私钥和公钥的接口 |
QSslPreSharedKeyAuthenticator | 预共享密钥(PSK)密码套件的身份验证数据 |
QSslSocket | 客户端和服务器的SSL加密套接字 |
命名空间
QSsl:在Qt网络中声明所有SSL类通用的枚举
HTTP和FTP的高级网络操作
网络访问API是一组用于执行常见网络操作的类。API在使用的特定操作和协议上提供了一个抽象层(例如,通过HTTP获取和发布数据),并且只公开一般或高级概念的类、函数和信号。
网络请求由QNetworkRequest类表示,它还充当与请求相关的信息的通用容器,比如任何头部信息和使用的加密。在构造请求对象时指定的URL决定了请求使用的协议。目前支持HTTP、FTP和本地文件url上传和下载。
网络操作的协调是由QNetworkAccessManager类执行的。一旦创建了请求,这个类将用于分派请求并发出信号来报告请求的进度。管理器还协调cookie的使用,以便在客户机上存储数据、身份验证请求和代理的使用。
对网络请求的响应由QNetworkReply类表示;它们是在请求被分派时由QNetworkAccessManager创建的。QNetworkReply提供的信号可以用来单独监视每个回复,或者开发人员可以选择使用管理器的信号来代替这个目的,丢弃对回复的引用。因为QNetworkReply是QIODevice的子类,所以响应可以是同步的或者异步的;即作为阻塞或非阻塞操作。
每个应用程序或库都可以创建一个或多个QNetworkAccessManager实例来处理网络通信。
使用TCP与QTcpSocket和QTcpServer
TCP (Transmission Control Protocol,传输控制协议)是一种底层的网络协议,大多数Internet协议都使用它来传输数据,包括HTTP和FTP。它是一个可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输。
QTcpSocket类为TCP提供了一个接口。您可以使用QTcpSocket来实现标准的网络协议,如POP3、SMTP和NNTP,以及自定义协议。
在任何数据传输开始之前,TCP连接必须建立到远程主机和端口。建立连接后,通过QTcpSocket::peerAddress()和QTcpSocket::peerPort()可以得到对等体的IP地址和端口。在任何时候,对等端都可以关闭连接,数据传输将立即停止。
QTcpSocket异步工作,并发出信号来报告状态更改和错误,就像QNetworkAccessManager一样。它依赖于事件循环来检测传入的数据并自动清除传出的数据。可以使用QTcpSocket::write()向socket写入数据,也可以使用QTcpSocket::read()读取数据。QTcpSocket表示两个独立的数据流:一个用于读取,一个用于写入。
由于QTcpSocket继承了QIODevice,你可以将它与QTextStream和QDataStream一起使用。当从QTcpSocket读取数据时,你必须事先通过调用QTcpSocket::bytesAvailable()来确保有足够的数据可用。
如果您需要处理传入的TCP连接(例如,在服务器应用程序中),请使用QTcpServer类。调用QTcpServer::listen()来建立服务器,并连接到QTcpServer::newConnection()信号,该信号为每一个连接的客户端发出一次。在您的插槽中,调用QTcpServer::nextPendingConnection()来接受连接,并使用返回的QTcpSocket与客户端通信。
尽管它的大多数函数都是异步工作的,但也可以同步使用QTcpSocket(即阻塞)。要获得阻塞行为,调用QTcpSocket的waitFor…()函数;它们挂起调用线程,直到发出信号。例如,在调用非阻塞的QTcpSocket::connectToHost()函数后,调用QTcpSocket::waitForConnected()来阻塞线程,直到发出connected()信号。
同步套接字通常会导致代码具有更简单的控制流。waitFor…()方法的主要缺点是,当waitFor…()函数阻塞时,事件不会被处理。如果在GUI线程中使用,这可能会冻结应用程序的用户界面。因此,我们建议您只在非gui线程中使用同步套接字。同步使用时,QTcpSocket不需要事件循环。