Qt 之 HTTP 请求 多线程分块下载——上(获取下载文件大小)

Qt之HTTP下载(同步与异步、多线程与断点续传、超时与重定向) 今天使用Qt的QNetwork模块下载https开头的链接时报错:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed,但是下载http开头的资源却没问题原因:因为HTTP是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。......... 阅读详情

简述

在 Qt 之 HTTP 请求下载(支持断点续传) 文章中我们使用Qt 的方法进行HTTP 请求下载文件,同时能够断点续传,本篇文章是这一篇文章的续篇。

我们一般在网上下载软件、电影、文件等,大都是使用迅雷下载,因为迅雷下载相对而言较快。在我们日常生活中,使用迅雷下载大文件时,非常占网速,甚至会占用整个家庭局域网的带宽。有时候浏览器都打不开网页,但是迅雷有限速功能,能够保护正常上网。下面看一张图。

这里写图片描述

这是最新的迅雷9设置界面,我们看到画圈的地方,这里有一个原始地址线程数,默认是5,范围为1-10,也就是迅雷将一个下载任务分成了5个线程分别进行下载,5个线程相对一个线程而言,资源的抢占的相对较多,下载速度相对较快。

难道说线程越多,下载速度越快吗?

不一定,因为下载速度还是看网络的最大带宽的,最大下载速度不可能超过宽带运营商提供的最大带宽(还有就是本地电脑的网卡),但是多个线程相对一个线程而言,总体的速度肯定会有所提升。就好比下面这一张图,我们可以将每个矩形看做一根管子,水从上面红色的管子流下,绿色的管子为本地电脑网卡,一般情况下网卡为百兆网卡,相对网络带宽而言,这根绿色的管子相对粗一些,所以电脑网卡一般情况下不会限制网速。再看下面棕色的管子,这里表示浏览器等一些其他软件所占用的网速,而蓝色的管子则为迅雷下载占用的网速,对比左右两个图,可以看出3根管子的水流量 >= 1根管子的水流量,也就是说线程越多抢占的资源相对较多。

这里写图片描述

线程是越多越好吗?

不一定,因为红色的管子的半径是固定的,即水流量是一定的,而如果不断增加下面蓝色的管子,这样每根管子的水流量就会相对减少。而创建的管子越多,必然会消耗更多的资源,所以并不是线程越多越好。线程要控制在一定的范围内,就迅雷而言,就将一个任务的线程控制在1~10范围内。


我们在使用Qt 的方法进行HTTP进行下载时,可以先对文件进行分块,然后对每一块创建一个线程进行下载,上面也讲述了多线程分块下载的好处,但是线程的数目需要自己控制好,下面我们先讲述如何用HTTP请求一个文件的总大小。

代码之路

qint64 getFileTotalSize(QString url, int tryTimes)
{
    qint64 size = -1;

    if (tryTimes <= 0)
    {
        tryTimes = 1;
    }

    do 
    {
        QNetworkAccessManager manager;
        // 事件循环,等待请求文件头信息结束;
        QEventLoop loop;
        // 超时,结束事件循环;
        QTimer timer;

        //发出请求,获取文件地址的头部信息;
        QNetworkReply *reply = manager.head(QNetworkRequest(url));
        if (!reply)
            continue;

        connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
        connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));

        timer.start(2000);
        loop.exec();

        if (reply->error() != QNetworkReply::NoError)
        {
            qDebug() << reply->errorString();
            continue;
        }
        if (reply->error() != QNetworkReply::NoError)
        {
            // 请求发生错误;
            qDebug() << reply->errorString();
            continue;
        }
        else if (!timer.isActive())
        {
            // 请求超时超时,未获取到文件信息;
            qDebug() << "Request Timeout";
            continue;
        }
        timer.stop();

        QVariant var = reply->header(QNetworkRequest::ContentLengthHeader);
        size = var.toLongLong();
        reply->deleteLater();
        break;
    } while (tryTimes--);

    return size;
}

简单分析

上述提供了一个方法来通过HTTP请求获取到下载文件的大小,因为我们要对一个文件进行分块下载,那么首先肯定是要知道文件的大小,要不然怎么分块呢。

qint64 getFileTotalSize(QString url, int tryTimes)

第一个参数为下载文件的url,第二个参数为请求的次数,因为可能某种原因会导致请求失败(比如当前网络不是很好,或者文件服务器繁忙),所以做了三次尝试,尽可能保证请求成功。

对于请求次数首先要进行判断,防止次数为负数或者零。在do-while循环中进行请求文件大小。

这里我们使用了Qt中的事件循环来等待文件大小的请求结束,在文件请求完后结束事件循环。为了防止请求过慢,事件循环时间过长,这里加上了超时,超过2s结束事件循环,重新请求。(因为请求文件头信息在一般情况下耗时较短,除非网络不好或者文件服务器出了问题。具体超时时间按具体情况而定)

我们通过使用 reply->header(QNetworkRequest::ContentLengthHeader); 来获取文件头大小。参数具体可以看下图。

这里写图片描述


尾

通过上面的叙述,我们获取到了要下载文件的大小,代码也很简单,但这只是第一步。下篇文章中将讲述如何分块,并创建多个线程分别下载各个文件块,同时能够保存下载信息,在程序第二次打开时继续下载。

Qt多线程http下载器之三:文件下载异常的处理 用记事本打开,发现其内容是html文本,其中有document.cookie属性,我们需要将该cookie设置到下载的请求参数中。,通用的下载方式只能下载成一个100多字节的文件,但是相关API却返回下载成功。用Qt的network模块设置cookie的代码如下。libcur设置cookie选项的代码如下。右键查看其属性,只有187字节。这样就能正常下载了,如下图所示。下载后的文件如下所示。 阅读详情

相关推荐

Qt Http实现网络文件下载

Qt 封装了Http相关的操作,主要有以下三个类QNetworkAccessManager,QNetworkReply, QNetworkRequest,Qt的版本更新,某些API的变化比较大,例如,qt4x分别使用QFtp和QHttp,Qt5以后统一用QNetworkAccessManager。建议使用Qt5比较新的版本。 ...

琅嬛福地 1万+

QT支持 超大文件 http post上传

以前开发人员写的QT的http post提交大文件代码,超过100M的文件,就基本上崩溃,开发人员走了,无奈作为老板我只能自己修改。改完测试发送650M甚至更大文件没问题,稳定

gaobobo的专栏 2918

Qt多线程http下载器之二:仿迅雷新建下载任务

下图是迅雷9的新建任务界面,目前最新的版本是迅雷11,迅雷9已无法准确检测出文件大小,但任然能正常下载。个人觉得迅雷9的新建任务界面更美观,故仿之。下图是我用Qt实现的效果,功能和迅雷9类似,复制下载url到输入框,迅雷能够自动解析下载文件信息,而且支持文件名的修改。当然还有个比较特别的地方,就是QTableWidget标题栏的样式。图中添加的任务是360安全卫士和爱奇艺。

草上爬的博客 5684

基于Qt的简易Http下载软件

文章目录1. 发送head请求获取文件大小信息2. 发送获取部分文件请求3. 设置代理 一个简单的Http下载软件,支持 断点续传 ,文件下载完成后可直接预览,不过下载速度一般(每次请求大约10K的数据量,也没有使用短线成切片下载)下面的效果截图: 完整效果演示: 这里主要使用了使用了类 QNetworkAccessManager 、 QNetworkRequest 和 QNetworkRe...

不会飞的纸飞机的博客 2159

Qt多线程http下载器之一:仿百度网盘的http下载器

本下载器基于Qt和libcurl,下载未使用Qt的network模块,因为使用libcurl方便封装成SDK供第三方使用,当然下述的这些功能用network模块也是可以实现的。√ 支持多线程下载√ 支持断点续传√ 支持暂停/继续下载√ 支持还原下载任务√ 支持获取实时下载速率、下载大小和剩余时间√ 支持下载限速√ 支持磁盘缓存√ 支持文件哈希校验√ 支持大文件下载√ 支持兼容服务器对客户端加速下载的限制√ 支持下载任务状态记录,下次启动时自动下载未完成的任务。

草上爬的博客 6901

qt 线程池实现多线程下载

使用qt线程池实现多线程http请求,支持限速下载,可以设置全部下载的网络上限,和单个线程的网络上限。可以实时显示当前下载速度。

在QT中采用多线程下载文件

这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。不难理解,如果你线程多的话,那下载的越快。现流行的下载软件 都支持多线程。  思路:  1:用阻塞的方式获取目标地址的HTTP头部,得到目标文件的大小。 

king16304的博客 1415

QT多线程Http源码

实现了多线程下载,可以同时下载不同地址的多个资源。

QT:多线程下载文件

这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。不难理解,如果你线程多的话,那下载的越快。现流行的下载软件都支持多线程。 思路: 1:用阻塞的方式获取目标地址的HTTP头部,得到目标文件的大小。 2:算出每

小豪之家 8258

华为数通---配置风暴控制案例

风暴控制可以通过阻塞报文或关闭端口来阻断广播、未知组播和未知单播报文的流量。

2301_77081516的博客 1624

编程语言的未来走向:趋势、挑战与机遇

同时,鼓励他们接触和掌握一些专业领域的开发工具和技术框架,比如Web开发中的JavaScript、React.js,数据分析的Python(Pandas, NumPy, Matplotlib等),以及人工智能和机器学习领域的TensorFlow、PyTorch等。当前,全球范围内正积极推动编程教育的普及化,从儿童启蒙阶段到高等教育阶段,乃至终身学习的过程中,如何优化编程语言的教学方法、提高教学质量,并将其广泛应用于不同领域,是教育者与政策制定者面临的重大课题。未来,编程语言的多样化和包容性将会继续加强。

zrc_xiaoguo的博客 1827

完全掌握高效多线程下载:专业级Ghost Downloader 3实战指南

**Ghost Downloader 3**是一款基于Python开发的AI智能加速跨平台多线程下载器,它采用先进的智能分块技术和AI优化算法,为Windows、Linux、macOS和Android用户提供媲美IDM的专业级下载体验。无论你是需要下载大文件、在线视频还是网页资源,这款下载器都能轻松应对,真正实现**多线程下载**和**智能加速**的完美结合。 [![Ghost Download

gitblog_00465的博客 1067

UWB定位进阶:如何利用DW1000的CIR数据做NLOS信号识别?

本文深入探讨了如何利用DW1000芯片的信道脉冲响应(CIR)数据进行非视距(NLOS)信号识别,以提升UWB定位精度。通过分析CIR数据的核心价值、预处理方法、特征提取技术以及机器学习模型构建,为研究人员和工程师提供了实用的解决方案,帮助克服室内定位中的NLOS挑战。

weixin_28729205的博客 474

Qt实现 Http网络在线下载程序(支持断点续传功能)

开发过程中遇到了一些坑,花了半天时间搞。出现了很多理论上不应该出现的bug。 访问https前,需要添加libcrypto-1_1.dll与libssl-1_1.dll到Qt\5.14.0\mingw73_32\bin或者exe目录下。 下载地址:http://slproweb.com/products/Win32OpenSSL.html 需要注意一下32位和64位,应下载与自己Qt编译器位数一致的版本。下载好后直接安装,然后到安装目录拷贝即可。 一、gitHub地址 二、功能 支持输入url网

c_shell_python的博客 3474

手把手教你解决Kernel panic报错:init找不到的5种排查方法(附NFS挂载实战)

本文深入解析了Linux系统启动时出现“Kernel panic - not syncing: No working init found”报错的根本原因,并提供了五种系统性的排查方法。文章结合NFS挂载根文件系统的实战场景,详细阐述了从动态链接库依赖、内核引导参数、NFS权限配置、文件系统完整性到内核配置干扰的完整排查路径,帮助开发者快速定位并解决这一常见的系统启动故障。

weixin_29159995的博客 192

Claude Code 100个真实案例 - 用AI做数据可视化大屏(ECharts+实时数据)

数据报表看着枯燥?领导汇报缺少视觉冲击力?是时候做一个酷炫的数据可视化大屏了!本案例将用 Claude Code 从零搭建一个实时数据可视化大屏,使用 ECharts 实现折线图、柱状图、饼图、地图、仪表盘等多种图表,配合 WebSocket 实现秒级数据刷新,深色主题科技感拉满!

yueyeguzhuo的专栏 196

QT下载器开发实战:用AI 3步构建高效多线程工具

这里要注意HTTP协议中Range头的使用,以及如何确保各线程下载的数据能正确拼接成完整文件。最初直接让各线程并发写文件导致数据错乱,后来改为每个线程先下载到临时文件,最后再合并的方案。建议有类似需求的开发者可以试试这个方案,特别是平台的多线程调试工具对排查下载器这类并发问题很有帮助。特别适合快速验证这类桌面应用,尤其是它的AI辅助和实时预览功能,帮我省去了不少环境配置的麻烦。最近在做一个需要批量下载资源的小工具,发现用现成的下载器总有些功能不顺手,干脆自己动手开发一个QT下载器。

RubyLion28的博客 705

【Unity】NGUI下载与导入

Unity3D插件NGUI的下载和导入。

Get your hands dirty 3万+

Ghost-Downloader-3:Python Qt跨平台多线程下载器终极实战指南

在当今数字时代,高效的文件下载工具已成为技术工作者和普通用户的日常必备。Ghost-Downloader-3作为一款基于Python和Qt框架开发的**开源免费下载软件**,不仅提供了**AI智能加速下载**功能,还实现了真正的**跨平台多线程下载器**体验。这款工具采用先进的智能分块技术,无需文件合并即可实现高速下载,支持HTTP、FTP、BT磁力链等多种协议,为Windows、Linux和ma

gitblog_01084的博客 655

PDBfixer:蛋白质结构修复工具

本文介绍蛋白质数据银行(PDB)文件常见问题及修复工具PDBFixer的使用方法。PDB文件常存在缺失原子、残基等问题,PDBFixer可通过GUI、命令行或Python API实现自动化修复。文章详细说明安装方法、命令行参数、Python脚本修复流程及非标准残基替换表,并与Modeller、ColabFold和Rosetta Remodel等其他修复工具进行对比分析,提供了各工具的特点、适用场景和典型计算时间比较,帮助用户根据具体需求选择合适的修复工具。

Protein Designer的博客 611

2025.06.06【Ribo-seq】|RiboCode:基于Ribo-seq数据的全基因组翻译ORF检测工具详解与实战流程

大家好!今天我们要学习的是RiboCode——一个专为Ribo-seq(核糖体足迹测序)数据设计的高质量翻译ORF(开放阅读框)检测工具。RiboCode能够帮助我们在全基因组范围内精准识别翻译事件,发掘经典CDS之外的uORF、dORF、重叠ORF等新型翻译本,极大拓展了我们对转录本翻译潜能的认知。RiboCode 是由清华大学杨学睿课题组开发的开源软件,支持Linux/Mac平台,采用Python实现。自动化流程:一条命令即可完成注释准备、P-site定位、ORF预测。高灵敏度与特异性。

1856

多线程断点下载

多线程断点续传可以应用在上传和下载两个方面,好的上传或者下载案例,都是要求能够 “多线程 + 断点续传 + 进度条显示”。本篇是下载篇,主要是面向服务端程序员阐述原理。 做服务端开发或者web开发的同学,相比于安卓、IOS开发的同学,对于这个概念会比较陌生,因为web只能使用浏览器上传和下载,可编程性不高,客户端具体的上传和下载过程是个黑盒,比如下载过程到底是不是多线程,是不是支持断点续传

fanfan_v5的博客 802

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Qt多线程下载

这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。不难理解,如果你线程多的话,那下载的越快。现流行的下载软件 都支持多线程。 思路: 1:用阻塞的方式获取目标地址的HTTP头部,得到目标文件的大小。

langya121的专栏 621

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: CString与char*互转、ANSI 和 UNICODE 编码及_T和L宏定义的介绍
下一篇: C++中 Unicode 与 UTF-8 编码互转
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值