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 #include class UdpSender : public QObject{ Q_OBJECTpublic: 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 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 #include #include #include #include #include "xmlparse.h"#include "taskdatamanageobject.h"class UdpReciver : public QObject{ Q_OBJECTpublic: 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);
对了,不知道有没有人会思考代码写好之后怎么进行通信,我是小白,我就想过.
如果是在同一个程序里,则应该会是把服务端和发送端放到两个类里面或者两函数里面,通过调用函数先后顺序或者信号与槽的方式来进行通信.
如果客户端和服务端写在不同的程序里,就先运行接收端的程序,然后再运行发送端的代码.这样就可以进行通信啦,就是这么简单.
或许你会感兴趣
QT TCP简单的通信示例
QT TCP多个客户端连接到服务端
TCP/UDP调试工具的使用
图例: