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;}
}