我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Qt实现UDP多线程数据处理及发送的简单实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Qt实现UDP多线程数据处理及发送的简单实例

逻辑与运行

程序逻辑图如下:

接收端运行截图如下:

客户端接收数据如下:

客户端用的是串口调试工具:

源码

程序结构如下:

源码如下:

data.h


#ifndef DATA_H
#define DATA_H
 
#include <QObject>
#include <QHostAddress>
#include <QString>
#include <QDebug>
 
#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 <QThread>
#include <QList>
#include <QWidget>
 
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<PeerIP*> 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 <QWidget>
#include <QList>
 
QT_BEGIN_HEADER
class 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<PeerIP*> m_peerIP;
 
    MsgQueue *m_sender;
    MsgQueue *m_receiv;
};
 
#endif // WIDGET_H

main.cpp


#include "widget.h"
#include <QApplication>
 
int 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"
#include <QDebug>
 
MsgQueue::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 <QUdpSocket>
#include <QNetworkDatagram>
#include <QHostAddress>
#include <QDebug>
#include <QEventLoop>
#include <QTimer>
 
 
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 class="lazy" data-srcAddress;
        quint16 nclass="lazy" data-srcPort;
        QByteArray datagram;
        datagram.resize(m_udpSocket->pendingDatagramSize());
        m_udpSocket->readDatagram(datagram.data(), datagram.size(), &class="lazy" data-srcAddress, &nclass="lazy" data-srcPort);;
        canAppendInList(class="lazy" data-srcAddress.toIPv4Address(), nclass="lazy" data-srcPort);
    }
}

到此这篇关于Qt实现UDP多线程数据处理及发送的简单实例的文章就介绍到这了,更多相关Qt UDP多线程发送内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Qt实现UDP多线程数据处理及发送的简单实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

qt多线程处理大量数据怎么实现

在Qt中,可以使用QThread来实现多线程处理大量数据。首先,创建一个继承自QThread的自定义线程类,重写其run()函数,将需要在子线程中执行的任务放在run()函数中。cppclass WorkerThread : public
2023-10-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录