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