QT网络通信底层实现详解:UDP/TCP实战指南
QT网络通信底层实现详解:UDP/TCP实战指南
目录
- 网络通信概述
- UDP通信实现
- TCP客户端实现
- TCP服务器实现
- 通信流程对比
- 实战应用场景
1. 网络通信概述
QT提供两种网络通信方式:
核心组件对比:
特性 | UDP | TCP |
---|---|---|
连接方式 | 无连接 | 面向连接 |
可靠性 | 不可靠(可能丢包) | 可靠(数据完整有序) |
速度 | 快 | 较慢 |
适用场景 | 实时视频/游戏/广播 | 文件传输/远程控制 |
QT类 | QUdpSocket | QTcpSocket /QTcpServer |
2. UDP通信实现
UDP通信特点:
- 无需建立连接
- 支持单播、组播、广播
- 发送端可不绑定端口
发送端实现:
// 创建UDP套接字
QUdpSocket *sender = new QUdpSocket(this);// 发送数据报
QByteArray datagram = "Hello UDP!";
qint64 sent = sender->writeDatagram(datagram, QHostAddress("192.168.1.100"), // 目标IP12345 // 目标端口
);// 检查发送结果
if(sent == -1) qDebug() << "发送失败:" << sender->errorString();
接收端实现:
QUdpSocket *receiver = new QUdpSocket(this);
receiver->bind(12345); // 绑定监听端口// 连接信号槽
connect(receiver, &QUdpSocket::readyRead, [=](){while(receiver->hasPendingDatagrams()) {QByteArray buffer;buffer.resize(receiver->pendingDatagramSize());QHostAddress senderAddr;quint16 senderPort;receiver->readDatagram(buffer.data(), buffer.size(), &senderAddr, &senderPort);qDebug() << "收到[" << senderAddr.toString() << ":" << senderPort << "]" << buffer;}
});
运行效果:
收到[ 192.168.1.50:12345 ] "Hello UDP!"
3. TCP客户端实现
通信流程:
客户端代码:
QTcpSocket *client = new QTcpSocket(this);// 连接服务器
client->connectToHost("192.168.1.100", 8888);// 连接成功信号
connect(client, &QTcpSocket::connected, [=](){qDebug() << "已连接到服务器";client->write("Hello Server!");
});// 接收数据
connect(client, &QTcpSocket::readyRead, [=](){QByteArray data = client->readAll();qDebug() << "服务器响应:" << data;
});// 错误处理
connect(client, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),[=](QAbstractSocket::SocketError error){qDebug() << "连接错误:" << client->errorString();
});
4. TCP服务器实现
通信流程:
服务器端代码:
// 创建TCP服务器
QTcpServer *server = new QTcpServer(this);// 绑定监听
if(!server->listen(QHostAddress::Any, 8888)) {qDebug() << "监听失败:" << server->errorString();return;
}// 新连接信号
connect(server, &QTcpServer::newConnection, [=](){QTcpSocket *clientSocket = server->nextPendingConnection();// 客户端信息qDebug() << "新客户端:" << clientSocket->peerAddress().toString();// 数据接收connect(clientSocket, &QTcpSocket::readyRead, [=](){QByteArray data = clientSocket->readAll();qDebug() << "客户端消息:" << data;// 回复客户端clientSocket->write("Message Received!");});// 断开连接处理connect(clientSocket, &QTcpSocket::disconnected, [=](){clientSocket->deleteLater();});
});
服务端运行效果:
监听成功: 0.0.0.0:8888
新客户端: 192.168.1.50
客户端消息: "Hello Server!"
5. 通信流程对比
UDP vs TCP 工作流程:
步骤 | UDP通信 | TCP通信 |
---|---|---|
初始化 | 创建QUdpSocket | 创建QTcpSocket/QTcpServer |
绑定 | 接收端需bind() | 服务器需listen() |
建立连接 | 无连接建立过程 | 客户端connectToHost() |
数据发送 | writeDatagram() | write() |
数据接收 | readyRead()信号处理 | readyRead()信号处理 |
连接状态 | 无状态 | connected()/disconnected() |
关闭连接 | 直接销毁对象 | 先disconnectFromHost() |
6. 实战应用场景
场景1:局域网设备发现(UDP广播)
QUdpSocket udpSocket;
QByteArray discoveryMsg = "DEVICE_DISCOVERY";
udpSocket.writeDatagram(discoveryMsg, QHostAddress::Broadcast, // 广播地址45454); // 约定端口
场景2:文件传输(TCP)
// 发送文件头信息
QFile file("document.pdf");
file.open(QIODevice::ReadOnly);
QByteArray header = QString("FILE|%1|%2").arg(file.fileName()).arg(file.size()).toUtf8();
socket->write(header);// 分块发送文件数据
while(!file.atEnd()) {QByteArray chunk = file.read(1024 * 64);socket->write(chunk);socket->waitForBytesWritten();
}
完整源码:GitHub网络通信示例
官方文档:QT Network模块
原创技术笔记,转载需注明出处。更多系统编程内容持续更新中…