[Qt][Qt 网络][下]详细讲解
目录
- 1.TCP Socket
- 1.核心API概览
- 2.回显服务器
- 3.回显客户端
- 2.HTTP Client
- 3.其他模块
1.TCP Socket
1.核心API概览
- 核⼼类是两个:
QTcpServer和QTcpSocket QTcpServer用于监听端口,和获取客户端连接listen(const QHostAddress&, quint16 port):绑定指定的地址和端⼝号,并开始监听- 成员方法
- 对标原⽣API:
bind()和listen()
nextPendingConnection():从系统中获取到⼀个已经建⽴好的tcp连接- 返回⼀个
QTcpSocket,表⽰这个客⼾端的连接- 通过这个socket对象完成和客⼾端之间的通信
- 成员方法
- 对标原⽣API:
accept()
- 返回⼀个
newConnection():有新的客⼾端建⽴连接好之后触发- 信号
- 类似于IO多路复用的通知机制
QTcpSocket⽤于客⼾端和服务器之间的数据交互readAll():读取当前接收缓冲区中的所有数据,返回QByteArray对象- 成员方法
- 对标原生API:
read()
write(const QByteArray &):把数据写⼊socket中- 成员方法
- 对标原生API:
write()
deleteLater():暂时把socket对象标记为⽆效,Qt会在下个事件循环中析构释放该对象- 成员方法
- 类似于"半⾃动化的垃圾回收"
readyRead():有数据到达并准备就绪时触发- 信号
- 类似于IO多路复⽤中的通知机制
disconnected():连接断开时触发- 信号
- 类似于IO多路复⽤中的通知机制
2.回显服务器
// 构造函数中
{server = new QTcpServer(this);// 通过信号槽, 指定如何处理连接.connect(server, &QTcpServer::newConnection, this, &Widget::ProcessConnection);// 绑定并监听端口号if (!ret = server->listen(QHostAddress::Any, 2333)) {QMessageBox::critical(this, "服务器启动失败!", server->errorString());exit(1);}
}void Widget::ProcessConnection()
{// 通过 server 拿到一个 socket 对象, 通过这个对象来和客户端进行通信QTcpSocket* clientSocket = tcpServer->nextPendingConnection();QString log = "[" + clientSocket->peerAddress().toString() + ":" + QString::number(clientSocket->peerPort()) + "] 客户端上线!";ui->listWidget->addItem(log);// 通过信号槽, 来处理客户端发来请求的情况connect(clientSocket, &QTcpSocket::readyRead, this, [=]() {// a) 读取出请求数据,此处 readAll 返回的是 QByteArray, 通过赋值转成 QStringQString request = clientSocket->readAll();// b) 根据请求处理响应const QString& response = Process(request);// c) 把响应写回到客户端clientSocket->write(response.toUtf8());// d) 把上述信息记录到日志中.QString log = "[" + clientSocket->peerAddress().toString() + ":" + QString::number(clientSocket->peerPort()) + "] "+ " req: " + request + ", resp: " + response;ui->listWidget->addItem(log);});// 通过信号槽, 来处理客户端断开连接的情况.connect(clientSocket, &QTcpSocket::disconnected, this, [=]() {// a) 把断开连接的信息通过日志显示出来.QString log = "[" + clientSocket->peerAddress().toString() + ":" + QString::number(clientSocket->peerPort()) + "] 客户端下线!";ui->listWidget->addItem(log);// b) 手动释放 clientSocket. 直接使用 delete 是下策, 使用 deleteLater 更加合适clientSocket->deleteLater();});
}QString Widget::Process(const QString request)
{return request;
}
3.回显客户端
// 构造函数中
{socket = new QTcpSocket(this);// 服务器建立连接,此处是非阻塞的IO通信socket->connectToHost("127.0.0.1", 2333);// 连接信号槽, 处理响应connect(socket, &QTcpSocket::readyRead, this, [=]() {// a) 读取出响应内容QString response = socket->readAll();// b) 把响应内容显示到界面上.ui->listWidget->addItem("服务器说: " + response);});// 等待连接建立的结果. 确认是否连接成功.if (!socket->waitForConnected()) {QMessageBox::critical(this, "连接服务器出错", socket->errorString());exit(1);}
}void Widget::on_pushButton_clicked()
{const QString& text = ui->lineEdit->text();socket->write(text.toUtf8());ui->listWidget->addItem("客户端说: " + text);ui->lineEdit->setText("");
}
2.HTTP Client
- Qt只提供了Http客户端,并没有提供Http服务端的库
- 关键类主要是三个:
QNetworkAccessManager,QNetworkRequest,QNetworkReply QNetworkAccessManager提供了HTTP的核⼼操作get(const QNetworkRequest&):发起⼀个HTTP GET请求,返回QNetworkReply对象- 本身不是阻塞函数,只负责发出去请求,不负责等请求回来
- 收是
QNetworkReply负责的,会收到finished信号
post(const QNetworkRequest&, const QByteArray&):发起⼀个HTTP POST请求,返回QNetworkReply对象
QNetworkRequest表⽰⼀个HTTP请求(不含body),如果需要发送⼀个带有body的请求(⽐如post),会在QNetworkAccessManager的post()中通过单独的参数来传⼊bodyQNetworkRequest(const QUrl&):通过URL构造⼀个HTTP请求setHeader(QNetworkRequest::KnownHeaders header, const QVariant& value):设置请求头QNetworkRequest::KnownHeaders是⼀个枚举类型,常⽤取值ContentTypeHeader:描述body的类型ContentLengthHeader:描述body的⻓度LocationHeader:⽤于重定向报⽂中指定重定向地址CookieHeader:设置cookieUserAgentHeader:设置User-Agent
QNetworkReply表⽰⼀个HTTP响应,这个类同时也是QIODevice的⼦类error():获取出错状态errorString():获取出错原因的⽂本readAll():读取响应bodyheader(QNetworkRequest::KnownHeaders header):读取响应指定header的值finished():为一个信号,在客⼾端收到完整的响应数据之后触发
- 示例:
// 构造函数中 {manager = new QNetworkAccessManager(this); }void Widget::on_pushButton_clicked() {// 1. 获取到输入框中的 urlQUrl url(ui->lineEdit->text());// 2. 构造一个 HTTP 请求对象QNetworkRequest request(url);// 3. 发送请求QNetworkReply* response = manager->get(request);// 4. 通过信号槽, 来处理响应connect(response, &QNetworkReply::finished, this, [=]() {if (response->error() == QNetworkReply::NoError) {QString html = response->readAll();ui->plainTextEdit->setPlainText(html);} else {ui->plainTextEdit->setPlainText(response->errorString());}// 需要对 response 进行手动释放.response->deleteLater();}); }
3.其他模块
- Qt中还提供了FTP,DNS,SSL等⽹络相关的组件⼯具,有需要可以具体学习,查阅官方文档
相关文章:
[Qt][Qt 网络][下]详细讲解
目录 1.TCP Socket1.核心API概览2.回显服务器3.回显客户端 2.HTTP Client3.其他模块 1.TCP Socket 1.核心API概览 核⼼类是两个:QTcpServer和QTcpSocketQTcpServer用于监听端口,和获取客户端连接 listen(const QHostAddress&, quint16 port)&#…...
十三、OpenCVSharp的目标检测
文章目录 简介一、传统目标检测方法1. 基于滑动窗口的检测2. 特征提取与分类器结合(如 HOG + SVM)3. 级联分类器二、基于深度学习的目标检测1. YOLO 系列算法2. SSD 算法3. Faster R-CNN 算法三、深度学习目标检测模型的训练和部署四、目标检测的性能评估指标1. 准确率、召回…...
STM32标准库学习笔记-6.定时器-输入捕获
参考教程:【STM32入门教程-2023版 细致讲解 中文字幕】 定时器输入捕获 IC(Input Capture)输入捕获输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率…...
vue前端可以完整的显示编辑子级部门,用户管理可以为用户分配角色和部门?
用户和角色是一对多的关系用户和部门是多对多得关系<template><div class="s"><!-- 操作按钮 --><div class="shang"><el-input v-model="searchText" placeholder="请输入搜索关键词" style="width:…...
量化交易的基石:ExchangeSdk
作为长期混迹在合约市场的老韭菜来说,已不能满足与手动下单来亏钱,必须得通过脚本来加速,为了达到这个目的就产生了项目。目前封装的主要是合约的API接口,不支持现货交易。 Github: https://github.com/silently9527/exchange-sdk…...
【区块链+金融服务】基于区块链的一站式绿色金融开放平台 | FISCO BCOS应用案例
科技的进步为绿色金融发展提供了新的机遇,但银行、企业、第三方金融机构等在进行绿色金融业务操作过程中, 存在着相关系统和服务平台建设成本高、迭代难度大、数据交互弱、适配难等痛点。 基于此,中碳绿信采用国产开源联盟链底层平台 FISCO …...
使用Python实现深度学习模型:智能娱乐与虚拟现实技术
介绍 智能娱乐与虚拟现实(VR)技术正在改变我们的娱乐方式。通过深度学习模型,我们可以创建更加沉浸式和智能化的娱乐体验。本文将介绍如何使用Python和深度学习技术来实现智能娱乐与虚拟现实的应用。 环境准备 首先,我们需要安装一些必要的Python库: pip install pand…...
亚马逊云科技产 Amazon Neptune 图数据库服务体验
目录 图数据库为什么使用图数据库Amazon Neptune实践登陆创建 S3 存储桶notebook图神经网络快速构建加载数据配置端点Gremlin 查询删除环境删除 S3 存储桶 总结 图数据库 图数据库是一种专门用于存储和处理图形数据结构的数据库管理系统。图形数据结构由节点(Node&…...
【网络安全】重置密码token泄露,实现账户接管
未经许可,不得转载。 文章目录 正文 正文 对某站点测试过程中,登录账户触发忘记密码功能点,其接口、请求及响应如下: PUT /api/v1/people/forgot_password 可以看到,重置密码token和密码哈希均在响应中泄露。 删除co…...
计算机基础知识复习8.13
cookie和session区别 cookie:是服务器发送到浏览器,并保存在浏览器端的一小块数据 浏览器下次访问服务时,会自动携带该块数据,将其发送给服务器 session:是javaEE标准,用于在服务端记录客户端信息 数据存放在服务端更加安全&a…...
Unity URP无光照下Shadow 制作 <二> 合批处理
闲谈 相信大家在日常工作中发现了一个问题 , urp下虽然可以做到3个Pass 去写我们想要的效果,但是,不能合批(不能合批,那不是我们CPU要干冒烟~!) 好家伙,熊猫老师的偏方来了 &#x…...
微乐校园pf
TOC springboot451微乐校园pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这…...
文件其他相关函数
symlink 链接文件: file.txt -> hello.c 软链接文件、符号链接文件 硬链接文件 命令行:ln -s 123 softlink 快捷方式 int symlink(const char *oldpath, const char *newpath); 功能: 创建一个链接向oldpath文件的新符号链接文件 参数: oldpath:被链接向…...
SQLALchemy ORM 的关联关系之 ORM 中的多对多
SQLALchemy ORM 的关联关系之 ORM 中的多对多 场景示例实现多对多关系定义模型插入和查询数据总结在 SQLAlchemy ORM 中,多对多(Many-to-Many)关联关系是一种常见的关系类型,它表示两个表中的行可以相互关联,即一个表中的多行可以与另一个表中的多行相关联。为了实现这种关…...
sdkman install慢,采用squid代理
(1)A机器,IP:yy.yy.yy.yy 安装squid yum install squidvi /etc/squid/squid.confacl allowed_ip src xx.xx.xx.xx http_access allow allowed_ip http_access deny allsystemctl restart squid 开放3128端口 (2)B机器,IP:xx.xx.xx.xx, export http_proxyhttp://y…...
实时监控Windows服务器:使用Prometheus和Grafana的终极方案
视频指南 【1】快速上手:在Windows系统上部署Prometheus与Grafana,实时监控性能指标 【2】快速上手:在Windows系统上部署Prometheus与Grafana,实时监控性能指标 1. 下载并安装 Prometheus 下载 Prometheus: 访问 Pro…...
【文科生能看懂的】牛顿二项式定理
牛顿二项式定理 简单的二项式整数次幂展开的结果中的规律结果中各项的指数结果中各项的系数 二项式定理 牛顿二项式定理就是用来求某个二项式的整数次幂的展开式的。 简单的二项式整数次幂 我们可以先从简单的情况开始,比如二项式 ( a b ) (ab) (ab)的整数次幂&a…...
Fly Catcher:通过监测恶意信号来检测飞机欺骗
Fly Catcher 的开发者 Angelina Tsuboi 是一名飞行员、网络安全研究员和发明家。 她决定着手一个将这三个不同兴趣结合起来的项目,以解决航空雷达系统的一个重大问题。 ADS-B 系统最初用于基本的飞机定位和跟踪,Tsuboi 对该系统的网络安全方面进行了深…...
计算机网络——HTTP协议详解(上)
一、HTTP协议简单介绍 1.1 什么是HTTP协议 HTTP(超文本传输协议)是一种用于在Web浏览器和Web服务器之间传输数据的应用层协议。它是一种无状态协议,即服务器不会保留与客户端的任何连接状态信息,每个请求都被视为一个独立的事务。…...
十九、中介者模式
文章目录 1 基本介绍2 案例2.1 Developer 抽象类2.2 FrontendDeveloper 类2.3 BackendDeveloper 类2.4 Mediator 接口2.5 ProjectManager 类2.6 Client 类2.7 Client 类的运行结果2.8 总结 3 各角色之间的关系3.1 角色3.1.1 Colleague ( 同事 )3.1.2 ConcreteColleague ( 具体的…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
