前几天做项目,需要设备之间进行通信。刚开始选用的是TCP进行通信,结果发现tcp如果用自己封装的类的话,粘包问题是很难解决的(可以选用第三方封装好的库)。最后选用udp进行通信。学过的因该都知道,udp是一种部不可靠的数据报服务,在测试中发现,如果在网络状态可靠(自己搭建的局域网)的情况下,udp通信是没有任何问题的,几乎不会出现丢包的情况。
以下是qt udp通信程序的示例,包括两个文件,udpcomm.h和udpcomm.cpp,需要udp通信的话,直接加入两个文件即可。
udpcomm.h
#ifndef UDPCOMM_H
#define UDPCOMM_H
#include<QUdpSocket>
#include<QIODevice>
#include <QObject>
#include"address.h"
class udpComm:public QObject
{
Q_OBJECT
public:
explicit udpComm(QObject *parent = nullptr);
void sendData(QByteArray msg,QHostAddress address,quint16 port);
public slots:
void recive();
private:
QUdpSocket *socket;
signals:
void newMessage(QByteArray data);
};
#endif // UDPCOMM_H
udpcomm.cpp
#include "udpcomm.h"
//构造函数中进行己方端口的绑定
udpComm::udpComm(QObject *parent) : QObject(parent)
{
socket = new QUdpSocket();
if(!socket->bind(QHostAddress(SUIDONGADD),8888))
qDebug()<<"bind error!";
connect(socket,&QUdpSocket::readyRead,this,&udpComm::recive);
}
//信息,接收方的地址和端口号
void udpComm::sendData(QByteArray msg, QHostAddress address, quint16 port)
{
socket->writeDatagram(msg,address,8888);
}
void udpComm::recive()
{
while(socket->hasPendingDatagrams())
{
QByteArray ba;
ba.resize(socket->pendingDatagramSize());
socket->readDatagram(ba.data(),ba.size());
emit newMessage(ba);
}
}
在上述代码中,如果要监听udp通信发送消息,只需要建立建立槽函数,然后和newMessage信号之间建立关联即可。