用户数据报协议(User Data Protocol,UDP)是一种简单轻量级、不可靠、面向数据报、无连接的传输层协议,可以应用在可靠性不是十分重要的场合,如短消息、广播信息等。

适合应用的情况有一下几种:

  • 网络数据大多为短消息;
  • 拥有大量客户端;
  • 对数据安全性无特殊要求;
  • 网络负担非常重,但对响应速度要求高。

一、UDP协议工作原理

如图所示,UDP客户端向UDP服务器发送一定长度的请求报文,报文大小的限制与各系统的协议实现有关,但不得超过其下层IP协议规定的64KB;UDP服务器同样以报文形式作出响应。如果服务器未收到此请求,客户端不会进行重发,因此报文的传输是不可靠的。

二、UDP编程模型

下面介绍基于UDP协议的经典编程模型,程序编写的通用流程如图所示。

可以看出,在UDP方式下客户端并不与服务器建立连接,它只负责调用发送函数向服务器发出数据报。类似地,服务器也不从客户端接收连接,只负责调用接收函数,等待来自某客户端的数据到达。

Qt中通过QUdpSocket类实现UDP协议的编程。接下来通过一个实例,介绍如何实现基于UDP协议的广播应用,它由UDP服务器和UDP客户端两部分组成。

三、UDP服务器编程实例

  1. 工程文件

    QT += network
  2. 头文件
    #include <QDialog>
    #include <QLabel>
    #include <QLineEdit>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QUdpSocket>
    #include <QTimer>
    #include <QHostAddress>class UdpServer : public QDialog
    {Q_OBJECTpublic:UdpServer(QWidget *parent = 0,Qt::WindowFlags f=0);~UdpServer();public slots:void StartBtnClicked();void timeout();private:QLabel *TimerLabel;QLineEdit *TextLineEdit;QPushButton *StartBtn;QVBoxLayout *mainLayout;int port;bool isStarted;QUdpSocket *udpSocket;QTimer *timer;
    };
    
  3. 源文件
    #include "udpserver.h"UdpServer::UdpServer(QWidget *parent,Qt::WindowFlags f): QDialog(parent,f)
    {setWindowTitle(tr("UDP Server"));TimerLabel = new QLabel(tr("计时器:"),this);TextLineEdit = new QLineEdit(this);StartBtn = new QPushButton(tr("开始"),this);mainLayout = new QVBoxLayout(this);mainLayout->addWidget(TimerLabel);mainLayout->addWidget(TextLineEdit);mainLayout->addWidget(StartBtn);port = 5555;isStarted = false;udpSocket = new QUdpSocket(this);timer = new QTimer(this);connect(StartBtn,SIGNAL(clicked(bool)),this,SLOT(StartBtnClicked()));connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
    }UdpServer::~UdpServer()
    {
    }void UdpServer::StartBtnClicked()
    {if(!isStarted){StartBtn->setText(tr("停止"));timer->start(1000);isStarted = true;}else{StartBtn->setText(tr("开始"));isStarted = false;timer->stop();}
    }void UdpServer::timeout()
    {QString msg = TextLineEdit->text();int length = 0;if(msg=="") return;QByteArray sendBuff = msg.toUtf8();length=udpSocket->writeDatagram(sendBuff,sendBuff.length(), QHostAddress::Broadcast,port);if(length !=msg.length()) return;
    }
    

其中,

  • setWindowTitle(tr("UDP Server")):设置窗体的标题。
  • TimerLabel = new QLabel(tr("计时器: "),this)到mainLayout->addWidget(StartBtn)这段代码:初始化了各个控件并设置布局。
  • port =5555:设置UDP的端口号参数,服务器定时向此端口发送广播信息。
  • timer = new QTimer(this):创建一个QUdpSocket。
  • connect(timer,SIGNAL(timeout()),this,SLOT(timeout())):定时发送广播信息。
  • QHostAddress::Broadcast:指定向广播地址发送。

注意:发送消息时需要转成UTF-8,否则发送中文字符时客户端会受到乱码!

四、UDP客户端编程实例

  1. 工程文件

    QT += network
  2. 头文件
    #include <QDialog>
    #include <QVBoxLayout>
    #include <QTextEdit>
    #include <QPushButton>
    #include <QMessageBox>
    #include <QUdpSocket>
    #include <QHostAddress>class UdpClient : public QDialog
    {Q_OBJECTpublic:UdpClient(QWidget *parent = 0,Qt::WindowFlags f=0);~UdpClient();public slots:void CloseBtnClicked();void dateReceived();private:QTextEdit *ReceiveTextEdit;QPushButton *CloseBtn;QVBoxLayout *mainLayout;int port;QUdpSocket *udpSocket;
    };
    
  3. 源文件
    #include "udpclient.h"UdpClient::UdpClient(QWidget *parent,Qt::WindowFlags f): QDialog(parent,f)
    {setWindowTitle(tr("UDP Client"));ReceiveTextEdit = new QTextEdit(this);CloseBtn = new QPushButton(tr("close"),this);mainLayout = new QVBoxLayout(this);mainLayout->addWidget(ReceiveTextEdit);mainLayout->addWidget(CloseBtn);port = 5555;udpSocket = new QUdpSocket(this);connect(CloseBtn,SIGNAL(clicked(bool)),this,SLOT(CloseBtnClicked()));connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dateReceived()));bool result = udpSocket->bind(port);if(!result){QMessageBox::information(this,tr("error"),tr("udp socket create error!"));return;}
    }UdpClient::~UdpClient()
    {
    }void UdpClient::CloseBtnClicked()
    {close();
    }void UdpClient::dateReceived()
    {while (udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(),datagram.size());QString msg = QString::fromUtf8(datagram.data());ReceiveTextEdit->insertPlainText(msg);}
    }

其中,

  • setWindowTitle(tr("UDPClient"')):设置窗体的标题。
  • ReceiveTextEdit = new QTextEdit(this)到 mainLayout->addWidget(CloseBtn)这段代码:初始化各个控件并设置布局。
  • port =5555:设置UDP的端口号参数,指定在此端口上监听数据。
  • udpSocket = new QUdpSocket(this):创建一个QUdpSocket。
  • connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dateReceived())) :连接QIODevice的readyRead()信号。QUdpSocket 也是一个IO设备,从QIODevice继承而来,当有数据到达I/O设备时,发出readyRead()信号。
  • bool result=udpSocket->bind(port):绑定到指定的端口上。
  • while(udpSocket->hasPendingDatagrams()):判断UdpSocket中是否有数据报可读,hasPendingDatagrams()方法在至少有一个数据报可读时返回true,否则返回false。
  • QByteArray datagram到udpSocket->readDatagram(datagram.data(),datagram.size())这段代码:实现了读取第一个数据报,pendingDatagramSize()可以获得第一个数据报的长度。
  • ReceiveTextEdit->insertPlainText(msg):显示数据内容。

最终效果

Qt基于UDP的网络广播程序相关推荐

  1. QT学习:基于UDP的网络广播程序

    用户数据报协议(User Data Protocol,UDP)是一种简单轻量级.不可靠.面向数据报.无连接的 传输层协议,可以应用在可靠性不是十分重要的场合,如短消息.广播信息等. 适合应用的情况有以 ...

  2. 【基于UDP的网络聊天室】

    总结下近期写的小项目,在学习中同时积累解决问题的经验,以及真正的项目中解决问题的思路,如有不合理地方,请多指教! 一.项目名称 基于UDP的网络聊天室 二.功能 1.当有新用户登录时,其他在线用户可以 ...

  3. 基于UDP的网络聊天室网络编程0811作业-洪庆乐

    项目:基于UDP的网络聊天室 功能:1.服务器日志系统,且可以查看(实现) 2.有用户,其他用户收到这个人登入信息(实现) 3.群发消息(实现) 4.如果有用户下线,其他用户收到下线消息(实现) 5. ...

  4. python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...

    实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...

  5. Qt 基于http的网络文件下载

    1.需要用到的类 QNetworkAccessManager类用于协调网络操作,负责发送网络请求,创建网络响应 QNetworkReply类表示网络请求的响应.在QNetworkAccessManag ...

  6. Qt之QUdpSocket定时器网络广播

    UDP(用户数据报协议)是一个轻量级的,不可靠的,面向数据报的,无连接协议.当可靠性不是很重要的时候就可以使用该协议. 程序实现功能:1.设定时间发送信息 2.服务端和客户端在同一个程序 3.可以发送 ...

  7. 基于UDP的网络群聊聊天室

    目录 聊天室的功能: 链表节点结构体 自定义应用层协议结构体,用来传输数据 服务器程序及客户端程序所使用的函数 系统提供的部分函数 1.socket 2.bind 3.listen 4.fork 5. ...

  8. Python网络编程——面向连接(TCP)和无连接(UDP)时间戳网络小程序

    网络编程--基于TCP的网络应用程序 服务器 步骤 备注 创建socket对象 关键字:AF_INET, SOCK_STREAM,其中,AF_INTE代表地址家族:因特网.SOCK_STREAM是so ...

  9. 基于UDP广播的局域网聊天工具

     最近项目在做一个基于UDP模式的通信程序,考虑到项目的需求有一对多的需要,所以采用socket UDP广播模式进行数据通信.网上了解了一下知道这种模式也是目前QQ采用的方式,于是为了更好的理解s ...

最新文章

  1. xml file too big to import to wordpress website
  2. 使用metasploit收集邮箱
  3. Kingbase金仓更改表空间
  4. Struts2理解——转发和重定向
  5. bootstrap php zend,Zend Framework教程之Bootstrap类用法概述
  6. centos调整页面大小_这2种方法都能调整PDF文档的纸张大小
  7. java常见对象_Java各种对象理解
  8. linux 模拟运行 微信,Ubuntu 18.04 安装微信(Linux通用)
  9. 网站界面设计没有灵感,不妨去探索广袤的大自然!
  10. 各浏览器中的鼠标滚轮事件处理
  11. python内存池机制,python基础—12python内存管理机制
  12. 【转载】SQL Server XML Path
  13. 【Docker篇之三】Dockerfile创建镜像
  14. unity串口 连接多个串口崩溃_必学DB9串口+3种连接方式
  15. 参考文献引用格式实例
  16. 剑指 Offer 总结 - leetcode 剑指offer系列
  17. WIN7通过mount挂载nfs配置root权限,解决不可写的问题
  18. 【ECharts教程】在实战中学习(超炫酷的数据可视化大屏)
  19. 金士顿内存条真假测试软件,金士顿内存条真伪怎么看?金士顿内存条判别真伪的几种方法...
  20. sd卡卡槽_一种SD卡卡槽的制作方法

热门文章

  1. 五险一金都是指什么--摘录
  2. 视频教程-SharePoint 搜索教程-其他
  3. 开发板diy linux电脑,利用开源开发板自制的平板电脑
  4. P1512 伊甸园日历游戏
  5. 【Python实战】全球疫情数据采集, 并做可视化展示
  6. 2004年雅典奥运会歌曲《A thousyear》铃声 2004年雅典奥运会歌...
  7. Ascent公司为其芝加哥CH2数据中心提高电力容量
  8. 【黑马真经秘籍】之Maven
  9. ARM64基础0:ARM64架构简介
  10. 51单片机数码管自行车里程速度计表霍尔传感器MAX7219数码管