[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) 



相关文章
|
13天前
|
监控 网络协议 网络性能优化
如何办理支持UDP协议的网络
在当今网络环境中,UDP(用户数据报协议)因传输速度快、延迟低而广泛应用于在线游戏、视频流媒体、VoIP等实时服务。本文详细介绍了办理支持UDP协议网络的方法,包括了解UDP应用场景、选择合适的ISP及网络套餐、购买支持UDP的设备并进行优化设置,以及解决常见问题的策略,帮助用户确保网络稳定性和速度满足实际需求。
|
15天前
|
网络协议 开发者 Python
网络编程小白秒变大咖!Python Socket基础与进阶教程,轻松上手无压力!
在网络技术飞速发展的今天,掌握网络编程已成为开发者的重要技能。本文以Python为工具,带你从Socket编程基础逐步深入至进阶领域。首先介绍Socket的概念及TCP/UDP协议,接着演示如何用Python创建、绑定、监听Socket,实现数据收发;最后通过构建简单的聊天服务器,巩固所学知识。让初学者也能迅速上手,成为网络编程高手。
50 1
|
23天前
|
网络协议
UDP协议在网络通信中的独特应用与优势
UDP(用户数据报协议)作为关键的传输层协议,在网络通信中展现出独特优势。本文探讨UDP的无连接性及低开销特性,使其在实时性要求高的场景如视频流、在线游戏中表现优异;其不保证可靠交付的特性赋予应用程序自定义传输策略的灵活性;面向报文的高效处理能力及短小的包头设计进一步提升了数据传输效率。总之,UDP适用于高速、实时性强且对可靠性要求不高的应用场景,为网络通信提供了多样化的选择。
|
1月前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
1月前
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
1月前
|
C语言
C语言 网络编程(九)并发的UDP服务端 以线程完成功能
这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
|
1月前
|
网络协议 视频直播 C语言
C语言 网络编程(三)UDP 协议
UDP(用户数据报协议)是一种无需建立连接的通信协议,适用于高效率的数据传输,但不保证数据的可靠性。其特点是无连接、尽力交付且面向报文,具备较高的实时性。UDP广泛应用于视频会议、实时多媒体通信、直播及DNS查询等场景,并被许多即时通讯软件和服务(如MSN/QQ/Skype、流媒体、VoIP等)采用进行实时数据传输。UDP报文由首部和数据部分组成,首部包含源端口、目的端口、长度和校验和字段。相比TCP,UDP具有更高的传输效率和更低的资源消耗。
|
2月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
75 2
|
2月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03
|
1月前
|
网络协议
网络协议概览:HTTP、UDP、TCP与IP
理解这些基本的网络协议对于任何网络专业人员都是至关重要的,它们不仅是网络通信的基础,也是构建更复杂网络服务和应用的基石。网络技术的不断发展可能会带来新的协议和标准,但这些基本协议的核心概念和原理将继续是理解和创新网络技术的关键。
69 0

推荐镜像

更多
下一篇
无影云桌面