udp通信分为发送端和接收端,通信步骤可以分为以下:

接收端:
  1. 创建QUdpSocket对象。在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针。
  2. bind()。绑定IP和端口。
  3. connect()。绑定readyRead()信号,当有数据到来的时候,触发这个信号,在对应的槽函数中处理数据,读数据调用readDatagram()函数,在第三,四个参数可以保存发送端的IP和端口。
发送端:

1.创建QUdpSocket对象。在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针。
2.发送数据。调用writeDatagram()函数发送数据到指定的IP和端口。
下面是界面效果:


发送端的代码:
Send.h

#ifndef SEND_H
#define SEND_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Send; }
QT_END_NAMESPACEclass QUdpSocket;class Send : public QDialog
{Q_OBJECTpublic:Send(QWidget *parent = nullptr);~Send();private slots:void on_textEdit_cursorPositionChanged();void on_sendButton_clicked();private:Ui::Send *ui;QUdpSocket *sender;
};
#endif // DIALOG_H

Send.cpp

#include "Send.h"
#include "ui_Send.h"
#include <QtNetwork>
#include <QDebug>Send::Send(QWidget *parent): QDialog(parent), ui(new Ui::Send)
{ui->setupUi(this);setWindowTitle(tr("发送端"));sender = new QUdpSocket(this);ui->sendButton->setEnabled(false);
}Send::~Send()
{delete ui;
}void Send::on_textEdit_cursorPositionChanged()
{if(!ui->textEdit->toPlainText().isEmpty()){ui->sendButton->setEnabled(true);}
}void Send::on_sendButton_clicked()
{QByteArray text = ui->textEdit->toPlainText().toUtf8();//每次只发送输入的哪些文字,不会追加qint64 bytes = sender->writeDatagram(text,text.size(),QHostAddress::LocalHost,7777);if(bytes == -1){qDebug()<<"发送数据失败!";return ;}
}

接收端的代码:
Receive.h

#ifndef RECEIVE_H
#define RECEIVE_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Receive; }
QT_END_NAMESPACEclass QUdpSocket;
class QTimer;class Receive : public QDialog
{Q_OBJECTpublic:Receive(QWidget *parent = nullptr);~Receive();
private slots:void slot_readyRead();void slot_error();void slot_timeout();
private:Ui::Receive *ui;QUdpSocket *receiver;QTimer *timer;
};
#endif // RECEIVE_H

Receive.cpp

#include "receive.h"
#include "ui_receive.h"
#include <QtNetwork>
#include <QDebug>
#include <QTimer>Receive::Receive(QWidget *parent): QDialog(parent), ui(new Ui::Receive)
{ui->setupUi(this);setWindowTitle(tr("接收端"));receiver = new QUdpSocket(this);receiver->bind(QHostAddress("127.0.0.1"),7777);connect(receiver,&QUdpSocket::readyRead,this,&Receive::slot_readyRead);timer = new QTimer(this);connect(timer,&QTimer::timeout,this,&Receive::slot_timeout);
//    void (QUdpSocket:: *errorSign)(QAbstractSocket::SocketError) = &QUdpSocket::error;
//    connect(receiver,errorSign,this,&Receive::slot_error);//用不上error信号,发送端与接收端是无连接的,给关闭发送端,//对于接收端没有联动的影响
}Receive::~Receive()
{delete ui;
}void Receive::slot_readyRead()
{if(receiver->hasPendingDatagrams()){QHostAddress sendAddr;//发送者的IP地址quint16 port;//发送者的端口QByteArray text;text.resize(receiver->pendingDatagramSize());receiver->readDatagram(text.data(),(qint64)text.size(),&sendAddr,&port);qDebug()<<sendAddr.toString()<<port;//输出发送端的IP和端口号,(端口号还不是和能理解,为什么不是7777)ui->textEdit->setPlainText(text);//会自动在上一次的内容后面追加ui->label->setText(tr("数据接收完成!"));timer->start(2000);}
}void Receive::slot_error()
{qDebug()<<receiver->errorString();receiver->close();
}void Receive::slot_timeout()
{ui->label->setText(tr(" "));
}

以上是UDP通信时,发送端与接收端的代码,其main.cpp文件没有任何的改变,所以没有贴,由于Udp是无连接的,所以最后关于close()套接字,一般没有用到,因为发送完消息之后,调用close()来关闭套接字和没有调用close()关闭套接字的效果是一样的,他们之间没有连接,只是在传输数据时指定了端口与IP,当然很多东西还没有接触到具体视情况而定close()的有无。

Qt中UDP通信的简单示例相关推荐

  1. Qt中Tcp通信的简单使用二

    tcp编程中写的一个简单的单项传输数据的小例子,和上一节一样,分为客户端和服务端程序,下面看一下界面的效果. 创建的方法和之前一样,上面上代码: 客户端 Client.h #ifndef CLIENT ...

  2. 浅谈 Qt 中 UDP 之 UdpSocket通信实例

    浅谈 Qt 中 UDP  写这篇博客的原因是Java大作业最近完成了一个简单的聊天室.也是基于UDP的.正好我们在学习Qt.所以我想能不能再qt中同样实现这样一个问题.于是我进行的代码的编辑.以及其他 ...

  3. unity中UDP通信

    unity中UDP通信 服务器: using System; using System.Collections; using System.Collections.Generic; using Sys ...

  4. qt 实现UDP通信简单案例

    实现效果 实现功能 创建两个界面,可以通过udp进行通信,并显示通信内容. 界面部分由代码实现,并使用qss简单美化. udp通信由创建套接字,绑定端口号,发送和接收数据函数完成. 代码实现 创建第一 ...

  5. QT中串口通信程序(转)

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...

  6. qt中socket通信流程图_基于Qt的局域网通信设计说明书.doc

    文档控制记录 序号版本日期修改内容修改人审批人1V1.02017-04-24创建2 目录目录4 辅助功能设计14 1目的 本文主要介绍利用Qt实现局域网通信的主要实现流程和一些技术知识点的设计说明. ...

  7. QT TCP/UDP通信

    参考:43黑马QT笔记之Qt下Tcp/Udp通信过程_Mango酱的博客-CSDN博客 HTTP与TCP的区别和联系_satellite13的博客-CSDN博客 TCP和UDP的区别: UDP通信 服 ...

  8. Qt使用UDp通信、套接字socket的成员函数bind()的作用

    一. 所谓bind,就是指绑定本地接受端口.          指定ip,是为了分辨多ip主机.在有服务端和客户端的UDP中,bind是服务端调用的函数,绑定的是服务端的IP,假设服务端有多个网卡,即 ...

  9. 【Qt】 Qt中实时更新UI程序示例

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 实时更新UI(非信号与槽) 04. 实时更新UI(信号与槽) 05. 源码下载 06. 附录 01. 概述 Qt在运行时会 ...

最新文章

  1. NOIP模拟 蛋糕(DP+Dilworth定理)
  2. 分布式多层次限流概述
  3. AspectJ对AOP的实现
  4. HTML5 Canvas Text文本居中实例
  5. sigmastarSSD201/SSD202 github上开源了!
  6. chmod 755 是李鬼(转)
  7. Teams 的逻辑架构与语音解决方案 - Official Posters Download
  8. influxDB的安装和简单使用
  9. java确定同一用户登录_java保持同一时间同一账号只能在一处登录
  10. 【C语言】双人格斗小游戏(源码)
  11. 育网校园云盘,私有云盘,电子备课系统。
  12. 【HTML练习】登录注册界面模板1
  13. JAVA综合实习报告
  14. Google地图实时轨迹
  15. Mac上安装最流畅的Windows XP Lite(免费虚拟机VirtualBox)
  16. Scratch软件编程等级考试一级——20220918
  17. 自学2 MATLAB图形处理
  18. Select 选择器自定义筛选功能(支持简拼\全拼\汉字搜索)
  19. Flume 海量日志收集利器
  20. arm-3-中断体系结构

热门文章

  1. 蚂蚁金服 3 个项目进入 CNCF 云原生全景图 | 开源
  2. 使用EMR-Kafka Connect进行数据迁移
  3. Flutter for Web 详细预研
  4. 阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准
  5. “练好内功坚持被集成”,阿里云发布SaaS加速器
  6. 离线计算成本节省的神兵利器
  7. 长江存储发布PCle4.0 固态硬盘致态TiPro7000,顺序读取7400MB/s
  8. 最新光子计算处理器面世:单个光子芯片集成超万个光子器件,频率达1GHz
  9. 新型数据中心需要什么样的存储
  10. 第四范式:现代存储架构下的系统优化实践