Qt实现UDP多线程数据处理及发送的方法教程
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,本篇内容介绍了"Qt实现UDP多线程数据处理及发送的方法教程"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2025年11月14日Qt实现UDP多线程数据处理及发送的方法教程
本篇内容介绍了"Qt实现UDP多线程数据处理及发送的方法教程"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
逻辑与运行
程序逻辑图如下:
接收端运行截图如下:
客户端接收数据如下:
客户端用的是串口调试工具:

源码
程序结构如下:

源码如下:
data.h
#ifndef DATA_H#define DATA_H #include#include #include #include #define SenderListWidget 0#define ReceviListWidget 1 class PeerIP{public: quint32 IPv4Address; quint16 port; PeerIP(const quint32 Ip, const quint16 por){ IPv4Address = Ip; port = por; } friend QDebug operator << (QDebug os, PeerIP peerIP){ os << "(" << peerIP.IPv4Address << ", " << peerIP.port << ")"; return os; }}; class UDPMsg{ public: virtual QString backFunction(const PeerIP *peerIP){ Q_UNUSED(peerIP) return ""; } protected: UDPMsg(){} virtual ~UDPMsg(){}}; class UDPMsgReciver:public UDPMsg{ public: QString backFunction(const PeerIP *peerIP){ QHostAddress address(peerIP->IPv4Address); QString msg = "接收到P:" + address.toString() + " 端口:" + QString::number(peerIP->port) + "发来数据包, 正在处理数据"; return msg; }}; class UDPMsgSender:public UDPMsg{ public: QString backFunction(const PeerIP *peerIP){ QHostAddress address(peerIP->IPv4Address); QString msg = "已发送到IP:" + address.toString() + " 端口:" + QString::number(peerIP->port) + "UDP数据包,准备发送数据"; return msg; }}; #endif // DATA_H
msgqueue.h
#ifndef MSGQUEUE_H#define MSGQUEUE_H #include#include #include class PeerIP;class UDPMsg;class Widget; class MsgQueue: public QThread{public: enum MsgType{RecvQueue, SendQueue}; MsgQueue(Widget *widget, MsgType type); ~MsgQueue(); void appendPeerIP(const quint32 ipV4, const quint16 port); void stop(); protected: void run(); private: QList m_list; MsgType m_type; bool m_canExit; UDPMsg *m_udpMsg; Widget *m_widget;}; #endif // MSGQUEUE_H
widget.h
#ifndef WIDGET_H#define WIDGET_H #include#include QT_BEGIN_HEADERclass QUdpSocket;QT_END_NAMESPACE class PeerIP;class MsgQueue; namespace Ui {class Widget;} class Widget : public QWidget{ Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void insertMsgInList(const int Type, const QString msg); void senderMsg(quint32 ipV4, quint16 port); protected: void canAppendInList(const quint32 ipV4, const quint16 port); void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE; protected slots: void readPendingDatagrams(); private: Ui::Widget *ui; QUdpSocket *m_udpSocket; QList m_peerIP; MsgQueue *m_sender; MsgQueue *m_receiv;}; #endif // WIDGET_H
main.cpp
#include "widget.h"#includeint main(int argc, char *argv[]){ QApplication a(argc, argv); Widget w; w.show(); return a.exec();}
msgqueue.cpp
#include "msgqueue.h"#include "data.h"#include "widget.h"#includeMsgQueue::MsgQueue(Widget *widget, MsgType type): m_canExit(false){ if(type == RecvQueue){ m_udpMsg = new UDPMsgSender; } else{ m_udpMsg = new UDPMsgReciver; } m_widget = widget; m_type = type; start();} MsgQueue::~MsgQueue(){ for(int i = 0; i < m_list.size(); i++){ delete m_list[i]; }} void MsgQueue::appendPeerIP(const quint32 ipV4, const quint16 port){ PeerIP *peerIp = new PeerIP(ipV4, port); m_list.append(peerIp);} void MsgQueue::stop(){ m_canExit = true;} void MsgQueue::run(){ while(!m_canExit){ for(int i = 0; i < m_list.size(); i++){ QString msg = m_udpMsg->backFunction(m_list[i]); m_widget->insertMsgInList(m_type, msg); if(m_type == RecvQueue){ //这里可以写后端处理 } else{ m_widget->senderMsg(m_list[i]->IPv4Address, m_list[i]->port); } } msleep(1000); }}
widget.cpp
#include "widget.h"#include "ui_widget.h"#include "data.h"#include "msgqueue.h"#include#include #include #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); this->setWindowTitle("CSDN IT1995"); m_udpSocket = new QUdpSocket(this); if(!m_udpSocket->bind(7755)){ qDebug() << "bind failed! The assert will be triggred!"; Q_ASSERT(!"bind failed!"); } m_sender = new MsgQueue(this, MsgQueue::SendQueue); m_receiv = new MsgQueue(this, MsgQueue::RecvQueue); connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));} Widget::~Widget(){ delete ui; delete m_sender; delete m_receiv; for(int i = 0; i < m_peerIP.size(); i++){ delete m_peerIP[i]; }} void Widget::insertMsgInList(const int Type, const QString msg){ if(Type == SenderListWidget){ ui->senderListWidget->insertItem(0, msg); } else{ ui->receiverListWidget->insertItem(0, msg); }} void Widget::senderMsg(quint32 ipV4, quint16 port){ QHostAddress address(ipV4); m_udpSocket->writeDatagram(QByteArray("I am fine, fuck you!"), address, port);} void Widget::canAppendInList(const quint32 ipV4, const quint16 port){ for(int i = 0; i < m_peerIP.size(); i++){ if(m_peerIP[i]->IPv4Address == ipV4 && m_peerIP[i]->port == port){ qDebug() << "client in list"; return; } } PeerIP *peerIP = new PeerIP(ipV4, port); m_peerIP.append(peerIP); m_sender->appendPeerIP(ipV4, port); m_receiv->appendPeerIP(ipV4, port);} void Widget::closeEvent(QCloseEvent *event){ Q_UNUSED(event) m_sender->stop(); m_receiv->stop(); QEventLoop loop; QTimer::singleShot(1000, &loop, SLOT(quit())); loop.exec(); this->close();} void Widget::readPendingDatagrams(){ while(m_udpSocket->hasPendingDatagrams()){ QHostAddress srcAddress; quint16 nSrcPort; QByteArray datagram; datagram.resize(m_udpSocket->pendingDatagramSize()); m_udpSocket->readDatagram(datagram.data(), datagram.size(), &srcAddress, &nSrcPort);; canAppendInList(srcAddress.toIPv4Address(), nSrcPort); }}
"Qt实现UDP多线程数据处理及发送的方法教程"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
数据
处理
教程
数据处理
方法
线程
内容
客户
客户端
更多
源码
知识
程序
端口
逻辑
运行
实用
学有所成
接下来
串口
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网公司数据库选择
美的软件开发招聘
纪录小康工程 数据库
网络技术 物流中的应用
世界互联网5g黑科技
网络安全保护的认识
JAVA数据库是怎么实现的
数据库中怎么计算年份
学软件开发有哪些必备条件
江苏潮流软件开发参考价格
杭州农商银行软件开发部
芜湖网络技术
5g网络技术展开初期谈判
网络安全保卫宣传标语
河南数据软件开发以客为尊
软件开发合同纠纷案件
华为5g网络安全设置
全景拼接服务器
安卓打开数据库代码
数据库 多实例
数据库怎样设置图片的对比度亮度
火币钱包App服务器数据异常
数据库列合并
双十一网络安全视频
润乾 选择数据库驱动
for服务器
网络安全快车启动
法雷奥软件开发中心
电子商务与计算机网络技术的关系
ql分布式数据库