Qt基于UDP的网络广播程序
用户数据报协议(User Data Protocol,UDP)是一种简单轻量级、不可靠、面向数据报、无连接的传输层协议,可以应用在可靠性不是十分重要的场合,如短消息、广播信息等。
适合应用的情况有一下几种:
- 网络数据大多为短消息;
- 拥有大量客户端;
- 对数据安全性无特殊要求;
- 网络负担非常重,但对响应速度要求高。
一、UDP协议工作原理
如图所示,UDP客户端向UDP服务器发送一定长度的请求报文,报文大小的限制与各系统的协议实现有关,但不得超过其下层IP协议规定的64KB;UDP服务器同样以报文形式作出响应。如果服务器未收到此请求,客户端不会进行重发,因此报文的传输是不可靠的。
二、UDP编程模型
下面介绍基于UDP协议的经典编程模型,程序编写的通用流程如图所示。
可以看出,在UDP方式下客户端并不与服务器建立连接,它只负责调用发送函数向服务器发出数据报。类似地,服务器也不从客户端接收连接,只负责调用接收函数,等待来自某客户端的数据到达。
Qt中通过QUdpSocket类实现UDP协议的编程。接下来通过一个实例,介绍如何实现基于UDP协议的广播应用,它由UDP服务器和UDP客户端两部分组成。
三、UDP服务器编程实例
- 工程文件
QT += network
- 头文件
#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; };
- 源文件
#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客户端编程实例
- 工程文件
QT += network
- 头文件
#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; };
- 源文件
#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的网络广播程序相关推荐
- QT学习:基于UDP的网络广播程序
用户数据报协议(User Data Protocol,UDP)是一种简单轻量级.不可靠.面向数据报.无连接的 传输层协议,可以应用在可靠性不是十分重要的场合,如短消息.广播信息等. 适合应用的情况有以 ...
- 【基于UDP的网络聊天室】
总结下近期写的小项目,在学习中同时积累解决问题的经验,以及真正的项目中解决问题的思路,如有不合理地方,请多指教! 一.项目名称 基于UDP的网络聊天室 二.功能 1.当有新用户登录时,其他在线用户可以 ...
- 基于UDP的网络聊天室网络编程0811作业-洪庆乐
项目:基于UDP的网络聊天室 功能:1.服务器日志系统,且可以查看(实现) 2.有用户,其他用户收到这个人登入信息(实现) 3.群发消息(实现) 4.如果有用户下线,其他用户收到下线消息(实现) 5. ...
- python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...
实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...
- Qt 基于http的网络文件下载
1.需要用到的类 QNetworkAccessManager类用于协调网络操作,负责发送网络请求,创建网络响应 QNetworkReply类表示网络请求的响应.在QNetworkAccessManag ...
- Qt之QUdpSocket定时器网络广播
UDP(用户数据报协议)是一个轻量级的,不可靠的,面向数据报的,无连接协议.当可靠性不是很重要的时候就可以使用该协议. 程序实现功能:1.设定时间发送信息 2.服务端和客户端在同一个程序 3.可以发送 ...
- 基于UDP的网络群聊聊天室
目录 聊天室的功能: 链表节点结构体 自定义应用层协议结构体,用来传输数据 服务器程序及客户端程序所使用的函数 系统提供的部分函数 1.socket 2.bind 3.listen 4.fork 5. ...
- Python网络编程——面向连接(TCP)和无连接(UDP)时间戳网络小程序
网络编程--基于TCP的网络应用程序 服务器 步骤 备注 创建socket对象 关键字:AF_INET, SOCK_STREAM,其中,AF_INTE代表地址家族:因特网.SOCK_STREAM是so ...
- 基于UDP广播的局域网聊天工具
最近项目在做一个基于UDP模式的通信程序,考虑到项目的需求有一对多的需要,所以采用socket UDP广播模式进行数据通信.网上了解了一下知道这种模式也是目前QQ采用的方式,于是为了更好的理解s ...
最新文章
- xml file too big to import to wordpress website
- 使用metasploit收集邮箱
- Kingbase金仓更改表空间
- Struts2理解——转发和重定向
- bootstrap php zend,Zend Framework教程之Bootstrap类用法概述
- centos调整页面大小_这2种方法都能调整PDF文档的纸张大小
- java常见对象_Java各种对象理解
- linux 模拟运行 微信,Ubuntu 18.04 安装微信(Linux通用)
- 网站界面设计没有灵感,不妨去探索广袤的大自然!
- 各浏览器中的鼠标滚轮事件处理
- python内存池机制,python基础—12python内存管理机制
- 【转载】SQL Server XML Path
- 【Docker篇之三】Dockerfile创建镜像
- unity串口 连接多个串口崩溃_必学DB9串口+3种连接方式
- 参考文献引用格式实例
- 剑指 Offer 总结 - leetcode 剑指offer系列
- WIN7通过mount挂载nfs配置root权限,解决不可写的问题
- 【ECharts教程】在实战中学习(超炫酷的数据可视化大屏)
- 金士顿内存条真假测试软件,金士顿内存条真伪怎么看?金士顿内存条判别真伪的几种方法...
- sd卡卡槽_一种SD卡卡槽的制作方法