Qt UDP通信学习

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

cpp:d:/Downloads/【正点原子】嵌入式Qt5 复制代码
#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

cpp:d:/Downloads/【正点原子】嵌入式Qt5 复制代码
#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

cpp:d:/Downloads/【正点原子】嵌入式Qt5 复制代码
#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;
    }
}
相关推荐
小短腿的代码世界4 小时前
Qt行情协议解析与二进制编解码优化:从FIX到自定义协议的全链路架构
开发语言·qt·架构
袁小皮皮不皮5 小时前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
装不满的克莱因瓶5 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
luoyayun3615 小时前
Qt/QML + FFmpeg 实现多音频文件顺序拼接功能
qt·ffmpeg·音频拼接
清辞8536 小时前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
YM52e6 小时前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰7 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
Strugglingler7 小时前
【Qt,OpenGL, RHI,Wayland 等概念梳理】
qt·opengl·wayland·rhi·x11·egl·glx
ken22328 小时前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习
zwenqiyu8 小时前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法