一、前言

UDP 是一个不可靠的,面向数据报的协议。QUdpSocket 类可以用来发送和接收UDP数据报(datagram)。

最常用的使用方式是使用bind()去绑定地址和端口号,然后使用writeDatagram()和readDatagram()去传输数据。

这个socket对象每次往网络中发送报文都会发出bytesWritten()信号。如果你只是想用QUdpSocket发送报文,就不需要调用bind().

当报文到达的时候会发readyRead()信号,在这种情况下,hasPendingDatagrams()会返回true.调用 pendingDatagramSize()方法获取报文的长度。最后调用readDatagram()读取。

二、QUDPSocekt

下面的实例WeatherServery应用程序模拟气象气球的功能,每2秒就发送一个包含当前天气情况的UDP数据报。

#ifndef WEATHERBALLOON_H
#define WEATHERBALLOON_H#include <QWidget>
#include <QPushButton>
#include <QtNetwork/QUdpSocket>
#include <QTimer>
#include <QDateTime>
namespace Ui {class weatherBalloon;
}class weatherBalloon : public QWidget
{Q_OBJECTpublic:explicit weatherBalloon(QWidget *parent = 0);~weatherBalloon();private slots://处理报文void processPendingDatagrams();//发送报文void sendDatagram();
private:Ui::weatherBalloon *ui;QUdpSocket udpSocket;QTimer timer; double temperature;//温度double humidity;//湿度double altitude;//高度
};#endif // WEATHERBALLOON_H

WeatherServer的实现

#include "weatherballoon.h"
#include "ui_weatherballoon.h"weatherBalloon::weatherBalloon(QWidget *parent) :QWidget(parent),ui(new Ui::weatherBalloon)
{//绑定Socket到指定地址和端口号udpSocket.bind(5824);ui->setupUi(this);connect(ui->btn_close,SIGNAL(clicked()),this,SLOT(close()));connect(&timer,SIGNAL(timeout()),this,SLOT(sendDatagram()));connect(&udpSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));timer.start(2*1000);temperature = 10.2;humidity   = 5.4;altitude   = 100.0;setWindowTitle(tr("Weather Balloon"));
}weatherBalloon::~weatherBalloon()
{delete ui;
}//发送报文
void weatherBalloon::sendDatagram(){QByteArray datagram;QDataStream out(&datagram,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_4_8);out<<QDateTime::currentDateTime()<<temperature<<humidity<<altitude;qDebug()<<QDateTime::currentDateTime();QHostAddress address;address.setAddress("127.0.0.1");udpSocket.writeDatagram(datagram,address,5824);
}//处理报文
void weatherBalloon::processPendingDatagrams(){QByteArray datagram;do{datagram.resize(udpSocket.pendingDatagramSize());udpSocket.readDatagram(datagram.data(),datagram.size());}while(udpSocket.hasPendingDatagrams());QDateTime dateTime;double temperature;double humidity;double altitude;qDebug()<<"recive date ";QDataStream in(&datagram,QIODevice::ReadOnly);in.setVersion(QDataStream::Qt_4_8);in>>dateTime>>temperature>>humidity>>altitude;ui->lineEdit_Date->setText(dateTime.date().toString());ui->lineEdit_CurrentTime->setText(dateTime.time().toString());ui->lineEdit_Temperature->setText(tr("%1 °c").arg(temperature));ui->lineEdit_Humidity->setText(tr("%1%").arg(humidity));ui->lineEdit_Alt->setText(tr("%1 m").arg(altitude));}

三、发送结构体及解析其数据

发送端:
头文件中建立结构体state:

#pragma pack(1) //此时编译器字节对齐方式为1byte,且为不进栈模式[#pragma push(pack,1)]
struct state{int order;int speed;double longitude;double latitude;
};#pragma pack()

实现cpp文件:

state data;
data.order=1;
data.speed=50;
data.longitude=120.34;
data.latitude=36.89;
udpSocket->writeDatagram((char*)&data,sizeof(data),QQHostAddress::Broadcast,port);

接收端
在头文件中建立结构体,与发送端一样。

接收cpp文件:

state datagram;
udpSocket->readDatagram((char*)&datagram,sizeof(datagram));

然后就可以读取结构体数据,像这样:

int Order=datagram.order;
int Speed=datagram.speed;
double Longitude=datagram.longitude;
double Latitude=datagram.latitude;

参考资料:

C++ GUI Qt5 编程

Qt 帮助文档中关于QUdpSocket

基于Qt的UDP协议实现及解析数据相关推荐

  1. UDP协议疑难杂症全景解析

    UDP协议疑难杂症全景解析 转载:http://blog.csdn.net/dog250/article/details/6896949 UDP协议疑难杂症全景解析 2011-10-22 19:26  ...

  2. 基于C#的UDP协议的同步实现

    一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visual Studio 2010 三.实验原理 UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述. 四.实例  4.1 ...

  3. 基于QT和UDP Socket实现的即时通信软件

    摘 要 随着计算机应用技术的快速发展和日益普及,网络也遍及到我们生活的每个角落,为我们的学习和工作带来极大的方便.现很多人都使用网络通讯软件来进行聊天.交流,这种软件极大地缩短了人与人之间的沟通距离, ...

  4. udp协议没有粘包问题、基于socketserver实现并发的socket(基于tcp、udp协议)、基于udp协议的套接字、操作系统原理以及进程知识

    基于udp协议的套接字通信服务端 from socket import *server=socket(AF_INET,SOCK_DGRAM) #数据报协议->udp server.bind((' ...

  5. 基于应急广播国标协议的IP解析工具

    本文提供基于应急广播国标协议<GDJ 089-2018 应急广播大喇叭系统技术规范>中的附录A.D.E协议进行解析的方法和工具. 在此声明下次解析方法已经申请了公司专利了,但是工具可以提供 ...

  6. 基于TCP或UDP协议的应用层协议

    TCP和UDP都是传输层协议,上面是应用层,下面是网络层 TCP与UDP区别: TCP(传输控制协议)提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连 ...

  7. 基于 python 和 UDP 协议实现简易聊天室(多人群聊)----详细解析带字幕

    聊天室项目 功能介绍: 1.进入聊天室:输入姓名,用户名(不能重复) 2.某个成员进入聊天室后给其他所有所有成员发送消息 3.任何一个人发消息,其他人都会收到 4.某人退出聊天室,其他成员也会收到通知 ...

  8. UDP协议的详细解析

    UDP数据报 一.UDP的概述(User Datagram Protocol,用户数据报协议) UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测. UDP ...

  9. PC基于wifi采用UDP协议实现ESP32无线图传显示在1.44寸屏幕

    开发环境:Ubuntu16.04 ESP32:Arduino PC图传:Python3.6.9 首先上python代码 import socket import cv2 import numpy as ...

最新文章

  1. Spring Aop的应用
  2. ERP_Oracle Erp 11i 和 R12的区别概述(概念)
  3. python爬虫意思_python为什么叫爬虫
  4. java设计模式_模版模式
  5. 02-对图像进行边界填充
  6. 【转】CT层厚、层间距、层间隔的概念是什么,MRI的层厚、层间距、曾间隔是什么
  7. 矩池云上编译安装dlib库
  8. html form 返回的数据类型,HTML表单
  9. echarts x轴加箭头,ECharts X轴(xAxis)
  10. 01.mac下安装配置maven
  11. C语言重载谭浩强,(完整)C语言谭浩强学习笔记(50页)-原创力文档
  12. 软件过程与项目管理复习
  13. 电脑桌面计算机软件不见了,电脑桌面图标不见了怎么恢复?
  14. LaTeX 页眉设置
  15. 魔界/指环王三部曲(加长版)在线观看免费bt下载
  16. 第三方Android应用商店也有安全问题
  17. 牙医管家牙科软件APP功能-“看牙无忧”口腔分期功能介绍
  18. 华为服务器RH2288 V2 BIOS配置
  19. python简易程序教程_Python-自制简易程序挂机刷御魂
  20. MTK Android Led框架分析

热门文章

  1. linux php -r,了解Linux
  2. 思科 接入点 本地转发_思科路由器配置 IPv6 和 OSPFv3 路由
  3. jquerymobile iscrollview
  4. Ora-12505 故障
  5. 使用idea开发SpringBoot应用,添加@SpringBootApplication注解时,不能自动提示
  6. iphone socket讲解
  7. java单人多人聊天_java简单多人聊天
  8. flash制作文字笔顺_flash动画课件制作有什么优点
  9. Hibernate使用的一些细节注意事项
  10. html插入视频时不自动播放,html5中嵌入视频自动播放的问题解决