QT UDP数据传输
(一)计算机网络
通过某种方式将多台计算机进行连接,实现多台计算机彼此之间的互联以及数据的交换。即在不同的计算机上编写一些实现了网络连接的程序,这些程序可以实现位于同一个网络中的计算机之间的数据的交换。
(二)网络通信协议
同一个网络中的计算机进行连接和通信时的规则,目前应用最广泛的是TCP/IP协议(包括,IP协议、TCP协议,UDP协议,ICMP协议等)。在进行数据传输时,要求发送的数据与接收到的数据完全一样,这时,就需要在原有的数据上添加很多信息,以保证数据在传输过程中数据格式完全一致。TCP/IP协议的层次分为4层。
应用层--如 HTTP、FTP、DNS
主要负责应用程序的协议,如HTTP协议,FTP协议。
传输层--如 TCP、UDP
主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
网络层-- 如 IP协议,ICMP、IGMP
整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
链路层-- 如 驱动程序,接口
用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤,双绞线的驱动。
(三)UDP协议与TCP协议
传输层协议主要使网络程序进行通信。
UDP(用户数据协议):无连接通信协议数据传输时,数据的发送端和接收端不建立逻辑连接。即当一台计算机向另一台计算机发送数据时,数据的发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。所以利用UDP进行网络通信,只要知道对方的IP地址和端口号就可以了。
优点:UDP协议消耗资源小,通信效率高。(音频,视频的传送)
TCP(传输控制协议):面向连接的通信协议即在传输数据前先在发送端和接收端简单逻辑连接,然后再传输数据,它提供两台计算机之间可靠无差错的数据传输(下载文件)。在TCP连接中必须明确客户端与服务器端,由客户段向服务器端发出连接请求,每次连接,需要经过”三次握手“。
第一次:客户端向服务器发出连接请求,等待服务器确认。
第二次:服务器端向客户端回送一个响应,通知客户端收到了连接请求。
第三次:客户端再次向服务器端发送确认信息,确认连接。
(四)IP地址和端口号
IP地址:它可以唯一标识一台计算机。
端口:在计算机中,不同的应用程序通过端口号来区分,通过IP地址连接到计算机后,如果想要访问计算机中的某个应用程序,还需要指定的端口号。
(五)UDP单播、广播和多播
单播用于两个主机之间的端对端通信。广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。
(六)Qt中实现
Qt中提供了QUdpSocket 类进行UDP数据报(datagrams)的发送和接收。首先需要了解一个名词Socket,即“套接字”。Socket简单地说,就是一个IP地址和一个port端口。因为我们要传输数据,就要知道往哪个机子上传送,而IP地址确定了一台主机。但是这台机子上可能运行着各种各样的网络程序,我们要往哪个程序中发送呢?这时就要使用一个端口来指定UDP程序。所以,Socket指明了数据报传输的路径。
QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作。而且它采用QT本身的signal-slot机制,使编写的程序更容易理解。
(七)代码实现
如果使用同一台主机进行测试,即该主机既是客户端又是服务端。程序运行时,先运行服务端程序,再运行客户端程序,发送数据,服务器端的窗口就可以显示接收到的数据。
本文只介绍单播,实现两台主机之间UDP数据传输。
服务器端建立一个UDP Socket并绑定在固定端口后,用信号与槽的方式进行监听是否有数据来临。
实例主要功能是:客户端既发送数据,服务器接收之后,将接收到的数据再发送给客户端。
需要在pro文件中添加:QT += network
客户端代码:
头文件:
#include <QUdpSocket>
QUdpSocket *socket;
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 收益3583万?我是如何快速统计「李子柒」YouTube频道视频累计播放量并计算收益的
- mysql优化篇:where中的like和=的性能分析
- 557. 反转字符串中的单词 III
- 剑指 Offer 03. 数组中重复的数字
- 841. 钥匙和房间
- 一篇文章了解python常见内置异常报错
- 五分钟极速搭建kubernetes集群
- 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。
- Go内存管理之代码的逃逸分析
- MySQL读锁的区别和应用场景分析
- Apache NIFI 讲解(读完立即入门)
- 了解NiFi最大线程池和处理器并发任务设置
- 深入理解 Apache NIFI Connection
- 【Go语言探险】线上奇怪日志问题的排查
- 探索 Apache NIFI 集群的高可用