Qt实现UDP多线程数据处理及发送的方法教程
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容介绍了"Qt实现UDP多线程数据处理及发送的方法教程"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2025年01月19日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安全错误
数据库的锁怎样保障安全
双流区晓衡网络技术工作室
物理服务器网卡
顺义区网络营销软件开发优势
期刊网全文数据库
新疆加强网络安全管理办法
服务器的u代表什么
飞行控制软件开发
u8数据库添加安全库存
ctf网络安全亚军
南通搭建存储服务器
tft日服服务器英文名
jmeter 多数据库
网络技术人员专业知识
志愿服务数据库设计代码
网络技术工程师性格
生完孩子还继续从事软件开发
数据库与数据结构试题
用dos连接数据库
华为认证网络安全工程师教程
数据库为什么一更新表就卡死
adsl 搭建服务器
服务器禅道项目管理软件
奉贤区一站式软件开发欢迎咨询
软件开发 新增功能版权归属
mac如何搭建git服务器
霆智服务器安全
日程表模板软件开发
b站土豆服务器
企业安全管理数据库
医学网络安全