Qt UDP通信学习
一、项目概述
本项目基于Qt框架实现了UDP通信功能,支持单播与广播消息收发,展示了UDP套接字的基本用法,适合初学者学习Qt网络模块的实际应用。
二、项目结构
- 55.pro:Qt工程文件,配置模块与源码文件
- main.cpp:程序入口,初始化应用与主窗口
- widget.h / widget.cpp:主窗口类,包含UI与核心逻辑
- widget.ui:界面文件(未展示,需在Qt Designer中查看)
三、环境配置
- Qt 5.x及以上
- 启用network、widgets模块
- C++11支持
四、核心代码详解
1. main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
2. widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui; // UI指针
QUdpSocket *udpSocket; // UDP套接字对象
private slots:
void readPendingDatagrams(); // 接收数据槽
void on_pushButton_3_clicked(); // 单播发送按钮槽
void on_pushButton_clicked(); // 绑定端口按钮槽
void on_pushButton_2_clicked(); // 解除绑定按钮槽
void on_pushButton_4_clicked(); // 广播发送按钮槽
void mStateChanged(QAbstractSocket::SocketState); // 状态变化槽
};
#endif // WIDGET_H
3. widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
udpSocket = new QUdpSocket(this);
ui->pushButton_2->setEnabled(false);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
connect(udpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(mStateChanged(QAbstractSocket::SocketState)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::readPendingDatagrams()
{
QByteArray tmpByteArray;
tmpByteArray.resize(udpSocket->pendingDatagramSize());
QHostAddress ipaddr;
quint16 port;
while (udpSocket->hasPendingDatagrams()) {
udpSocket->readDatagram(tmpByteArray.data(), tmpByteArray.size(), &ipaddr, &port);
ui->textBrowser->append("接收来自:" + ipaddr.toString() + ":" + QString::number(port) + tmpByteArray);
}
}
void Widget::on_pushButton_3_clicked()
{
ui->textBrowser->append("发送:" + ui->lineEdit->text());
udpSocket->writeDatagram(ui->lineEdit->text().toUtf8(), QHostAddress("127.0.0.1"), 7755);
}
void Widget::on_pushButton_clicked()
{
ui->pushButton->setEnabled(false);
ui->pushButton_2->setEnabled(true);
udpSocket->bind(8888);
}
void Widget::on_pushButton_2_clicked()
{
udpSocket->abort();
ui->pushButton->setEnabled(true);
ui->pushButton_2->setEnabled(false);
}
void Widget::on_pushButton_4_clicked()
{
ui->textBrowser->append("发送:" + ui->lineEdit->text());
udpSocket->writeDatagram(ui->lineEdit->text().toUtf8(), QHostAddress::Broadcast, 7755);
}
void Widget::mStateChanged(QAbstractSocket::SocketState socketState)
{
switch (socketState) {
case QAbstractSocket::BoundState:
ui->textBrowser->append("socket状态BoundState");
default:
break;
}
}