QT UDP简单的通信示例

2023-11-06

 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调试工具的使用

图例:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT UDP简单的通信示例 的相关文章

  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • Qt 和 MOC 的困境与简单的制作

    我想这更像是一个 GNU Make 问题 而不是 Qt 和 moc 但这里是 我有一个包含多个目录Q OBJECTS 我有一些简单的代码 它收集所有这些 例如 MOCS shell grep l Q OBJECT HEADERS Assum
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • 如何阻止 Qt Creator 将可执行文件放置在“调试”子目录中?

    我正在 Qt Creator 中构建一个项目 虽然我不关心中间 obj 文件去哪里 但重要的是最终的可执行文件应放入 并运行 许多依赖项 DLL 等所在的特定目录中 被发现 因此 在 Qt Creator 中 我选择 Shadow Buil
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • Qt ObjectName() 必须是唯一的吗?

    如标题所示的简单问题 如果我打电话setObjectName 在一个对象上 它是否必须是唯一的 或者只是因为约定而推荐 我已经子类化了QLabel 并希望自动为创建的对象命名 如果这是一个坏主意 我会找到一些设置随机唯一名称的方法 我实际上
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • QTableView 选择已更改

    我有一个QTableView我需要从中获取选择更改事件 我似乎无法让连接工作 我有 MyWidget h protected slots void slotLoadTransaction const QItemSelection selec
  • 关于在 Qt 中使用未记录的类

    使用无证文件是否安全QObjectUserData类和QObject setUserData in Qt 相反 你可以看看使用QObject setProperty http doc qt io qt 5 qobject html setP
  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 获取 QPushButton 在 2D 数组 QPushButton 上的索引

    我有一个二维数组QPushButton 当用户单击按钮时如何获取按钮的索引 例如当用户单击按钮时a 2 3 它会显示 2 3 该示例如下所示 Qt 4 5 使用对象名称 您可以为按钮指定唯一的对象名称 理想情况下 名称应该是有效的 C 标识
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n

随机推荐

  • 4.2 计算机体系结构——存储层次结构——cache工作原理

    cache是小容量 高速缓冲存储器 由SRAM组成 速度几乎和CPU一样快 一般将cache和主存的存储空间都划分为若干大小相同的块 1 cache工作原理 根据时间局部性和空间局部性 当处理器访问一块数据时 它很可能再次访问这块数据或者访
  • 【Spring AOP】Spring AOP快速使用

    文章目录 前言 1 相关注解 类注解 方法注解 2 execution 表达式 例一 execution 表达式 的限制使用 例二 execution 表达式 的通配使用 3 相关pom依赖 4 案例 创建接口 Aop使用 方式一 Befo
  • struts2中各个jar包作用

    Struts2 3 4 所需的Jar包及介绍 Jar包的分类 jar包名称 jar包版本 jar包 文件名 jar包 的作用 jar包内包含的主要包路径及主要类 依赖的自有jar包名称 依赖的第三方jar包名称 本jar包是否为第三方包 S
  • Hash算法特点

    2 2 Hash算法有什么特点 一个优秀的 hash 算法 将能实现 正向快速 给定明文和 hash 算法 在有限时间和有限资源内能计算出 hash 值 逆向困难 给定 若干 hash 值 在有限时间内很难 基本不可能 逆推出明文 输入敏感
  • 第十届蓝桥杯省赛C++B组 等差数列

    数学老师给小明出了一道等差数列求和的题目 但是粗心的小明忘记了一部分的数列 只记得其中 N 个整数 现在给出这 N 个整数 小明想知道包含这 N 个整数的最短的等差数列有几项 输入格式 输入的第一行包含一个整数 N 第二行包含 N 个整数
  • 理解TCP/IP、HTTP、FTP、 NTP、 SNMP、VRRP等常用协议(FTP)

    FTP 概述 文件传输协议 FTP 作为网络共享文件的传输协议 在网络应用软件中具有广泛的应用 FTP的目标是提高文件的共享性和可靠高效地传送数据 在传输文件时 FTP 客户端程序先与服务器建立连接 然后向服务器发送命令 服务器收到命令后给
  • redis常用命令

    一 key 相关 1 redis允许模糊查询 key keys 有3个通配符 2 randomkey 返回随机key 3 type key 返回key存储的类型 4 exists key 判断某个key是否存在 5 del key 删除ke
  • 【颜值检测神器】来,请拿出你们的绝活(这颜值,对得起观众么?)

    前言 作者 程序员梨子 文章简介 本篇文章主要调用百度接口制作一款颜值检测小工具啦 文章源码获取 为了感谢每一个关注我的小可爱 每篇文章的项目源码都是无偿分 享滴 点这里蓝色这行字体自取 需要什么源码记得说标题名字哈 私信我也可 欢迎小伙伴
  • 9.全志H3-修改DDR的速度

    上面是我的微信和QQ群 欢迎新朋友的加入 前一篇文章 为了测试我自己画的板子 查了下关于uboot源码 降低DDR的速度 我使用的是友善之臂提供的源码 不多说其他的了 在源码里面 查找下图的文件 打开文件 修改图示内容就行 下面是启动的打印
  • 【java】兴唐第二十三节课作业

    已知如下 下表为某班级四次考试成绩单 要求使用HashMap
  • 万网域名如何设置显性url转发和隐性URL转发

    原文链接 http www enkj com idcnews Article 20161025 9580 URL转发技术就是将该域名的网站访问请求 通过浏览器端技术 转向到另外一个网站 如果跳转后 浏览器地址栏还是该域名 称为隐性URL转发
  • 眼底图像血管分割数据集_一个图像分割任务的Hello World项目(UNet+眼底血管分割)...

    庖丁解牛式的学习 才是真正的事半功倍 这是CVHub公众号的第七篇原创文章 也是 学术小白也能看懂的学术进阶专栏 计算机视觉方向 的第七篇文章 导读 在基于深度学习的医学影像分割任务中 基本在哪都能看到 U Net 的影子 这是一篇发表于
  • Protocbuf使用和安装

    Protocol buffers和mxl一样在序列化数据结构时很灵活 高效和智能 但是它的优势在于定义文件更小 读取速度更快 使用更加简单 目前protocol buffers支持C java和python三种语言并且独立于平台 linux
  • 了解硬盘的电路组成部分

    一 硬盘电路组成 硬盘电路板是将硬盘内部和电脑主板相互连接的中介 它将接口传送过来的电信号转换成磁信息记录到硬盘盘片上 写操作 反过来也可以将硬盘盘片上的磁信息转换成电信号传送到接口 读操作 硬盘电路板是裸露在外面的 因此也是比较容易出现故
  • Idea安装免注册版ChatGPT

    文章目录 一 前期准备 二 开始使用 一 前期准备 1 准备Idea开发软件并打开 VS Code同理 2 Ctrl Alt S 快捷键调出Settings窗口 如图 3 找到NexChatGPT 此插件不需要注册 可以直接使用 高级一些的
  • java中Synchronized和Lock的区别

    Synchronized和Lock的区别 原始构成 synchronized关键字属于JVM层面的 通过monitorenter monitorexit指令实现 底层是通过monitor对象来完成 其实wait notify等方法也依赖mo
  • Linux下安装QT4.3.2

    安装qt是因为我刚安装过mplayer想装个前端上网 一查 很多都推崇用smplayer 我也就下决心装上 刚开始一直都装不上 后来静心读了读Install文件才明白要装smplayer必须要有qt4 2或者更高版本 用rpm qa qt才
  • 短视频矩阵营销系统技术开发者开发笔记分享

    一 开发短视频seo抖音矩阵系统需要遵循以下步骤 1 确定系统需求 根据客户的需求 确定系统的功能和特点 例如用户注册登录 视频上传 视频浏览 评论点赞等 2 设计系统架构 根据系统需求 设计系统的整体架构 包括前端 后端 数据库等组件的功
  • 使用.NET构建登录网站

    摘要 本文将介绍如何使用 NET框架构建一个简单的登录网站 并附带每段代码的解释和讲解 帮助读者了解相关概念和功能 引言 在现代互联网应用中 登录系统是一个常见的功能模块 本文将使用 NET框架来创建一个简单的登录网站 演示如何进行用户认证
  • QT UDP简单的通信示例

    UDP user datagram protocol 即用户数据协议 是一个轻量级的 不可靠的 面向数据报的无连接协议 在qt中提供了QUdpSocket类来进行UDP数据报的发送和接收 在Pro中加入network模块 因为upd是无连接