Qt 的网络编程主要依赖于操作系统提供的 Socket API。虽然 C++ 标准库本身并未封装网络编程相关的 API,但 Qt 提供了两套专门的网络编程接口:QUdpSocket 和 QTcpSocket。
开发前需注意,Qt 模块划分是为了避免生成过大的可执行程序。默认情况下额外模块不会参与编译,需在 .pro 文件中添加 network 模块才能加载对应功能。
UDP 编程:QUdpSocket
核心类有两个:QUdpSocket(本质是文件描述符)和 QNetworkDatagram(封装了数据及地址端口信息)。
关键 API
| 名称 | 类型 | 说明 |
|---|---|---|
| bind(const QHostAddress&, quint16) | 方法 | 绑定指定的端口号 |
| receiveDatagram() | 方法 | 返回 QNetworkDatagram 读取一个 UDP 数据报 |
| writeDatagram(const QNetworkDatagram&) | 方法 | 发送一个 UDP 数据报 |
| readyRead | 信号 | 收到数据并准备就绪后触发 |
实战:UDP 回显服务器
实现一个带界面的 UDP 回显服务器。步骤如下:
- 创建 Widget 项目,在
.pro中加入network。 - 界面添加
QListWidget显示消息,成员变量声明QUdpSocket* socket。 - 构造函数中初始化 socket,连接
readyRead信号到槽函数。注意:一定要先连接信号槽,再绑定端口。 - 调用
bind(QHostAddress::Any, 8081)绑定任意 IP 和端口。需判断返回值,若失败则弹出QMessageBox::critical提示错误。 - 槽函数
process()中:- 通过
receiveDatagram()获取请求包。 - 调用
data()将二进制转为QString。 - 处理逻辑(回显则直接返回原内容)。
- 构造响应包
QNetworkDatagram(response.toUtf8(), requestPacket.senderAddress(), requestPacket.senderPort())。 - 调用
writeDatagram发送,并将交互日志添加到列表。
- 通过
// widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
Ui { ; }
QT_END_NAMESPACE
: QWidget
{
Q_OBJECT
:
(QWidget *parent = );
~();
:
Ui::Widget *ui;
QUdpSocket* socket;
;
slots:
;
};


