Qt简单实现UDP通信的具体代码,供大家参考,具体内容如下
标签(空格分隔): udp通信、Qt
1)UDP(User Datagram Protocol,用户数据报协议)
UDP是一个轻量级、不可靠、面向数据报的、无连接的传输层协议,多用于可靠性要求不严格,不是非常重要的传输,如直播、视频会议等等。
2)Qt中QUdpSocket类继承自QAbstractSocket,用来发送和接收UDP数据报,”Socket”即套接字,套接字即IP地址+端口号。其中IP地址指定了网络中的一台主机,二端口号则指定了该主机上的一个应用程序,端口号只具有本地意义,使用套接字即可实现网络上的两个应用程序之间的通信。
3)QUdpSocket支持IPv4广播,要广播数据报,则只需发送到一个特殊的地址QHostAddress::Broadcast(即255.255.255.255),数据报一般建议发送字节数小于512字节。端口号选择1024-65535(1024以下的常用作保留端口号,如FTP常用端口号21,Telnet常用端口号23,DNS域名服务器常用端口53等)。
发送端:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QUdpSocket> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private slots: void on_pushButton_clicked(); //按钮点击信号 private: Ui::Widget *ui; QUdpSocket* m_sender; //udp发送端 }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); m_sender=new QUdpSocket(this); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_clicked() { QByteArray dataGram=ui->lineEdit->text().toUtf8(); m_sender->writeDatagram(dataGram.data(), dataGram.size(), QHostAddress::Broadcast, //udp广播地址 6666); }
接受端:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QUdpSocket> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private slots: void processData(); private: Ui::Widget *ui; QUdpSocket* m_receiver; //udp接受端 }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); m_receiver=new QUdpSocket(this); //绑定发送端,ShareAddress允许多接收端绑定6666端口 m_receiver->bind(6666,QUdpSocket::ShareAddress); //当接收端接收到数据时,就会发送readRead信号 connect(m_receiver,&QUdpSocket::readyRead,this,&Widget::processData); } Widget::~Widget() { delete ui; } void Widget::processData() { QString strData; //有未处理的数据报 while(m_receiver->hasPendingDatagrams()){ QByteArray dataGram; //读取的数据报大小 dataGram.resize(m_receiver->pendingDatagramSize()); m_receiver->readDatagram(dataGram.data(),dataGram.size()); ui->dataLabel->setText(dataGram); //将接收到的数据显示到标签上 } }