184 字
1 分钟
【QT】网络编程
Qt Network 模块提供 TCP/UDP、HTTP、DNS、SSL 等能力。项目中添加模块:
qmake(.pro):
QT += networkCMake:
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);实用类型
| 类型 | 说明 |
|---|---|
QHostAddress | IPv4/IPv6 地址 |
QNetworkInterface | 网卡信息 |
QUrl / QUrlQuery | URL 与查询参数 |
设计建议
- 自定义协议明确帧头 + 长度 + 载荷,避免粘包/半包问题。
- 长连接用心跳检测断开。
- 大量并发可考虑
QThreadPool+ 每连接QTcpSocket,或异步框架;GUI 线程只做调度与展示。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐
1
【QT】多线程
StudyNotes 介绍 QThread 两种用法、QtConcurrent、线程同步及跨线程更新 UI 的注意事项。
2
【QT】多媒体
StudyNotes 介绍 Qt6 多媒体模块、QMediaPlayer 音视频播放、摄像头预览及 Qt5/Qt6 差异。
3
【QT】数据库
StudyNotes 介绍 Qt SQL 主要类、SQLite 建表查询及 QSqlTableModel 与 QTableView 绑定用法。
4
【QT】布局与QSS
StudyNotes 介绍 QHBoxLayout 等布局管理、QSS 选择器语法及与 QPalette、QStyle 的关系。
5
【QT】交叉编译与部署
StudyNotes 以 NXP i.MX 为例说明交叉工具链配置、Qt Creator Kits 及嵌入式板端部署要点。
