Qt实现简单UDP通信

2022-08-18 17:05:46

Qt简单实现UDP通信的具体代码,供大家参考,具体内容如下

标签(空格分隔): udp通信、Qt

一、UDP简介

1)UDP(User>

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等)。

二、具体Demo

发送端:

    新建Qt>

      打开pro文件,做如下修改,支持网络编程,接收端也需做如下修改

        添加发送端udpSocket以及按钮的点击信号
        #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);
          }

          接受端:

            再新建Qt Widgets Application项目,用作udp接收端,继承自Qwidget类即可,设计ui界面,用标签部件来显示接收到的信息,界面如下:

              跟发送端一样,在pro文件中添加支持网络编程的模块 network添加接收端udpSocket,如下:
              #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);   //将接收到的数据显示到标签上
                    }
                
                }

                三、运行效果

                  运行发送端应用程序,再打开接收端应用程序;在发送端编辑框输入数据,点击广播,观察接收端的情况,结果如下:

                  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。