C++ Qt 网络编程学习笔记
一、网络编程基础知识
-
IP地址与端口
- IP地址:设备在网络中的唯一标识(IPv4如
192.168.1.1
,IPv6如fe80::1
) - 端口号:应用程序的通信入口(0-65535,1024以下为系统保留)
- 组合意义:
IP:Port
唯一标识网络中的进程
- IP地址:设备在网络中的唯一标识(IPv4如
-
封包与拆包
-
封包:将数据按协议格式封装成网络数据包
-
拆包:从接收的字节流中解析出完整数据包
常见问题
:
- TCP粘包(需自定义协议处理消息边界)
- UDP无粘包(每个数据报独立)
-
二、UDP协议编程
-
核心特点
- 无连接、不可靠但高效
- 适用于实时性要求高的场景(如视频流)
-
编程流程
mermaid
Copy
graph LR A[创建QUdpSocket] --> B[绑定端口bind()] B --> C[接收数据readDatagram()] B --> D[发送数据writeDatagram()]
-
服务端实现
cpp
Copy
// 初始化Socket void Server::initSocket() {udpSocket = new QUdpSocket(this);udpSocket->bind(QHostAddress::LocalHost, 7755); // 绑定本地端口connect(udpSocket, &QUdpSocket::readyRead,this, &Server::readPendingDatagrams); // 事件驱动 }// 读取数据报 void Server::readPendingDatagrams() {while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);// 处理datagram数据...} }
-
客户端发送
cpp
Copy
QUdpSocket udpSocket; QByteArray data = "Hello UDP!"; qint64 ret = udpSocket.writeDatagram(data.constData(), data.size(),QHostAddress::LocalHost, 7755); // 目标地址+端口
三、TCP协议编程
-
核心特点
- 面向连接、可靠传输
- 适用于需要数据完整性的场景(如文件传输)
-
编程流程
mermaid
Copy
graph TB Server[服务端] -->|1. 监听| listen() Client[客户端] -->|2. 连接| connectToHost() Server -->|3. 接受连接| nextPendingConnection() Both -->|4. 通信| read()/write()
-
服务端实现
cpp
Copy
// 创建QTcpServer QTcpServer *tcpServer = new QTcpServer(this); if (!tcpServer->listen(QHostAddress::Any, 8888)) {// 错误处理... }// 新连接信号 connect(tcpServer, &QTcpServer::newConnection, [=](){QTcpSocket *clientSocket = tcpServer->nextPendingConnection();connect(clientSocket, &QTcpSocket::readyRead, [=](){QByteArray data = clientSocket->readAll();// 处理数据...}); });
-
客户端实现
cpp
Copy
QTcpSocket *tcpSocket = new QTcpSocket(this); tcpSocket->connectToHost("127.0.0.1", 8888);// 连接成功信号 connect(tcpSocket, &QTcpSocket::connected, [=](){tcpSocket->write("Hello TCP!"); });// 接收数据 connect(tcpSocket, &QTcpSocket::readyRead, [=](){QByteArray data = tcpSocket->readAll(); });
四、关键对比
特性 | UDP | TCP |
---|---|---|
连接方式 | 无连接 | 面向连接 |
可靠性 | 可能丢包 | 可靠传输 |
传输效率 | 高 | 相对较低 |
数据边界 | 保留消息边界 | 字节流模式 |
适用场景 | 视频会议、实时游戏 | 文件传输、Web服务 |
五、注意事项
- TCP粘包处理
- 固定长度法
- 分隔符法
- 长度前缀法(推荐)
- 跨平台特性
- Qt网络模块自动处理不同平台的套接字差异
- 线程安全
- 建议在单独的线程中处理网络I/O
- 错误处理
- 必须处理
errorOccurred
信号 - 检查所有网络操作的返回值
- 必须处理
六、扩展学习
- 高级主题
- 多线程网络服务
- SSL加密通信(QSslSocket)
- HTTP协议实现(QNetworkAccessManager)
- 调试技巧
- 使用
qDebug() << "Received:" << data;
输出调试信息 - 使用Wireshark抓包分析
- 使用