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

简介:
楼主
  发表于 2013-9-5 11:38:50  | 查看: 241 | 回复: 0
UDP

版权声明

该文章原创作者yafeilinux,转载请注明出处!



导语

这一节讲述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,并保存该文件。
此时工程文件列表中应包含两个项目,如下图。


01.jpg



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菜单来运行该工程。如下图所示。


02.jpg



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


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



03.jpg



结语


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





涉及到的源码:  udpSender.rar (1.6 KB, 下载次数: 4)  udpReceiver.rar (1.86 KB, 下载次数: 4) 



相关文章
|
9月前
|
安全 网络协议 算法
Nmap网络扫描工具详细使用教程
Nmap 是一款强大的网络发现与安全审计工具,具备主机发现、端口扫描、服务识别、操作系统检测及脚本扩展等功能。它支持多种扫描技术,如 SYN 扫描、ARP 扫描和全端口扫描,并可通过内置脚本(NSE)进行漏洞检测与服务深度枚举。Nmap 还提供防火墙规避与流量伪装能力,适用于网络管理、渗透测试和安全研究。
1404 1
|
11月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
1944 0
|
数据采集 存储 监控
Python 原生爬虫教程:网络爬虫的基本概念和认知
网络爬虫是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据采集、新闻聚合和价格监控等领域。其工作流程包括 URL 调度、HTTP 请求、页面下载、解析、数据存储及新 URL 发现。Python 因其丰富的库(如 requests、BeautifulSoup、Scrapy)和简洁语法成为爬虫开发的首选语言。然而,在使用爬虫时需注意法律与道德问题,例如遵守 robots.txt 规则、控制请求频率以及合法使用数据,以确保爬虫技术健康有序发展。
1605 31
|
域名解析 API PHP
VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程
本文介绍了如何通过网络穿透技术让公网直接访问家庭电脑,充分发挥本地硬件性能。相比第三方服务受限于转发带宽,此方法利用自家宽带实现更高效率。文章详细讲解了端口映射教程,包括不同网络环境(仅光猫、光猫+路由器)下的设置步骤,并提供实时同步动态IP的两种方案:自建服务器或使用三方API接口。最后附上VM虚拟机全版本下载链接,便于用户在穿透后将服务运行于虚拟环境中,提升安全性与适用性。
1115 7
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
586 20
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
467 5
|
前端开发 小程序 Java
uniapp-网络数据请求全教程
这篇文档介绍了如何在uni-app项目中使用第三方包发起网络请求
1092 3
|
存储 数据可视化 API
重磅干货,免费三方网络验证[用户系统+CDK]全套API接口分享教程。
本套网络验证系统提供全面的API接口,支持用户注册、登录、数据查询与修改、留言板管理等功能,适用于不想自建用户系统的APP开发者。系统还包含CDK管理功能,如生成、使用、查询和删除CDK等。支持高自定义性,包括20个自定义字段,满足不同需求。详细接口参数及示例请参考官方文档。
763 7
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
937 3
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
1003 10

推荐镜像

更多
  • qt