184 字
1 分钟
【QT】网络编程
2026-06-11

Qt Network 模块提供 TCP/UDP、HTTP、DNS、SSL 等能力。项目中添加模块:

qmake.pro):

QT += network

CMake

find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(MyApp Qt6::Network)
#include <QTcpSocket>
#include <QUdpSocket>
#include <QNetworkAccessManager>

QTcpSocket(TCP 客户端)#

QTcpSocket *socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::connected, this, &Client::onConnected);
connect(socket, &QTcpSocket::readyRead, this, &Client::onReadyRead);
connect(socket, &QTcpSocket::errorOccurred, this, &Client::onError);
socket->connectToHost("example.com", 80);
// 连接成功后
socket->write("GET / HTTP/1.0\r\n\r\n");
void Client::onReadyRead()
{
QByteArray data = socket->readAll();
// 处理数据;注意 TCP 流式,需自行组包或定长协议
}

QTcpServer(TCP 服务端)#

QTcpServer *server = new QTcpServer(this);
connect(server, &QTcpServer::newConnection, this, &Server::onNewConnection);
server->listen(QHostAddress::Any, 8080);
void Server::onNewConnection()
{
QTcpSocket *client = server->nextPendingConnection();
connect(client, &QTcpSocket::readyRead, this, [client]() {
qDebug() << client->readAll();
});
}

QUdpSocket(UDP)#

无连接,面向数据报:

QUdpSocket *udp = new QUdpSocket(this);
udp->bind(QHostAddress::Any, 45454);
connect(udp, &QUdpSocket::readyRead, this, [udp]() {
while (udp->hasPendingDatagrams()) {
QByteArray buf;
buf.resize(udp->pendingDatagramSize());
QHostAddress sender;
quint16 port;
udp->readDatagram(buf.data(), buf.size(), &sender, &port);
}
});
udp->writeDatagram("hello", QHostAddress("192.168.1.1"), 45454);

QNetworkAccessManager(HTTP)#

高层 HTTP/HTTPS API,异步基于事件循环:

QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
connect(mgr, &QNetworkAccessManager::finished,
this, &MainWindow::onReplyFinished);
QNetworkRequest req(QUrl("https://api.example.com/data"));
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
mgr->get(req);
// POST
// mgr->post(req, QByteArray("{\"key\":\"value\"}"));
void MainWindow::onReplyFinished(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NoError) {
qWarning() << reply->errorString();
} else {
QByteArray body = reply->readAll();
}
reply->deleteLater();
}

QSslSocket(TLS)#

需 Qt SSL 支持及 OpenSSL 等后端:

QSslSocket *ssl = new QSslSocket(this);
connect(ssl, &QSslSocket::encrypted, this, &Client::onEncrypted);
ssl->connectToHostEncrypted("example.com", 443);

实用类型#

类型说明
QHostAddressIPv4/IPv6 地址
QNetworkInterface网卡信息
QUrl / QUrlQueryURL 与查询参数

设计建议#

  • 自定义协议明确帧头 + 长度 + 载荷,避免粘包/半包问题。
  • 长连接用心跳检测断开。
  • 大量并发可考虑 QThreadPool + 每连接 QTcpSocket,或异步框架;GUI 线程只做调度与展示。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【QT】网络编程
https://lysj.work/posts/studynotes/qt/qt网络编程/
作者
Sekiro
发布于
2026-06-11
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录