Qt扫盲-网络编程概述

news2024/9/22 21:24:30

网络编程概述

  • 一、Qt网络编程概述
  • 二、Qt对Http,FTP应用层协议支持
  • 三、TCP通信编程支持
  • 四、UDP通信编程支持
  • 五、主机信息的获取
  • 六、网络代理
  • 七、底层管理的支持

一、Qt网络编程概述

Qt Network模块提供了允许我们编写TCP/IP客户端和服务器的类。它提供了低级类来完成基础的数据传输,如QTcpSocket、QTcpServer和QUdpSocket,Qt也提供了高级类,主要其实就是一个通用应用层协议的工具类,如QNetworkRequest、QNetworkReply和QNetworkAccessManager,这些类是使用公共协议执行网络操作。
它还提供了QNetworkConfiguration、QNetworkConfigurationManager和QNetworkSession等实现承载管理的类。

在使用网络编程的这个模块时候在,pro文件中加入 下面的话以便于引入模块。

QT += network

我们要自己实现自己的应用层协议的话就需要在 低级的基础类上制定规则来匹配我们自己的场景。

二、Qt对Http,FTP应用层协议支持

Qt对Http,FTP应用层协议支持主要是通过 QNetworkRequest、QNetworkAccessManager、QNetworkReply 类来完成数据通信的功能。

网络请求由QNetworkRequest类表示,它还充当与请求相关的信息的一般容器,如任何首部信息和使用的加密。构造请求对象时指定的URL决定了请求使用的协议。目前支持HTTP、FTP和本地文件url的上传和下载。

网络操作的协调由QNetworkAccessManager类执行。一旦创建了一个请求,这个类就用来分派它并发出信号来报告它的进度。管理器还协调使用cookie在客户端存储数据、身份验证请求和代理的使用。

对网络请求的响应由QNetworkReply类表示。这些是由QNetworkAccessManager在请求被分派时创建的。QNetworkReply提供的信号可用于单独监控每个回复,或者开发人员可以选择使用管理器的信号来实现此目的,并丢弃对回复的引用。由于QNetworkReply是QIODevice的子类,回复可以同步或异步处理;即,阻塞或非阻塞操作。

每个应用程序都可以创建一个或多个QNetworkAccessManager实例来处理网络通信。

总结来说其实就是

  • QNetworkRequest:构造一个请求URL
  • QNetworkAccessManager:复制管理这个 QNetworkRequest
  • QNetworkReply:就是处理 服务器 返回 请求 URL 的结果

三、TCP通信编程支持

TCP (Transmission Control Protocol,传输控制协议)是一种底层的网络协议,大多数互联网协议都使用它来传输数据,包括HTTP和FTP。它是一种可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输。
在这里插入图片描述

QTcpSocket类提供了一个TCP接口。我们可以使用QTcpSocket实现标准的网络协议,如POP3、SMTP和NNTP,以及自定义协议。 毕竟 Socket只管传数据,而不会说明数据的意义

在开始任何数据传输之前,必须建立到远程主机和端口的TCP连接。连接建立后,通过QTcpSocket::peerAddress()和QTcpSocket::peerPort() 可以获得对端IP地址和端口。在任何时候,对端都可以关闭连接,数据传输将立即停止。

QTcpSocket是异步工作的,并发出信号来报告状态变化和错误,就像QNetworkAccessManager一样。它依赖于事件循环来检测传入的数据并自动清除传出的数据。可以使用QTcpSocket::write()向套接字写入数据,使用QTcpSocket::read()读取数据。QTcpSocket表示两个独立的数据流:一个用于读取,另一个用于写入。全双工的

由于QTcpSocket继承了QIODevice,你可以将它与QTextStream和QDataStream一起使用。从QTcpSocket读取数据时,必须事先调用QTcpSocket::bytesAvailable(),以确保有足够的数据可用。

如果需要处理传入的TCP连接(例如,在服务器应用程序中),请使用QTcpServer类。调用QTcpServer::listen()来建立服务器,并连接到QTcpServer::newConnection()信号,该信号对每个连接的客户端都会发出一次。在socket中,调用 QTcpServer::nextPendingConnection() 来接受连接,并使用返回的QTcpSocket与客户端通信。

虽然 QTcpSocket 的大多数函数都是异步工作的,但也可以同步地使用QTcpSocket(即阻塞)。要获得阻塞行为,可以调用QTcpSocket 的 waitFor…()函数;这些函数会挂起调用线程,直到发出信号。例如,在调用非阻塞的QTcpSocket::connectToHost()函数之后,调用QTcpSocket::waitForConnected()来阻塞线程,直到connected()信号发出。

同步套接字通常会导致代码的控制流程更简单。waitFor…()方法的主要缺点是,当waitFor…()函数阻塞时,事件不会被处理。如果在GUI线程中使用,这可能会冻结应用程序的用户界面。出于这个原因,我们建议我们只在非gui线程中使用同步套接字。当同步使用时,QTcpSocket不需要事件循环。

四、UDP通信编程支持

在这里插入图片描述

QUdpSocket类允许发送和接收UDP数据报。它继承了QAbstractSocket,因此共享了QTcpSocket的大部分接口。主要的区别在于,QUdpSocket以数据报的形式传输数据,而不是以连续的数据流的形式。简而言之,数据报是一个有限大小的数据包(通常小于512字节),除了要传输的数据之外,还包括数据报发送方和接收方的IP地址和端口。
QUdpSocket支持IPv4广播。广播常用于实现网络发现协议,例如发现网络上哪台主机拥有最多的空闲硬盘空间。一台主机向所有其他主机接收的网络广播一个数据报。每个接收到请求的主机然后将其当前空闲磁盘空间的回复发送给发送者。发送者等待直到收到所有主机的回复,然后可以选择有最多空闲空间的服务器来存储数据。要广播数据报,只需将它发送到特殊地址QHostAddress:: broadcast(255.255.255.255),或发送到你本地网络的广播地址。
QUdpSocket::bind()为接收传入的数据报准备套接字,很像TCP服务器的QTcpServer::listen()。只要有一个或多个数据报到达,QUdpSocket就会发出readyRead()信号。调用QUdpSocket::readDatagram()来读取数据报。

五、主机信息的获取

在建立网络连接之前,QTcpSocket和QUdpSocket执行名称查找,将连接到的主机名转换为IP地址。一般通过DNS (Domain Name Service)协议 获取的。 Qt 获取主机IP等信息通过 QHostInfo 获取的。

QHostInfo 类提供了一个静态函数,可以让您自己执行这种查找。通过使用主机名、QObject指针和 Socket 签名调用QHostInfo::lookupHost(), QHostInfo将执行名称查找,并在结果准备好时调用给定的 Socket 。实际的查找是在一个单独的线程中完成的,使用操作系统自己的方法来执行名称查找。

QHostInfo还提供了一个名为QHostInfo::fromName()的静态函数,它接受主机名作为参数并返回结果。在这种情况下,名称查找与调用者在同一个线程中执行。这种重载对于非gui应用程序或在单独的非gui线程中进行名称查找非常有用。(在GUI线程中调用此函数可能会导致用户界面冻结,而函数在执行查找时阻塞。)

六、网络代理

在这里插入图片描述

使用Qt进行网络通信可以通过代理(proxy)进行,代理在本地和远程连接之间引导或过滤网络流量。 就行这种,代理其实就是相当于再加一层网络过滤的功能。

单个代理由QNetworkProxy类表示,这个类用于描述和配置到代理的连接。支持在不同层次的网络通信上运行的代理类型,soksok5 支持在低层次上进行网络流量代理,HTTP和FTP代理在协议层次上工作。查看QNetworkProxy::ProxyType了解更多信息。

代理可以基于每个套接字启用,也可以用于应用程序中的所有网络通信。新打开的套接字可以在连接之前调用它的QAbstractSocket::setProxy()函数,让它使用代理。通过使用QNetworkProxy::setApplicationProxy()函数,可以为所有后续的套接字连接启用全应用范围的代理。

代理工厂用于创建代理使用的策略。QNetworkProxyFactory提供了基于特定代理类型查询的代理。查询本身编码在QNetworkProxyQuery对象中,该对象允许根据关键标准选择代理,例如代理的目的(TCP、UDP、TCP服务器、URL请求)、本地端口、远程主机和端口,以及使用的协议(HTTP、FTP等)。

七、底层管理的支持

这个我就不太清楚了

承载管理控制设备的连接状态,以便应用程序可以启动或停止网络接口,并在接入点之间透明漫游。
QNetworkConfigurationManager类管理设备已知的网络配置列表。网络配置描述了用于启动网络接口的一组参数,由QNetworkConfiguration类表示。

根据给定的网络配置打开QNetworkSession来启动网络接口。在大多数情况下,基于平台指定的默认网络配置创建网络会话是合适的。默认的网络配置由QNetworkConfigurationManager::defaultConfiguration()函数返回。

在某些平台上,应用程序在执行任何网络操作之前打开网络会话是一个平台要求。这可以通过QNetworkConfigurationManager::NetworkSessionRequired标志在QNetworkConfigurationManager::capabilities()函数返回的值中进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java寒假打卡】JavaWeb-Session

【Java寒假打卡】JavaWeb-Session概述常用的方法HttpSession的获取HttpSession的使用概述 常用的方法 HttpSession的获取 HttpSession的使用 在第一个Servlet中获取请求的用户名获取HttpSession对象将用户名设置到共享数据中在第二个Servlet中获取HttpSession对象获取共享数据用…

java8新特性

接口中默认方法修饰为普通方法,实现接口时不需要重写方法Lambda表达式Stream流并行流原理校验当前对象是否为null当前对象为null,设置默认值 接口中默认方法修饰为普通方法Lambda表达式使用Lambda表达式 依赖于函数接口 在接口中只能够允许有一个抽象方法在函数接…

SpringCloud笔记

2023年最新笔记,全文约 3 万字,蕴含 Spring Cloud 常用组件 Nacos、OpenFeign、Seata、Sentinel 等 〇、简介 什么是Spring Cloud? ​ Spring Cloud是一系列框架的有序集合,是一种基于微服务的分布式架构技术。它利用 Spring Boot…

HBuilder的安装与试用

准备把前端框架Layui仔细学习一遍(虽然Layui已经过了最流行的时候,但是很多项目都在用它),在B站找了一套《Layui框架精讲全套视频教程》,视频作者实操Layui时用的工具很方便,从弹幕中看到说用的是HBuilder&…

Springcloud 笔记

微服务架构微服务架构是一种架构模式,它体长将单一应用程序划分成一组小的服务,服务之间相互协调,互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务之间采用轻量级的通信机制**(如HTTP)互相协作…

电商直通车主图设计教程

商直通车主图设计教程!无门槛在线设计,零基础轻松入门的电商设计工具,轻松就能搞定的主图设计工具,下面跟着小编的设计教程,一起学习如何使用在线工具乔拓云轻松设计专属的商品直通车主图,在线模板轻松设计…

Cadence PCB仿真使用Allegro PCB SI生成延迟仿真报告及报告导读图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,生成报告3,报告导读4,总结1,概述 本文简单介绍使用Allegro PCB SI生成网络的延迟性能评估的报告的方法,及延迟报告要点导读。 2,生成报告 第1步,选择需要生成报告的网络,然后单击右…

深度估计算法原理与论文解读

论文地址: Monocular Depth Estimation Using Laplacian Pyramid-Based Depth Residuals | IEEE Journals & Magazine | IEEE Xplore 深度估计算法原理 1.深度估计任务概述 深度估计,即通过输入的彩色图像,获得每个像素点离相机距离的远近(热度图) ,热度图的深浅表…

Linux内核显卡驱动(LVDS)初探

目录 0. 前言 1. menuconfig 2. 编译报错与打补丁 3. 设备树与display-timings 4. 拓展:RGB24 0. 前言 这次的工作主要是把某项目设备上(iMX6DL)的内核版本从 4.19.x 升级到 5.15.32,是作为该项目整个BSP升级计划的一部分。 该内核升级工作移交给…

Spring Cloud Alibaba商城实战项目基础篇(day03)

五、后台管理 5.1、商品服务 5.1.1、三级分类 5.1.1.1、查询所有菜单与子菜单 我们需要维护所有菜单以及各种子菜单,子菜单里面可能还有子菜单,所以我们采用递归的方式进行书写。 我们先在CategoryController中修改list方法,让他以组装树…

Day868.索引(上) -MySQL实战

索引(上) Hi,我是阿昌,今天学习记录的是关于索引(上)的内容。 某一个 SQL 查询比较慢,分析完原因之后,可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引&…

linux部署java项目cpu占用100%的排除故障

用top -c命令查看cpu占用高的进程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/12af3f060fb84ce98b24c7247546b50b.png 发现cpu占用为99%的进程pid为24857 用top -Hp 24857查看cpu占用最高的线程 发现占用cpu97.3%的线程id为24926 将24926转为16进制 通过jstack查看进…

袋式除尘器—选型计算

1.处理气体量的计算计算袋式除尘器的处理气体时,首先要求出工况条件下的气体量,即实际通过袋式除尘器的气体量,并且还要考虑除尘器本身的漏风量。这些数据,应根据已有工厂的实际运行经验或检测资料来确定,如果缺乏必要…

Day09 - 子类父类多继承多层继承多态

1. 子类中访问父类中的私有属性和私有方法 如果想使用父类中的私有属性和私有方法,那么就需要在父类中,为这些私有的属性和方法,提供相应的公有的接口方法来间接访问2. 如何为父类中的属性进行初始化 在子类中如果定义了自己的初始化方法,那么这时父类的初始化方法就不会再执…

尚硅谷AJAX教程

优点&#xff1a;无需刷新页面获取数据&#xff0c;允许你根据用户事件来更新部分页面内容 缺点&#xff1a;没有浏览历史&#xff0c;不能回退&#xff0c;存在跨域&#xff0c;SEO不友好 原生XHR请求 get请求 <body><button>获取数据</button><scri…

弹性可微调,基于LCN光敏材料的触觉模拟系统

对于AR/VR体验来讲&#xff0c;体感、触觉模拟很重要&#xff0c;但现阶段还没有一种方便消费者使用、轻便的体感方案&#xff0c;因此Meta等公司不断在探索更好的体感技术。比如近期&#xff0c;Nature发表了一项来自荷兰埃因霍芬理工大学的新研究&#xff0c;该研究由Meta Re…

svg的path标签的d属性

<svgwidth"200"height"200"viewBox"0 0 200 200"style"border: 1px solid red"><pathd"M10 10 L110 10 L110 110 L10 110 Z"fill"none "stroke"green"></path></svg>运行效果…

Redux Toolkit 调用 API 的四种方式

Redux Toolkit 调用 API 的四种方式 上篇笔记写的比较乱&#xff0c;加上这回又学了点新的东西&#xff0c;所以重新整合一下。 本地 API 用的是 json-server&#xff0c;端口设置在 3005&#xff0c;数据包含&#xff1a; {"users": [{"id": 1,"n…

数据分析-深度学习 Pytorch Day9

迁移学习通过利用数据、任务或模型之间的相似性&#xff0c;将在旧领域学习过的模型应用于新领域来求解新问题。生活中常用的“举一反三”、“照猫画虎”就很好地体现了迁移学习的思想。利用迁移学习的思想&#xff0c;可以将已有的一些训练好的模型&#xff0c;迁移到我们的任…

【Kotlin】泛型 ② ( 可变参数 vararg 关键字与泛型结合使用 | 使用 [] 运算符获取指定可变参数对象 )

文章目录一、可变参数 vararg 关键字与泛型结合使用二、使用 [] 运算符获取指定可变参数对象一、可变参数 vararg 关键字与泛型结合使用 如果 泛型类型 T 的参数 是 vararg 可变参数 , 则在接收 可变参数 时 , 需要使用 Array<out T> 类型 的变量进行接收 ; 参数为 vara…