Qt之UDP方式接发信息代码Linux平台WINDOWS平台通用

Qt之UDP方式接发信息代码Linux平台WINDOWS平台通用

一、udp_sender.h:发送信息

#ifndef UDP_SENDER_H
#define UDP_SENDER_H

#include <QObject>
#include <QtNetwork/QUdpSocket>
#include <QTimer>


class udp_sender : public QObject
{
    Q_OBJECT
public:
    explicit udp_sender(QObject *parent = nullptr);
    void run();
signals:
private slots:
    void processPendingDatagram();
private:

    QUdpSocket *sender;
    QTimer *timer;
};

#endif // UDP_SENDER_H

udp_sender.cpp

#include "udp_sender.h"
#include <QThread>
#include <QEventLoop>
#include <QTimer>
#include <iostream>

udp_sender::udp_sender(QObject *parent) : QObject(parent)
{
   sender = new QUdpSocket(this);
   sender->bind(QHostAddress("192.168.3.235"),4103);
}
void udp_sender::run()
{
    connect(sender,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
}
void udp_sender::processPendingDatagram()
{
    while(sender->hasPendingDatagrams())
    {
        QByteArray data;
        data.resize(sender->pendingDatagramSize());
        sender->readDatagram(data.data(),data.size());
        const QString msg = QString::fromUtf8(data);
        std::cout<<msg.toStdString()<<std::endl;
    }
}

二、udp_receiver.h:接收信息

#ifndef UDP_RECEIVER_H
#define UDP_RECEIVER_H
#include <QObject>
#include <QtNetwork/QUdpSocket>

class udp_receiver: public QObject
{
     Q_OBJECT
public:
   explicit udp_receiver(QObject *parent = nullptr);
   void run();
signals:

private slots:
   void processPendingDatagram();

private:
    QUdpSocket *receiv;

};

#endif // UDP_RECEIVER_H

udp_receiver.cpp

#include "udp_receiver.h"
#include <QThread>
#include <iostream>

udp_receiver::udp_receiver(QObject *parent) : QObject(parent)
{
    receiv = new QUdpSocket(this);
    receiv->bind(QHostAddress("192.168.3.235"),4103);
    

}
void udp_receiver::run()
{
   connect(receiv,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
}

void udp_receiver::processPendingDatagram()
{
    while(receiv->hasPendingDatagrams())
    {
        QByteArray data;
        data.resize(receiv->pendingDatagramSize());
        receiv->readDatagram(data.data(),data.size());
        const QString msg = QString::fromUtf8(data);
        std::cout<<msg.toStdString()<<std::endl;
    }
}

三 、thread_udp.h:接收与发送信息(线程方式一)

#ifndef THREAD_UDP_H
#define THREAD_UDP_H

#include <QObject>
#include <QThread>
#include <QtNetwork>

class thread_udp : public QThread
{
    Q_OBJECT
public:
    explicit thread_udp(QObject *parent = nullptr);
    ~thread_udp();
    void run();


signals:
    void isDone();
private slots:
    void processPendingDatagram();

protected:

private:
    QUdpSocket *udp;

};

#endif // THREAD_UDP_H

thread_udp.cpp

#include "thread_udp.h"
#include <iostream>
#include <QTimer>

thread_udp::thread_udp(QObject *parent)
    : QThread(parent)
{
    udp=new QUdpSocket(this);
    udp->bind(QHostAddress("192.168.3.235"),4103);
}

thread_udp::~thread_udp()
{

}
void thread_udp::run()
{
    connect(udp,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
    QTimer *timer = new QTimer(this);
    timer->setInterval(2000);
    connect(timer,&QTimer::timeout,this,[=](){
        QByteArray datagram= "hello world!";
        udp->writeDatagram(datagram.data(),datagram.size(),QHostAddress("192.168.2.247"),4103);
    });
    timer->start();

}
void thread_udp::processPendingDatagram()
{
    while(udp->hasPendingDatagrams())
    {
        QByteArray data;
        data.resize(udp->pendingDatagramSize());
        udp->readDatagram(data.data(),data.size());
        const QString msg = QString::fromUtf8(data);
        std::cout<<msg.toStdString()<<std::endl;
    }
}

四 、MyUdpTest.h:接收与发送信息(线程方式二)

#ifndef MYUDPTEST_H
#define MYUDPTEST_H

#include <QObject>
#include <QUdpSocket>
#include <QTimer>

class MyUdpTest : public QObject
{
    Q_OBJECT
public:
    explicit MyUdpTest(QObject *parent = nullptr);

    QUdpSocket * m_socket;

signals:

};

#endif // MYUDPTEST_H

MyUdpTest.cpp

#include "myudptest.h"
#include <iostream>

MyUdpTest::MyUdpTest(QObject *parent) : QObject(parent)
{
    m_socket = new QUdpSocket(this);
    m_socket->bind(QHostAddress::Any,4103);
    connect(m_socket,&QUdpSocket::readyRead,this,[=](){
        while(m_socket->hasPendingDatagrams())
        {
            QByteArray data;
            data.resize(m_socket->pendingDatagramSize());
            m_socket->readDatagram(data.data(),data.size());
            const QString msg = QString::fromUtf8(data);
            std::cout<<msg.toStdString()<<std::endl;
        }

    });
    QTimer *timer = new QTimer(this);
    timer->setInterval(2000);
    connect(timer,&QTimer::timeout,this,[=](){
        QByteArray datagram= "hello world!";
        m_socket->writeDatagram(datagram.data(),datagram.size(),QHostAddress("192.168.2.247"),4103);
    });
    timer->start();
}

五 、main.cpp:主程序

#include <iostream>
#include <QCoreApplication>
#include "udp_sender.h"
#include "udp_receiver.h"
#include "thread_udp.h"
#include <QThread>
#include "myudptest.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

//    udp_sender udpsender;
//    udpsender.run();

//    udp_receiver udpreceiver;
//    udpreceiver.run();

//    thread_udp th_udp;
//    th_udp.run();

    MyUdpTest test;
    QThread * t= new QThread();
    test.moveToThread(t);
    t->start();

    return a.exec();
}

秋风写于淄博,业务联系与技术交流:Q375172665

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值