QT UDP简单的通信示例

 UDP(user datagram protocol)

即用户数据协议,是一个轻量级的/不可靠的/面向数据报的无连接协议.

在qt中提供了QUdpSocket类来进行UDP数据报的发送和接收. 在Pro中加入network模块;

因为upd是无连接的,所以两个通信设备之间不需要建立连接,只要知道对方的IP地址和端口号就行了。

利用UDP进行网络通信的完整实例(很详细了)如下:

客户端调用代码示例:

    UdpSender *udpSender = new UdpSender();
    while(1)//多次发 具体需求可以根据小伙伴你自行设计
    {
        udpSender->sendMsgToSever("896","127.0.0.1","3214");
    }

.h 

#ifndef UDPSENDER_H
#define UDPSENDER_H

#include <QObject>
#include <QUdpSocket>

class UdpSender : public QObject
{
    Q_OBJECT
public:
    explicit UdpSender(QObject *parent = 0);
    ~UdpSender();

    //发送消息给服务端
    void sendMsgToSever(const QString sMsg,const QString sHostAddr,const QString sHostPort);

signals:

public slots:

private:
    QUdpSocket *m_udpSocket;
};

#endif // UDPSENDER_H

.cpp

#include "udpsender.h"
#include <QDebug>
UdpSender::UdpSender(QObject *parent) :
    QObject(parent)
{    
    m_udpSocket = new QUdpSocket(this);

}

UdpSender::~UdpSender()
{   
    m_udpSocket->close();
    m_udpSocket->deleteLater();
}
void UdpSender::sendMsgToSever(const QString sMsg,const QString sHostAddr,const QString sHostPort)
{
    QByteArray baDada = sMsg.toLatin1();
    m_udpSocket->writeDatagram(baDada,QHostAddress(sHostAddr),sHostPort.toInt());
}



服务端调用代码示例:

    UdpReciver *udpReciver = new UdpReciver();
    udpReciver->setSeverConfig("127.0.0.1","3214");

.h

#ifndef UDPRECIVER_H
#define UDPRECIVER_H

#include <QObject>
#include <QUdpSocket>
#include <QThread>
#include <QDateTime>
#include <QStringList>
#include "xmlparse.h"
#include "taskdatamanageobject.h"
class UdpReciver : public QObject
{
    Q_OBJECT
public:
    explicit UdpReciver(QObject *parent = 0);
    ~UdpReciver();
    //绑定自身的端口及ip
    void setSeverConfig(const QString sHostAddr,const QString sHostPort);

signals:

public slots:
    void slotReadDatagrams();
private:
    QUdpSocket *m_udpSocket;
};

#endif // UDPRECIVER_H

.cpp 

#include "udpreciver.h"

UdpReciver::UdpReciver(QObject *parent) :
    QObject(parent)
{    
    m_udpSocket = new QUdpSocket(this);
    //连接套接字,若有客户端发消息过来,则会触发槽函数
    connect(m_udpSocket,SIGNAL(readyRead()),this,SLOT(slotReadDatagrams()), Qt::DirectConnection);
}

UdpReciver::~UdpReciver()
{
    m_udpSocket->close();
    m_udpSocket->deleteLater();
}

void UdpReciver::setSeverConfig(const QString sHostAddr, const QString sHostPort)
{
    第一个参数是服务端绑定的地址,第二个参数是接收消息的端口号
    m_udpSocket->bind(QHostAddress(sHostAddr),sHostPort.toInt());
}

void UdpReciver::slotReadDatagrams()
{
    QHostAddress haClientAddr;
    quint16 iClientPort;
    QByteArray m_baData;
    m_baData.clear();
    while(m_udpSocket->hasPendingDatagrams())
    {
        //从socket中读出数据
        m_baData.resize(m_udpSocket->pendingDatagramSize());

        /***********
            当发送端绑定了自身的端口之后,这里读出来的端口号iClientPort就是固定的(即客户端绑定的那个).
            当客户端没有绑定自身的端口时,iClientPort就是接收端这里随机分配的.
        ************/
        m_udpSocket->readDatagram(m_baData.data(),m_baData.size(),&haClientAddr,&iClientPort);
        //输出从客户端收到的消息
        QString sData = m_baData;
        qDebug() << sData;
    }
}

注:可通过hasPendDatagrams()判断是否有可读数据,通过pendingDatagarmSize()判断数据长度. 

注:在UDP通信中,你write一次,readyRead()就只会被触发一次,不会出现像TCP那样粘包的问题.

如此,服务端便可以接收消息了.

这样客户端就可以发送消息给服务端了--------上面展示的效果只达到一端发一端收,若要来回的收发消息,在客户端这边绑定一个接收消息端口就好了(方法同上).

实在不懂的小伙伴可以在这里下载来看(不需要积分)

实现UDP双方简单通信示例

相信小脑袋瓜聪明的你一定懂的.

拓展:原型bool QUdpSocket::bind ( const QHostAddress & address, quint16 port, BindMode mode )

bind是接收端需要调用的函数,绑定的是接收端的IP,以及监听的端口号(用来收消息)

bind的第三个参数说明:

QUdpSocket::ShareAddress允许其他服务绑定到相同的地址和端口
QUdpSocket::DontShareAddress独占绑定地址和端口,不允许其他服务重新绑定
QUdpSocket::ReuseAddressHint向QUdpSocket提供提示,即使地址和端口已由另一个套接字绑定,它也应尝试重新绑定服务
QUdpSocket::DefaultForPlatform等效于ShareAddress

示例:

    m_udpSocket->bind(QHostAddress(sHostAddr),sHostPort.toInt(),QUdpSocket::ShareAddress);

对了,不知道有没有人会思考代码写好之后怎么进行通信,我是小白,我就想过.

如果是在同一个程序里,则应该会是把服务端和发送端放到两个类里面或者两函数里面,通过调用函数先后顺序或者信号与槽的方式来进行通信.

如果客户端和服务端写在不同的程序里,就先运行接收端的程序,然后再运行发送端的代码.这样就可以进行通信啦,就是这么简单.

​​​​​​​注:tcp和udp是两种不同的底层的网络通信协议,两者监听和通信的端口互不相干的,不同的协议或者不同的网卡IP地址可以用相同的端口。

或许你会感兴趣

QT TCP简单的通信示例

QT TCP多个客户端连接到服务端

TCP/UDP调试工具的使用

图例:

  • 6
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼2333号程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值