使用 Qt Network 进行网络编程
Qt Network 模块提供了用于编写TCP/IP客户端和服务器类的类。它提供了代表底层网络概念的低级类(如QTcpSocket 、QTcpServer 和QUdpSocket ),以及用于通过常见协议执行网络操作的高级类(如QNetworkRequest 、QNetworkReply 和QNetworkAccessManager )。
Qt Network 此外,还提供了用于传输层安全(TLS)的 API 以及安全函数,这些功能可通过原生 TLS 后端、OpenSSL 工具包或任何合适的 TLS 插件实现。更多信息请参阅“安全套接层(SSL)类”。
Qt 的网络编程类
该 Qt Network C++ Classes 页面列出了Qt Network 中的C++类。
HTTP的高级网络操作
网络访问 API 是一组用于执行常见网络操作的类。该 API 为所使用的具体操作和协议(例如,通过 HTTP 获取和发送数据)提供了一个抽象层,并仅暴露用于通用或高级概念的类、函数和信号。
网络请求由 `QNetworkRequest ` 类表示,该类同时作为请求相关信息的通用容器,例如任何标头信息和所使用的加密方式。在构建请求对象时指定的 URL 决定了请求所使用的协议。目前支持使用 HTTP 和本地文件 URL 进行上传和下载。
网络操作的协调由QNetworkAccessManager 类负责。请求创建后,该类将用于分发请求并发出信号以报告其进度。该管理器还负责协调cookies 在客户端存储数据、身份验证请求以及代理的使用。
对网络请求的响应由QNetworkReply 类表示;这些响应是在请求被分发时由QNetworkAccessManager 生成的。QNetworkReply 提供的信号可用于单独监视每个响应,或者开发者也可以选择使用管理器的信号来实现这一目的,并丢弃对响应的引用。由于QNetworkReply 是QIODevice 的子类,因此响应可以同步或异步处理;即作为阻塞或非阻塞操作。
每个应用程序或库都可以创建一个或多个QNetworkAccessManager 实例来处理网络通信。
使用 QTcpSocket 和 QTcpServer 进行 TCP 通信
TCP(传输控制协议)是一种低级网络协议,被包括 HTTP 和 FTP 在内的绝大多数互联网协议用于数据传输。它是一种可靠、面向流、面向连接的传输协议,特别适合连续的数据传输。

QTcpSocket 类为TCP提供了接口。您可以使用QTcpSocket 来实现POP3、SMTP和NNTP等标准网络协议,以及自定义协议。
在开始任何数据传输之前,必须先与远程主机和端口建立 TCP 连接。连接建立后,可通过QTcpSocket::peerAddress() 和QTcpSocket::peerPort() 获取对端的主机 IP 地址和端口号。对端可在任何时候关闭连接,此时数据传输将立即停止。
QTcpSocket 它与QNetworkAccessManager 类似,以异步方式工作,并通过发出信号来报告状态变化和错误。它依赖于事件循环来检测传入数据,并自动刷新传出数据。您可以使用QTcpSocket::write() 将数据写入套接字,并使用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 不需要事件循环。
Fortune Client和Fortune Server示例展示了如何使用QTcpSocket 和QTcpServer 编写 TCP 客户端-服务器应用程序。另请参阅《阻塞式 Fortune Client》,了解如何在单独线程中(不使用事件循环)使用同步的QTcpSocket ;以及《多线程 Fortune Server》,了解一个为每个活动客户端分配一个线程的多线程 TCP 服务器的示例。
使用 QUdpSocket 处理 UDP
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 接收器。
QUdpSocket 还支持组播。Multicast Sender和Multicast Receiver示例演示了如何编写 UDP 组播客户端。
使用 QHostInfo 解析主机名
在建立网络连接之前,QTcpSocket 和QUdpSocket 会执行名称解析,将你要连接的主机名转换为 IP 地址。此操作通常通过 DNS(域名服务)协议来完成。
QHostInfo 提供了一个静态函数,允许您自行执行此类查询。通过向QHostInfo::lookupHost() 传入主机名、QObject 指针以及槽签名,QHostInfo 将执行名称查询,并在结果准备就绪时调用指定的槽。 实际的查找是在一个单独的线程中进行的,利用操作系统自身的名称查找方法。
QHostInfo 还提供了一个名为QHostInfo::fromName() 的静态函数,该函数以主机名作为参数并返回结果。 在这种情况下,名称查找将在与调用者相同线程中进行。此重载对于非 GUI 应用程序或在单独的非 GUI 线程中进行名称查找非常有用。(在 GUI 线程中调用此函数可能会导致用户界面在函数因执行查找而阻塞期间冻结。)
对网络代理的支持
Qt Network 可以通过代理进行网络通信,这些代理负责引导或过滤本地与远程连接之间的网络流量。
单个代理由QNetworkProxy 类表示,该类用于描述和配置与代理的连接。系统支持在不同网络通信层级上运行的代理类型:SOCKS 5支持在底层代理网络流量,而HTTP和FTP代理则在协议层级上工作。更多信息请参阅QNetworkProxy::ProxyType 。
代理功能既可以按套接字逐个启用,也可以针对应用程序中的所有网络通信启用。对于新打开的套接字,可在其建立连接之前调用其QAbstractSocket::setProxy() 函数,使其使用代理。通过使用QNetworkProxy::setApplicationProxy() 函数,可以为后续的所有套接字连接启用全局代理。
代理工厂用于创建代理使用策略。QNetworkProxyFactory 会根据对特定代理类型的查询提供相应的代理。 查询本身编码在QNetworkProxyQuery 对象中,这些对象允许根据关键标准(如代理的目的(TCP、UDP、TCP 服务器、URL 请求)、本地端口、远程主机和端口,以及所使用的协议(HTTP、FTP 等))来选择代理。
QNetworkProxyFactory::proxyForQuery() 用于直接查询该工厂。通过将工厂传递给QNetworkProxyFactory::setApplicationProxyFactory() 可以实现全局代理策略,而通过继承QNetworkProxyFactory 类可以创建自定义代理策略;详情请参阅类文档。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.