QT网络编程
Qt 给用户提供了网络编程的接口,包括TCP、UDP、HTTP三种协议的API以及各种类,可以了解一下。
而在 QT 中想要使用网络编程,必须在pro文件中添加 network 模块,否则无法包含网络编程所需的头文件。
UDP
UDP是传输层的协议,该协议是无输出,不可靠,面向数据包,全双工的通信协议。
QT为 UDP 协议专门设置了两个类:QUdpSocket 以及 QNetworkDatagram 。
QUdpSocket类
该类是专门用于 Udp 的类,包含 Udp 协议所需的绑定、接收数据包、发送数据包等API。
| bind(const QHostAddress&,quint16) | 函数 | 绑定端口号 | 类似linux中的bind |
| receiveDatagram() | 函数 | 返回一个 QNetworkDatagram类型的数据包 | 类似linux中的recvfrom |
| writeDatagram() | 函数 | 发送一个QNetworkDatagram类型的数据包 | 类型linux中的sendto |
| readyRead | 信号 | 当一个端口号可以读取时即可触发该信号 | 类似linux中的多路转接:select、poll和epoll等 |
QNetworkDatagram
该类表明一个数据包,可以从该类所实例化的对象中读取所需的数据、发送端的端口号和 ip 地址
| QNetworkDatagram(const QByteArray&,const QHostAddress&,quint16) | 方法 | QNetworkDatagram的构造函数,用于创建一个对象 |
| data() | 方法 | 获取数据包中的数据,返回一个 QByteArray 对象 |
| sederAddress() | 方法 | 获取数据包发送者的 IP 地址 |
| sederPort() | 方法 | 获取数据包发送者的 端口号 |
和Linux不同的是,linux的接收和发送函数:recvfrom 和 sendto ,它们都需要一个 sockaddr 的结构体对象来获取发送端的 IP 地址和端口号,而QT则是将其拆开,数据包中直接包含对端的IP地址和端口号
UDP回显服务器
首先写服务器的代码,在 pro 文件添加 network 模块后,即可使用上述API。
在服务器一侧我们使用 listWidget 控件,用来显示所有接收的数据。

然后在头文件中添加 QUdpSocket 对象,用来后续接收客户端的消息。
然后在构造函数中我们初始化 socket 后,需要先进行信号槽绑定然后再进行端口号绑定。
必须先进行信号槽绑定再进行端口号绑定,这是为了防止如果有客户端发起请求了,但是信号槽函数未绑定,导致该请求丢失的情况。
然后再写好槽函数,写好接收和显示逻辑。
UDP回显客户端
同样的,在pro文件中添加network模块后即可使用UDP的API。
客户端需要发送数据和接收数据,因此除了 listWidget 来显示数据之外,还需要 lineEidt 和 pushbutton 两个控件,分别用来输入数据和发送数据。
在头文件中添加控件的槽函数,其他和Server一样。

而在构造函数中,除了初始化 socket 之外,还需要绑定 readyRead 信号和process槽函数,因为客户端也需要接收服务器发送的数据。

而pushButton 的槽函数就需要先从 lineEdit 中读取文件,然后再创建一个 QNetworkDatagram 对象,用来发送数据,该数据包必须包含服务器的 IP 地址和 端口号。

而接收服务器发送的数据就直接显示在 listWidget 上。
可以看到成功的发送和接收到数据了。
TCP
TCP是一个可靠、面向连接、面向字节流、全双工的传输层协议,它的API稍微比UDP复杂,但是也很简单。
其核心类有两个:QTcpServer 和 QTcpSocket。
QTcpServer
该类专门用于监听端口,和获取客户端连接。
| listen(const QHostAddress&,quint16) | 方法 | 绑定指定的端口号和IP地址,并且启动监听 | 类似linx中的bind和listen的结合体 |
| nextPendingConnection() | 方法 | 从系统中获取一个已经建立好的tcp连接,返回一个 QTcpSocket 对象。 通过该对象可以进行通信 | 类似linux 中的 accept |
| newConnection | 信号 | 有新的客户端建立好连接后即触发 | 在linux中类似多路转接的通知机制 |
QTcpSocket
和 QUdpSocket 类似,该类用于进程间通信。
| readAll() | 方法 | 读取接收缓冲区的所有数据 返回一个 QByteArray 对象 | 类似linux中的read |
| write(const QByteArray & ) | 方法 | 把数据写入 socket 对象中 | 类似linux的write |
| deleteLater | 方法 | 将该 socket 对象设为无效,在下一次事件循环中析构该对象 | 类似 java 中的自动回收机制,不过我们这里是半自动的 |
| connectToHost(const QHostAddress&,quint16) | 方法 | 向服务器发送连接请求,进行三次握手操作 | 类似 linux 中的 connect 函数 |
| readyRead | 信号 | 有数据到达并准备时触发 | 类似多路复用 |
| disconnected | 信号 | 当断开连接时触发 | 类似多路复用 |
通过上面两个类可以实现 TCP 的回显服务器。
TCP回显服务器
和 UDP 的服务器一样,直接用一个 listWidget 用来显示所有数据。

在头文件上设置好 QTcpServer 对象和槽函数。

将 QTcpServer 的 newConnection 信号和对应的槽函数绑定,然后启动监听。

当一个客户端发起链接时,分未三个部分。
- 获取客户端的连接,并显示有客户端上线
- 绑定 readyRead 和 对应的槽函数(此处用的 lambda 表达式)
- 绑定 disconnected 和 对应的槽函数

无论是客户端上线、还是接收到数据、又或者是断开连接,都会在 listWidget 上显示出来。
而 process 函数则是单纯的返回一个相同的QString罢了。
TCP回显客户端
和 UDP 回显客户端一样,采用 listWidget、lineEdit、pushButton 三个控件。

头文件中添加 QTcpSocket 类和 pushButton 对应的槽函数。

而在构造函数中,除了初始化 socket 之外,还需要将 socket 的 readyRead 信号和槽函数绑定在一起,用来显示在 listWidget 中。此外还需要通过 connectToHost 来和服务器建立连接 。
此外由于客户端还需要接收服务器发送的数据,因此也需要绑定函数。
而pushButton的槽函数则直接读取 lineEdit 上的文本,并且发送和服务器。

能够发现确实进行了互相通信。
不过让我们回忆下 linux 中我们是如何使用 TCP 进行通信的?
当一个客户端进行请求时,就为该客户端创建一个线程,在线程中进行管理,但是我们这里的QT明显不是这样的,这是为什么呢?实际上那是因为 代码缺陷, linux中采用的是双层循环方式,当一个客户端建立连接,那么直到客户端断开连接之前,服务器一直都会在内层循环中阻塞,无法到达 accept 中去,只能通过多线程的方式进行。
而 QT 自带信号槽机制就很好的解决了这个问题,当有信号发生时才去处理,而 linux 除非采用 epoll 来将处理之外,基本只能通过多线程解决。
HTTP Client
实际上一个服务器不太可能采用图形化界面的,因此实际上 TCP 和 UDP 都使用的很少。
QT 中使用最多的是 HTTP。
QT 提供三个类用于和 HTTP 进行请求和获取操作。
- QNetworkAccessManager
- QNetworkRequest
- QNetworkReply
QNetworkAccessManager
该类提供 HTTP 的核心操作。
| 方法 | 说明 |
| get(const QNetworkRequest&) | 以get 的方式发送一个请求 |
| post(const QNetworkRequest&,const QByteArray&) | 以 post 的方式发送一个请求 |
当然,HTTP 有很多操作,比如delete、head之类的,不过这里就不一一赘述了。
QNetworkRequest
该类表示一个 Http 请求,不包含body
如果使用 post 发送一个带有 body 的请求,则需要另外单独的参数来传入 body。
| 方法 | 说明 |
| QNetworkRequest(const QUrl&) | 通过 URL 构造一个 HTTP 请求 |
| setHeader(QNetworkRequest::KnownHeaders header, const QVariant& value) | 设置请求头 |
其中,这个 setHeader 的 KnownHeader 是一个枚举类型,包括以下类型。
| 值 | 说明 |
| ContentTypeHeader | 描述body 类型 |
| ContentLengthHeader | 描述 body 长度 |
| LocationHeader | 用于重定向报文中指定重定向地址(响应才会用到) |
| CookieHeader | 设置 cookie |
| UserAgentHeader | 设置 User-Agent |
选择了某一个枚举类型后, value 就必须是枚举类型对应的说明,比如如果选择的ContentTypeHeader,那么 value 就需要在 http Body 的四种格式:form-data,x-www-from-urlencoded,raw,binary 中选一个了。
QNetworkReply
这是 Http 的响应,它是 QIODevice 的子类
| 名称 | 类型 | 说明 |
| error() | 方法 | 获取出错状态 |
| errorString() | 方法 | 获取出错原因的文本 |
| readAll() | 方法 | 读取响应文本 |
| header(QNetworkRequest::KnownHeaders header) | 方法 | 读取响应指定header 的值 |
| finished | 信号 | 客户端收到完整的响应数据后触发 |
接着我们来试着使用这些API 来获取一个响应。
首先采用 plainTextEdit、lineEdit、pushButton 三个控件。

头文件中新增 QNetworkAccessManager 对象。

然后在构造函数中初始化 manager。

而pushButton的槽函数中,我们需要按顺序来发送请求。
首先是通过获取在 lineEdit 中的 文本,并且构建一个 url。
然后通过 url 来创建一个请求,最后通过 get 方法来发送请求,并且获取一个响应。
如果该响应已经接收完所有数据后,就进入响应绑定的槽函数中,将响应显示在 plainTextEdit 上

可以看到确实是获取到了响应。
相关文章:
QT网络编程
Qt 给用户提供了网络编程的接口,包括TCP、UDP、HTTP三种协议的API以及各种类,可以了解一下。 而在 QT 中想要使用网络编程,必须在pro文件中添加 network 模块,否则无法包含网络编程所需的头文件。 UDP UDP是传输层的协议&#…...
Django ASGI服务
1. ASGI简介 在Django中, ASGI(Asynchronous Server Gateway Interface)的引入使得Django应用能够支持异步编程. 从Django 3.0开始, Django就增加了对ASGI的支持, 但直到Django 3.1才正式推荐在生产环境中使用ASGI. ASGI是一个用于Python的异步Web服务器的标准接口, 它允许你运…...
Servlet(2)
1、WebServlet 这个注解可以用来修饰一个Servlet类,可以简化配置,替代Web.xml中 的servlet配置 ①value属性 表示指定某个url-pattern ②urlPatterns属性 表示接受多个不同的url-pattern,多个值写在一对{}中,逗号分隔 补充;url-pattern…...
电竞玩家的云端盛宴!四大云电脑平台:ToDesk、顺网云、青椒云、极云普惠云实测大比拼
本文目录 一、云电脑概念及市场需求二、云电竞性能测试2.1 ToDesk云电脑2.2 顺网云2.3 青椒云2.4 极云普惠云电脑 三、四大云电脑平台综合配置对比3.1 CPU处理器3.2 GPU显卡3.3 内存 四、总结 一、云电脑概念及市场需求 在数字化时代的推动下,云计算技术日益成熟&a…...
基础复习(反射、注解、动态代理)
反射 反射,指的是加载类的字节码到内存,并以编程的方法解刨出类中的各个成分(成员变量、方法、构造器等)。 1.获取类的字节码 (3种方式) public class Test1Class{public static void main(String[] arg…...
OGG同步目标端中文乱码处理
现象说明: 源端字符集:AMERICAN_AMERICA.ZHS16GBK 目标端字符集:AMERICAN_AMERICA.AL32UTF8 源端同步过来的数据显示中文乱码。 查询数据库表中含有乱码的字段: select * from xx.xxxx a where to_char(a.crtopetime,yyyy-mm-…...
使用WPF调用Python进行图像灰度处理
1. 前言 在本文中,我们将通过WPF应用程序调用Python脚本进行图像灰度处理。我们将使用Python的OpenCV库来处理图像,并将其转换为灰度图像,然后通过WPF界面来启动Python进程并展示结果。 2. 准备工作 在开始之前,请确保系统已经…...
(二)测试工具
16. 如何进行浏览器兼容性测试? 正确回答通过率:38.0%[ 详情 ] 推荐指数: ★★★★★ 试题难度: 高难 1、兼容性测试含义 兼容性测试是指要测试的软件在不同的硬件平台上、不同的应用软件之间、不同的操作系统中、不同的网络环境中是否可以正常的运行、有无异常的测试过程…...
springboot 博客交流平台-计算机毕业设计源码56406
摘要 博客交流平台 作为一种重要的网络平台,为用户提供了展示自我、分享经验和与他人互动的空间。在国内外,研究者们关注博客交流平台 的各个方面,并取得了显著的进展。研究内容主要包括用户体验和界面设计、社交化和互动性、多媒体内容支持、…...
从0开始搭建vue + flask 旅游景点数据分析系统( 八):美化前端可视化图形
这一期来美化我们仅有的三个可视化图形(可怜),毕竟,帅是一辈子的事。 1 折线图改面积图(渐变色) 需求:折线图改为蓝色的面积图,并且有一点的渐变色。 这个非常简单,只…...
【前端面试】七、算法-迭代器和生成器
目录 1.迭代器 2.生成器 1.迭代器 lterator:也被称作游标Cursor,是一种设计模式。迭代器提供了一种遍历内容的方法(比如 JS 迭代器中的next),而不需要关心内部构造。 // 迭代器的遍历const s new Set([1,2,3,4,5])const it s.values()//…...
vs+qt一些问题
一直遇到的两个问题,今天解决了 1、 因为前后端分离,前端写完了,后端还在一直修改,但是每次都是单独打开的后端的sln,所以会出现这个,把前端的模块删掉就好了。 2、打开vs项目,很多报错&#…...
基于K8S配置Jenkins主从节点实例
基于K8S配置Jenkins主从节点实例 1.配置Jenkins主节点1.确认 Jenkins Pod 名称2.进入 Jenkins Pod:3.生成SSH密钥对4.将公钥复制到目标节点: 2.配置Jenkins的node1节点1.安装java2.配置 Jenkins node1节点的 Java 路径1.添加Java环境变量2.生效Java环境变…...
萱仔环境记录——git的安装流程
最近由于我有一个大模型的offer,由于我只在实验室的电脑上装了git,我准备在自己的笔记本上本地安装一个git,也给我的一个师弟讲解一下git安装和使用的过程,给我的环境安装章节添砖加瓦。 github是基于git的一个仓库托管平台。 g…...
品味食家巷蛋奶酪饼,感受西北美食魅力
在广袤的西北大地,美食的丰富多样令人叹为观止。而食家巷蛋奶酪饼,宛如一颗璀璨的明珠,散发着独特的魅力。 这款蛋奶酪饼,是传统工艺与现代口味的完美融合。而当你继续品尝,鸡蛋的鲜嫩和奶酪的浓郁醇厚便会在口中交融…...
常用的图像增强操作
我们将介绍如何用PIL库实现一些简单的图像增强方法。 [!NOTE] 初始化配置 import numpy as np from PIL import Image, ImageOps, ImageEnhance import warningswarnings.filterwarnings(ignore) IMAGE_SIZE 640[!important] 辅助函数 主要用于控制增强幅度 def int_param…...
探索TinyDB的轻量级魅力:Python中的微型数据库
文章目录 探索TinyDB的轻量级魅力:Python中的微型数据库背景:为何选择TinyDB?什么是TinyDB?如何安装TinyDB?5个简单的库函数使用方法3个场景下的应用实例常见问题与解决方案总结 探索TinyDB的轻量级魅力:Py…...
模型优化学习笔记—Adam算法
首先复习一下: 动量梯度下降: 1、算出dw、db 2、计算指数加权(移动)平均 vdw k *vdw (1-k)*dw vdb k *vdb (1-k)*db 3、梯度下降 w w - r*vdw b b - r*vdb RMSprop: 1、算出dw和db 2、算指数平均值&am…...
车辆出险报告(h5)-车辆出险记录接口-车辆相关接口
接口简介:通过vin及行驶证查询车辆出险、理赔、事故记录接口。查询成功率99%,返回URL地址的查询报告。 不能对返回的报告进行任何的修改,否则由用户自行承担相应的责任 报告结果只保留30天,如需永久保存,请您查询后自行保存 接口地…...
C基础项目(学生成绩管理系统)
目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令 2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
