首页 > 编程知识 正文

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

时间:2023-05-06 13:09:21 阅读:186000 作者:2411

Qt的HTTP请求下载(支持断点分发)文章可以使用Qt的方法下载HTTP请求,同时进行断点分发。 这篇文章是本文的后续。

我们在网上下载软件、电影、文件等,大部分都是使用迅雷下载。 因为迅雷下载相对来说比较快。 在我们的日常生活中,使用迅雷下载大文件时,非常占用互联网的速度,占用了整个家庭局域网的带宽。 虽然浏览器可能无法打开网页,但迅雷有限速功能,可以保护正常的互联网连接。 请看下图。

这是最新的迅雷9设置界面,可以看到你在画圈。 这里有原始地址线程数。 默认值为5,范围为1-10。 也就是说,迅雷将一个下载任务分为5个线程分别进行下载。 五个线程对于一个线程,资源断开相对较多,资源断开相对较多

3358 www.Sina.com/http://www.Sina.com /的下载速度还是看网络的最大带宽,所以最大下载速度不能超过宽带运营商提供的最大带宽如下图所示,可以将每个矩形看作管。 水从上面的红管子流下,绿管子是本地的计算机卡,一般网卡是100兆位的网卡,这个绿管子相对于网络带宽相对较粗,所以计算机卡一般请看下面的棕色管子。 这里指的是浏览器等其他软件占用的网络速度,而蓝管是迅雷下载占用的网络速度。 比较左右两幅图可以看出3358www.Sina.com/,难道说线程越多,下载速度越快吗?

3358 www.Sina.com/http://www.Sina.com /由于红色管路半径一定,也就是水流量一定,所以随着下面蓝色管路的增加,每根的水流量相对减少。不一定,所以并不是线程越多越好。3根管子的水流量 = 1根管子的水流量在迅雷的情况下,将一个任务的线程控制在1~10的范围内。

使用Qt方法下载HTTP时,可以先阻止文件,然后为每个块创建线程进行下载。 还介绍了多线程封锁加载的好处,但您必须自己控制线程的数量。 介绍如何在HTTP中请求文件的总大小。

代码路径qint 64 getfile total size (qstring URL,int tryTimes ) { qint64 size=-1; trytimes=0{ trytimes=1; } do { qnetworkaccessmanager; //事件循环,等待请求文件的标头信息结束; 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 (; 修复错误!=qnetworkreply :3360 no error (q debug ) (reply-errorString ); 连续; (if )修复错误!=qnetworkreply :3360否error (//请求发生错误; q调试(reply-errorstring ); 连续; } else if (! timer.isActive () ) /请求超时,无法获取文件信息。 qDebug () Request Timeout ); 连续; (} timer.stop ); qvariantvar=reply-header (qnetworkrequest : contentlength header ); size=var.toLongLong (; reply-deleteLater (; 黑; (while(trytimes----); 返回大小; } 也就是说线程越多抢占的资源相对较多以上提供了一种从HTTP请求中获取下载文件大小的方法。 为了将文件分块下载,首先需要知道文件的大小。 否则,怎么分块呢?

qint 64获取文件总大小(qstring URL,int tryTimes ) )。

第一个参数是下载文件的url,第二个参数是请求的次数。 由于某些原因(例如当前网络不好或文件服务器忙),请求可能会失败,因此我们尝试了三次以确保请求尽可能成功。

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

它使用Qt中的事件循环等待文件大小请求完成,然后在文件请求完成后退出事件循环。线程是越多越好吗?,在此添加了超时。 退出事件循环超过2s,然后重新请求。 (请求文件头信息是因为,只要网络不好或文件服务器没有问题,一般都会花费时间。 具体取决于不一定情况)

我们通过使用reply-header (qnetworkrequest :3360内容头); 请参阅。 参数请参照下图。

最后,获得了要下载的文件的大小。 代码也很简单,但这只是第一步。 下一篇文章将介绍如何分块,创建多个线程下载每个文件块,同时保存下载信息,并在程序第二次打开时继续下载。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。