Qt实现简单UDP通信

 更新时间:2022年08月18日 15:04:37   作者:喝水怪~  
这篇文章主要为大家详细介绍了Qt实现简单UDP通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

一、UDP简介

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

二、具体Demo

发送端:

  • 新建Qt Widgets Application,用作udp发送端,继承自Qwidget类即可,设计ui界面,用于发送信息,界面如下:

  • 打开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);   //将接收到的数据显示到标签上
    }

}

三、运行效果

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

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

相关文章

  • VSCode配置C语言环境的方法

    VSCode配置C语言环境的方法

    这篇文章主要介绍了VSCode配置C语言环境的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C++实现一个简单的SOAP客户端

    C++实现一个简单的SOAP客户端

    这篇文章主要介绍了C++实现一个简单的SOAP客户端,在C++中,一般使用gSOAP来实现客户端、服务端,下面一起进入文章了解具体内容,需要的朋友可以参考一下
    2021-11-11
  • C语言动态内存管理分析总结

    C语言动态内存管理分析总结

    C语言中开辟内存有很多种方式,目前我们最常用的也就是数组,但数组是在我们用到他之前就得设定好它的长度,有时很不方便。随意我们来探究动态内存管理
    2021-11-11
  • C语言常见的指针笔试题解析

    C语言常见的指针笔试题解析

    在我们学习指针之后,应该在实际应用中去理解和掌握它,毕竟实践才是检验真理的唯一标准,我们以后在找工作的过程中免不了会遇到与指针相关的试题,本篇文章可以帮助我们提前了解一些常见的指针考点,需要的可以了解一下
    2022-10-10
  • C++ Boost Intrusive库示例精讲

    C++ Boost Intrusive库示例精讲

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言自定义函数的实现

    C语言自定义函数的实现

    这篇文章主要介绍了C语言自定义函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C语言清楚了解指针的使用

    C语言清楚了解指针的使用

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍
    2022-06-06
  • C++简明图解分析静态成员与单例设计模式

    C++简明图解分析静态成员与单例设计模式

    与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员,静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行默认访问
    2022-06-06
  • C++的static关键字及变量存储位置总结

    C++的static关键字及变量存储位置总结

    今天看博文时,看到了c++的static关键字的一些总结,还涉及到了一些代码的存储位置;接下来为您详细呈现
    2012-11-11
  • c++ 前自增/后自增操作符效率分析

    c++ 前自增/后自增操作符效率分析

    这篇文章主要介绍了c++ 前自增/后自增操作符效率分析,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2021-01-01

最新评论