一、描述
Qt Network 模块提供编写 TCP/IP 客户端和服务端的类。此模块提供的类分成三种类型:
- 代表低级网络概念的低级类(如 QTcpSocket、QTcpServer 、 QUdpSocket)
- 高级类(如 QNetworkRequest、QNetworkReply 、 QNetworkAccessManager)
- 实现承载管理的类,如 QNetworkConfiguration、QNetworkConfigurationManager、QNetworkSession 。
二、Qt网络类列表
- QAbstractNetworkCache:QNetworkAccessManager 使用的标准缓存的基类
- QAbstractSocket:提供Socket类型通用的基本功能
- QAuthenticator:在访问需要身份验证的服务时将所需的身份验证信息传递回socket
- QDnsDomainNameRecord:DNS查找域名记录
- QDnsHostAddressRecord:DNS查找主机地址记录
- QDnsLookup:DNS查找
- QDnsMailExchangeRecord:DNS查找邮件交换记录
- QDnsServiceRecord:DNS查找服务记录
- QDnsTextRecord:DNS查找文本记录
- QDtls:使用UDP协议与网络对等点建立安全连接
- QDtlsClientVerifier:实现服务器端 DTLS cookie 生成和验证
- QHostAddress:主机地址
- QHostInfo:主机信息
- QHstsPolicy:指定主机支持的 HTTP 严格传输安全策略
- QHttp2Configuration:启用 HTTP/2 协议时 QNetworkAccessManager 将用于发送请求和处理响应的 HTTP/2 参数和设置。
- QHttpMultiPart:封装HTTP multipart MIME 消息
- QHttpPart:封装 HTTP multipart MIME 消息的正文部分
- QLocalServer:接收QLocalSocket连接
- QLocalSocket:本地进程通信socket
- QNetworkAccessManager:Qt 应用程序网络访问的核心
- QNetworkAddressEntry:封装了网络接口信息
- QNetworkCacheMetaData:网络缓存元数据
- QNetworkConfiguration:网络接入点或服务配置
- QNetworkConfigurationManager:提供对系统已知网络配置的访问
- QNetworkCookie:保存从网络接收到的 cookie
- QNetworkCookieJar:保存cookie对象(保存在内存)
- QNetworkDatagram:封装了UDP数据报
- QNetworkDiskCache:QNetworkAccessManager 的网络缓存
- QNetworkInterface:主机的物理层网络接口信息
- QNetworkProxy:封装了代理配置信息
- QNetworkProxyFactory:QNetworkProxy的扩展
- QNetworkProxyQuery:查询socket的代理设置
- QNetworkReply:封装http回复信息
- QNetworkRequest:封装http请求信息
- QNetworkSession:封装网络会话
- QSctpServer:接收QSctpSocket连接
- QSctpSocket:根据SCTP(流控制传输协议)方式建立Socket连接
- QSslCertificate:SSL证书
- QSslCertificateExtension:SSL证书的拓展
- QSslCipher:SSL 加密密码
- QSslConfiguration:SSL配置
- QSslDiffieHellmanParameters:用于为基于 QSslSocket 的服务器设置 Diffie-Hellman 参数提供接口。
- QSslEllipticCurve
- QSslError:QSslSocket 在 SSL 握手期间的错误信息管理
- QSslKey:SSL密钥
- QSslPreSharedKeyAuthenticator:提供预共享密钥 (PSK) 密码验证
- QSslSocket:建立安全、加密的 TCP 连接
- QTcpServer:TCP服务端
- QTcpSocket
- QUdpSocket
三、HTTP 和 FTP 的高级网络操作
1、Qt网络模块提供了网络访问 API,该API包含一组用于执行常见网络操作的类。
2、网络请求由 QNetworkRequest 类表示,该类还充当与请求相关联的信息的通用容器,例如任何标头信息和使用的加密。构造请求对象时指定的 URL 决定用于请求的协议。目前支持 HTTP、FTP 和本地文件 URL 上传和下载。
3、网络操作的协调由 QNetworkAccessManager 类执行。创建请求后,该类用于调度它并发出信号以报告其进度。QNetworkAccessManager 还协调使用 cookie 来存储客户端上的数据、身份验证请求和代理的使用。
4、对网络请求的回复由 QNetworkReply 类表示。QNetworkReply 提供的信号可用于单独监控每个回复。由于 QNetworkReply 是 QIODevice 的子类,因此可以同步或异步处理回复。即,作为阻塞或非阻塞操作。
四、在 QTcpSocket 和 QTcpServer 中使用 TCP
TCP(传输控制协议)是大多数 Internet 协议(包括 HTTP 和 FTP)用于数据传输的低级网络协议。 它是一种可靠的、面向流的、面向连接的传输协议。 它特别适用于数据的连续传输。
4.1、 QTcpSocket简介
1、QTcpSocket 类提供了一个TCP 接口。可以使用 QTcpSocket 来实现 POP3、SMTP 和 NNTP 等标准网络协议,以及自定义协议。
2、必须先建立到远程主机和端口的 TCP 连接,然后才能开始任何数据传输。关闭连接后数据传输将立即停止。
3、QTcpSocket 异步工作并发出信号来报告状态变化和错误。它依靠事件循环来检测传入数据并自动刷新传出数据。
4、由于 QTcpSocket 继承了 QIODevice,因此可以将其与 QTextStream 和 QDataStream 一起使用。
5、虽然QTcpSocket 的大部分功能都是异步工作的,但也可以同步使用(即阻塞)。要获得阻塞行为,请调用 QTcpSocket 的 waitFor...() 函数。同步socket通常会导致代码具有更简单的控制流。 waitFor...() 方法的主要缺点是当 waitFor...() 函数阻塞时不会处理事件。如果在 GUI 线程中使用,这可能会冻结应用程序的用户界面。因此,建议仅在非 GUI 线程中使用同步socket。同步使用时,QTcpSocket 不需要事件循环。
4.2、QTcpServer
如果需要处理传入的 TCP 连接(例如,在服务器应用程序中),请使用 QTcpServer 类。
五、使用 UDP 和 QUdpSocket
UDP(用户数据报协议)是一种轻量级、不可靠、面向数据报的无连接协议。 当可靠性不重要时可以使用它。
1、QUdpSocket 类可以发送和接收 UDP 数据报。它继承了 QAbstractSocket,因此共享了 QTcpSocket 的大部分接口。主要区别在于 QUdpSocket 将数据作为数据报传输,而不是作为连续数据流传输。简而言之,数据报是一个大小有限(通常小于 512 字节)的数据包,除了传输的数据外,还包含数据报发送方和接收方的 IP 地址和端口。
2、QUdpSocket 支持 IPv4 广播。一台主机向所有其他主机接收的网络广播数据报。收到请求的每个主机然后将回复发送回发送者。要广播数据报,只需将其发送到特殊地址QHostAddress::Broadcast (255.255.255.255) 或本地网络的广播地址。
六、使用 QHostInfo 解析主机名
在建立网络连接之前,QTcpSocket 和 QUdpSocket 执行名称查找,将要连接的主机名转换为 IP 地址。此操作通常使用 DNS(域名服务)协议执行。
QHostInfo 提供了静态函数lookupHost()、fromName(),可以执行这样的查找。lookupHost()的查找是在一个单独的线程中完成的,利用操作系统自己的方法来执行名称查找。fromName()则是名称查找与调用者在同一线程中执行。
七、支持网络代理
Qt 的网络通信可以通过代理执行,代理可以引导或过滤本地和远程连接之间的网络流量。各个代理由 QNetworkProxy 类表示,该类用于描述和配置与代理的连接。
可以在每个socket的基础上或为应用程序中的所有网络通信启用代理。通过在连接之前调用其 QAbstractSocket::setProxy() 函数,可以使新打开的socket使用代理。