导语

这一节讲述UDP编程的知识。UDP(UserDatagram Protocol即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。对于UDP我们不再进行过多介绍,如果你对UDP不是很了解,而且不知道它有什么用,那么这里就举个简单的例子:我们现在几乎每个人都使用的腾讯QQ,其聊天时就是使用UDP协议进行消息发送的。就像QQ那样,当有很多用户,发送的大部分都是短消息,要求能及时响应,并且对安全性要求不是很高的情况下使用UDP协议。

在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。这里我们还要了解一个名词Socket,也就是常说的“套接字”。 Socket简单地说,就是一个IP地址加一个port端口。因为我们要传输数据,就要知道往哪个机子上传送,而IP地址确定了一台主机,但是这台机子上可能运行着各种各样的网络程序,我们要往哪个程序中发送呢?这时就要使用一个端口来指定UDP程序。所以说,Socket指明了数据报传输的路径。

下面我们将编写两个程序,一个用来发送数据报,可以叫做客户端;另一个用来接收数据报,可以叫做服务器端,它们均应用UDP协议。这样也就构成了所谓的C/S(客户端/服务器)编程模型。我们会在编写程序的过程中讲解一些相关的网络知识。

环境:Windows Xp + Qt 4.8.5+QtCreator 2.8.0

目录

  • 一、发送端(客户端)
  • 二、接收端(服务器端)

正文

一、发送端(客户端)

1.新建Qt Gui应用。 项目名为udpSender,基类选择QWidget,类名为Widget。完成后在udpSender.pro文件中添加一行代码:QT += network,并保存该文件。

2.在widget.ui文件中,往界面上添加一个Push Button,更改其显示文本为“开始广播”,然后进入其单击事件槽函数。

3.我们在widget.h文件中更改。

添加头文件:#include <QtNetwork>

添加private私有对象:QUdpSocket *sender;

4.我们在widget.cpp中进行更改。

在构造函数中添加:sender = new QUdpSocket(this);

更改“开始广播”按钮的单击事件槽函数:

void Widget::on_pushButton_clicked() // 开始广播
{QByteArray datagram = "hello world!";sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,45454);
}

这里定义了一个QByteArray类型的数据报datagram,其内容为“hello world!”。然后我们使用QUdpSocket类的writeDatagram()函数来发送数据报,这个函数有四个参数,分别是数据报的内容,数据报的大小,主机地址和端口号。对于数据报的大小,它根据平台的不同而不同,但是这里建议不要超过512字节。这里使用了广播地址QHostAddress::Broadcast,这样就可以同时给网络中所有的主机发送数据报了。对于端口号,它是可以随意指定的,但是一般1024以下的端口号通常属于保留端口号,所以我们最好使用大于1024的端口,最大为65535。我们这里使用了45454这个端口号,一定要注意,在下面要讲的服务器程序中,也要使用相同的端口号。

5.发送端就这么简单,下面可以先运行程序。

二、接收端(服务器端)

1.新建Qt Gui 应用

工程名为udpReceiver,基类选择QWidget,类名为Widget。完成后在udpSender.pro文件中添加一行代码:QT += network,并保存该文件。

此时工程文件列表中应包含两个项目,如下图。

2.我们在udpReceiver项目中的widget.ui文件中,向界面上添加一个Label部件,更改其显示文本为“等待接收数据!”,效果如下。

3.我们在udpReceiver工程中的widget.h文件中更改。

添加头文件:#include <QtNetwork>

添加private私有对象:QUdpSocket *receiver;

添加私有槽函数:

private slots:
void processPendingDatagram();

4.我们在udpReceiver工程中的widget.cpp文件中更改。

在构造函数中:

receiver = new QUdpSocket(this);
receiver->bind(45454,QUdpSocket::ShareAddress);
connect(receiver,SIGNAL(readyRead()),
this,SLOT(processPendingDatagram()));

我们在构造函数中将receiver绑定到45454端口,这个端口就是上面发送端设置的端口,二者必须一样才能保证接收到数据报。这里使用了绑定模式QUdpSocket::ShareAddress,它表明其他服务也可以绑定到这个端口上。因为当receiver发现有数据报到达时就会发出readyRead()信号,所以将其和数据报处理函数相关联。

数据报处理槽函数实现如下:

void Widget::processPendingDatagram() //处理等待的数据报
{while(receiver->hasPendingDatagrams())  //拥有等待的数据报{QByteArray datagram; //拥于存放接收的数据报
//让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据datagram.resize(receiver->pendingDatagramSize());//接收数据报,将其存放到datagram中receiver->readDatagram(datagram.data(),datagram.size());//将数据报内容显示出来ui->label->setText(datagram);}
}

5.我们在项目列表中udpReceiver项目上点击鼠标右键,在弹出的菜单上选择run菜单来运行该工程。如下图所示。

6.第一次运行该程序时,系统可能会提示警告,我们选择“解除阻止”。 注意,如果是在linux下,你可能还需要关闭防火墙。

7.我们同时再运行udpSender程序。然后点击其上的“发送广播”按钮,这时会在udpReceiver上显示数据报的内容。效果如下。

结语

可以看到,UDP的应用是很简单的。我们只需要在发送端执行writeDatagram()函数进行数据报的发送,然后在接收端绑定端口,并关联readyRead()信号和数据报处理函数即可。

下一节我们讲述TCP的应用。

【Qt入门第36篇】 网络(六)UDP相关推荐

  1. [Qt教程] 第36篇 网络(六)UDP

    [Qt教程] 第36篇 网络(六)UDP 楼主  发表于 2013-9-5 11:38:50 | 查看: 241| 回复: 0 UDP 版权声明 该文章原创作者yafeilinux,转载请注明出处! ...

  2. 【Qt入门第1篇】 基础(一)Qt开发环境的搭建和hello world

    导语 从这一篇我们正式开始Qt编程.本篇主要讲解Qt编程环境的搭建.为了适应大多数读者的需要,同时为了避免系统环境的不同而产生不必要的问题,这里选择使用Windows系统的Qt版本.因为在前面几十篇中 ...

  3. QT入门第七天 网络编程TCP/IP/UDP+Http和JSON解析+qt事件软键盘【CSDN最详细】

    网络编程+Http和JSON解析+qt事件软键盘 第一章 QT中的网络编程 [1]涉及到的类 [2]tcp协议的流程 [2.1]服务器的流程 socket-->bind-->listen- ...

  4. 【Qt入门第31篇】 网络(一)Qt网络编程简介

    导语 从这一节开始我们讲述Qt网络应用方面的编程知识.在开始这部分知识的学习之前,大家最好已经拥有了一定的网络知识和Qt的编程基础.在后面的教程中我们不会对一个常用的网络名词进行详细的解释,对于不太了 ...

  5. 【Qt入门第34篇】 网络(四)FTP(二)

    导语 前面讲述了一个最简单的FTP客户端程序的编写,这一节我们将这个程序进行扩展,使其可以浏览并能下载服务器上的所有文件. 环境:Windows Xp + Qt 4.8.5+QtCreator 2.8 ...

  6. 【Qt入门第4篇】 基础(四)添加菜单图标——使用Qt资源文件

    导语 后面几篇里我们将介绍常用的Qt主窗口部件QMainWindow,主窗口部件就是一般的应用程序主窗口,它包含了菜单栏.工具栏.中心部件.状态栏和可停靠部件等.这一篇将着重介绍菜单的实现以及使用资源 ...

  7. 【Qt入门第23篇】 数据库(三)利用QSqlQuery类执行SQL语句

    导语 SQL即结构化查询语言,是关系数据库的标准语言.前面两节中已经在Qt里利用QSqlQuery类执行了SQL语句,这一节我们将详细讲解该类的使用.需要说明,因为我们重在讲解Qt中的数据库使用,而非 ...

  8. 【Qt入门第13篇】 2D绘图(三)绘制文字

    导语 Qt中除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontI ...

  9. 【Qt入门第17篇】 2D绘图(七)涂鸦板

    导语 通过前面几节的学习,大家应该已经对Qt中2D绘图有了一定的认识,这一节我们将应用前面讲到的内容,编写一个简单的涂鸦板程序,这一节只是实现最基本的鼠标画线功能. 环境:Windows Xp + Q ...

最新文章

  1. python实现简单的api接口-Python实现简单的API接口
  2. 增加数据_Photoshop XMP元数据沉积造成文件量增加
  3. phpstuday 修改网站访问目录
  4. 【Tools】C/C++开发SDK下载汇总
  5. pycharm设置anaconda并运行helloworld
  6. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_KDD2019: 使用神经网络为A*搜索算法赋能 --以个性化路径推荐为例...
  7. CD Linux U盘启动办法
  8. c语言 算术平均滤波法_单片机数字滤波的算法
  9. 秋招注意事项和面试通关攻略
  10. Servlet之请求转发和响应重定向
  11. python之条件判断、循环和字符串格式化
  12. 源代码管理器添加步骤
  13. 30.yii2 --- 全文检索简介
  14. ffplay不能直播red5上的直播流问题解决
  15. 1018. Binary Prefix Divisible By 5可被 5 整除的二进制前缀
  16. refprop物性库_refprop 9.0 下载-refprop9.0 32/64位下载(NIST物性查询软件) 中文版 - 河东下载站...
  17. Ubuntu16.04拨号上网
  18. PAT(甲级)2021年冬季考试 7-2 Rank a Linked List
  19. swoole php配置文件,EasySwoole分离配置文件
  20. 标识符 关键字 字面值 数据类型 进制换算 字符编码 变量 数据类型详解 运算符

热门文章

  1. [转载]FAE及其发展前景_史蒂文森sun_新浪博客
  2. 分布式事务框架_1024开源首发 | 金融级分布式事务框架 TXLE
  3. Xxl-Job执行器原理解析
  4. 龙珠直播CTO谭振林:从0到500万用户背后的技术架构变迁
  5. vue3小兔鲜商城项目学习笔记+资料分享05
  6. JAVA编程练习题(50题及答案11-20)
  7. 数量形状遗传率及计算方法
  8. 只读存储器和闪速存储器
  9. java 的学习历程(新手须知)
  10. 计算机工勤技能考试试题,河南省事业单位工勤技能考试试题 (计算机信息处理)...