




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本科毕业论文(设计)原创性声明本科毕业论文(设计)原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取 得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其 他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后 果由本人承担。 作者签名: 年 月 日 目 录 摘 要.i 关键词.i abstract.i key words.i 1 绪论 .1 1.1 课题的研究背景与意义.1 1.2 我国下载工具软件现状分析及发展趋势.1 1.2.1 软件界面 .1 1.2.2 聚合资源 .1 1.2.3 资源占用情况对比 .2 1.3 当今流行下载工具的工作
2、原理.2 1.3.1 http 下载 .2 1.3.2 ftp 下载.2 1.3.3 p2p 下载.2 2 关键技术概述 .3 2.1 多线程技术.3 2.2 http 协议.4 2.3 断点续传技术.4 2.4 开发工具介绍.4 3 系统需求分析 .5 3.1 用户需求分析.5 3.2 业务流分析.5 3.3 可行性分析.5 4 系统概要设计 .6 4.1 用户界面分析.6 4.2 下载任务管理模块.7 4.3 任务信息显示模块.8 4.4 配置管理模块.9 5 系统功能实现 .11 5.1 主界面实现.11 5.2 任务管理功能实现.12 5.2.1 下载功能实现 .12 5.2.2 断点
3、续传实现 .15 5.3 下载信息显示模块实现.15 5.3.1 下载信息显示 .15 5.3.2 多任务下载 .18 5.4 配置管理实现.19 5.4.1 设置默认目录 .20 5.4.2 下载完后关机 .20 小结 .22 致谢 .23 参考文献 .24 多线程下载软件的设计与实现 摘摘 要要:线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开 起几个下载通道。相对单线程而言,多线程把资源文件按线程数分割成相应数目的片段进行分段并 发下载,提高了 cpu 的利用率,也有利于提高下载速度。鉴于当前绝大部分下载工具都讨论的平 台支持话题,本文以 c+为编程语言,以
4、qt creator 为开发平台,实现了一个简单的多线程下载工 具。本论文分析了在网络环境中基于 http 协议进行多线程下载和断点续传的原理和实现方法,对 下载工具的需求分析、具体设计、代码实现、系统测试进行了详尽阐述,同时论述了基于 http、ftp、p2p、p2sp 等下载模式的优缺点。 关键词关键词:多线程;下载;断点续传 design and implementation of the multithread downloading system abstract:the thread can be understood as download channel and one thr
5、ead is one download channel of file.multi-threading is that which open some download channels at the same time.in terms of the relative single-threading,multi-threading divides resource into many parts which are as many as the number of the threads for downloading. that can improve the utilization o
6、f cpu and improve the speed of downloading. according to the topic of support on platforms for download tools,this paper disigned a simple download tool which made c+ as the programming language and based on development platform of jdk1.6 and jcreatorpro.this paper also analyzed the theory and imple
7、mentation of multi-threading and breakpoint resume which based on http protocol in the network environment . key words: muti-threaded; download; breakpoint resume 1 绪论 在当今的网络时代,下载软件是使用最为频繁的软件之一。几年来,下载技术也在不停地发展。 最原始的下载功能仅仅是个“下载”过程,即从 web 服务器上连续地读取文件。其最大的问题是, 由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。随后,
8、“断 点续传”的概念就出来了,顾名思义,就是如果下载中断,在重新建立连接后,跳过已经下载的部 分,而只下载还没有下载的部分。无论“多线程下载”技术是否是洪以容先生的发明,洪以容使得 这项技术得到前所未有的关注是不争的事实。在“网络蚂蚁”软件流行开后,许多下载软件也都纷 纷效仿。 “多线程下载”的基础是 web 服务器支持远程的随机读取,也即支持“断点续传” 。这样, 在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。本文介绍了基于 http 协议的多线程下载和断点续传的实现方法,并给出了一个多线程下载工具的实现过程。 1.1 课题的研究背景与意义 以往我们开发的程序大多是单线程
9、的,即一个程序只有一条从头至尾的执行线索。然而现实世 界中的很多过程都具有多条线索同时动作的特性。例如,我们可以一边看电视,一边活动胳膊,如 果不容许这样做,我们会感觉很难受。再如一个网络服务器可能需要同时处理多个客户机的请求等。 多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可 以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。虽然执行线程给 人一种几个事件同时发生的感觉,但这只是一种错觉,因为我们的计算机在任何给定的时刻只能执 行那些线程中的一个。 多个线程的执行是并发的,也就是在逻辑上“同时” ,而不管是否是物理上的“同时” 。如果
10、系 统只有一个 cpu,那么真正的“同时”是不可能的,但是由于 cpu 的速度非常快,用户感觉不到 其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。 自从“多线程下载”技术发明以来,这项技术得到前所未有的关注已是不争的事实。在“网络 蚂蚁”软件流行开后,许多下载软件也都纷纷效仿,是否具有“多线程下载”技术、甚至能支持多 少个下载线程都成了人们评测下载软件的要素。 “多线程下载”的基础是 web 服务器支持远程的 随机读取,也即支持“断点续传” 。这样,在下载时可以把文件分成若干部分,每一部分创建一个 下载线程进行下载。 1.2 我国下载工具软件现状分析及发展趋势 我国的下载
11、工具软件现在正处在一个高速发展期,由迅雷(thunder) ,风行,电驴 (emule)等领航前进。从多方面资源搜索与调查来看,从本人目前的了解出发,未来的资源下 载工具会向以下几个方向发展。 1.2.1 软件界面 无论多漂亮的界面,看惯了也会生厌,主界面是否具有新意和个性,是否能够在第一时间吸引 用户的目光,操作是否简单、人性化,将是用户关注的重点,至于功能方面反而在其次了,毕竟同 类型下载工具之间的差距不会很大。 如表 1-1,是对迅雷,风行,电驴的界面调查结果。 表 1-1 界面调查对比表 迅雷风行电驴 界面无广告 易于上手 视频播放窗口外部播放器内置外部播放器 1.2.2 聚合资源 决
12、定下载软件成败与否的关键因素有两个,一是下载的速度;二是资源的丰富性和优质性,这 两者缺一不可。但目前大部分下载工具还仅仅停留在只追求速度的基础上,而事实上,用户对资源 的诉求已经远远高于了对速度的诉求,这就导致眼下各类下载软件陷入了死胡同。 如表 1-2,是对迅雷,风行,电驴连接上的时间以及资源的调查结果。 表 1-2 资源调查对比表 软件名称开始连接到视频播放时 种子数/连接数(3 分钟记录) 迅雷1 分 54 秒 30/200 风行36 秒 42/117 电驴8 分 32 秒 7/204 1.2.3 资源占用情况对比 各款软件的资源占用情况,也是很多人非常关心的一个问题。不过,由于在 p
13、2p 下载过程中, 内存占用会根据其下载数据量大小以及种子的多少而实时变化。如图 1-1 所示,对迅雷、风行、电 驴的资源占用情况对比的柱形图。 图 1-1 资源占用情况对比图 1.3 当今流行下载工具的工作原理 现在流行的下载模式有基于 http、ftp、p2p 和 p2sp 下载模式。 1.3.1 http 下载 http 是 hyper text transportation protocol(超文本传输协议)的缩写,它是计算 机之间交换数据的方式,原理非常简单,就是用某种规则(协议)和提供文件的服务器取得联系并 将文件搬到自己的计算机中来,从而实现下载的功能。也就是指可以从网页上直接通
14、过链接获得文 件地址的下载方式。 1.3.2 ftp 下载 ftp 是 transportation protocol(文件传输协议)的缩写,是一种很常用的网络下载方 式。它的标准地址形式就像“ftp:/00/download/123.zip” ,其下载基本与 http 相同。 1.3.3 p2p 下载 p2p 是英文 peer-to-peer(对等)的简称,又被称为 point to point(点对点) 。 “对等” 技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几 台服务器上。它是下载术语,意思是在你自己下载的同时,自己的电脑还要
15、继续做主机上传,这样 你就可以在就近的资源点上下载自己需要的资料。 p2p 工作原理如图 1-2 所示。 图 1-2 p2p 工作原理图 此外,还有一种方式是对 p2p 技术的进一步延伸,叫 p2sp 它不但支持 p2p 技术,同时还通过 多媒体检索数据库这个桥梁把原本孤立的服务器资源和 p2p 资源整合到了一起,用户下载资源的时 候可以从任意就近的 pc 端或者服务器下载想要的资源。而且下载的同时下载程序会从多个资源丰 富的站点产生多个镜像,同时下载文件。 p2sp 工作原理如图 1-3 所示。 图 1-3 p2sp 工作原理图 2 关键技术概述 2.1 多线程技术 线程是一组指令的集合,或
16、者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为 代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操 作系统负责多个线程的调度和执行。 在本设计中,多线程的技术用在新建新任务和下载线程上,在系统中我们可以开始多个下载线 程下载同一个网络上的资源而互不干扰。它从宏观上看是并行运行的,但对于微观上来说,它是却 是串行运行的,线程的运行在操作系统的调度下,各自得到一定的时间片,当某一线程获取到时间 片时,它就进入运行状态。各个线程按照一定的协议分别获取时间片。 2.2 http 协议 http(hypertext transfer protocol,超文
17、本传输协议)是 web 协议集中的重要协 议,用来在 internet 上传送超文本的传送协议。它是从客户机/服务器模型发展起来的。客户机/ 服务器是运行一对相互通信的程序,客户与服务器连接时,首先,向服务器提出请求,服务器根据 客户的请求,完成处理并给出响应。浏览器就是与 web 服务器产生连接的客户端程序,它的端口 为 tcp 的 80 端口。 web 的应用层协议是 http,它是 web 的核心。http 使用 tcp(而不是 udp)作为它的支 撑运输层协议。tcp 为 http 提供可靠数据传输服务。这意味着,一个客户机进程发出的每个 http 请求报文最终都能完整地到达服务器;类
18、似地,服务器进程发出的每个 http 响应报文最终 也能完整地到达客户机。从这里我们看到了分层体系结构最大的优点,即 http 协议不用担心数据 丢失,也不用担心 tcp 是如何从网络的数据丢失和乱序故障中恢复的,那是 tcp 以及协议栈底层 协议的工作。 2.3 断点续传技术 在当今的网络时代,下载软件是使用最为频繁的软件之一。几年来,下载技术也在不停地发展。 最原始的下载功能仅仅是个“下载过程” ,即从 web 服务器上连续地读取文件。其最大的问题是, 由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。随后, “断 点续传”的概念就出来了,顾名思义,就是如果下载中
19、断,在重新建立连接后,跳过已经下载的部 分,而只下载还没有下载的部分。多线程下载的基础是 web 服务器支持远程的随机读取,也即支 持“断点续传” 。这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。 不仅在关机或者网络出错的情况下这项技术。 2.4 开发工具介绍 qt 是诺基亚开发的一个跨平台的 c+图形用户界面应用程序框架。它提供给应用程序开发者 建立艺术级的图形用户界面所需的所用功能。qt 是完全面向对象的,很容易扩展,并且允许真正 地组件编程。 qt 的核心在于它的信号槽机制,该机制也有类似与 mfc 的消息循环的一个事件循环机制, 它模拟了一个事件循环,而不是给
20、了操作系统。当一个信号被访问到时,你如果已经对他安装了槽, 那么他将调用你的槽函数,如果没有,那么将被忽略。该机制十分的灵活,不仅可以处理界面的事 件,还可以实现线程之间的通信,i/o 操作,网络操作等。 qt 作为一种基于 c+ 的跨平台 gui 系统,能够提供给用户构造图形用户界面的强大功能。 为了满足用户构造复杂图形界面系统的需求,qt 提供了丰富的多线程编程支持。从 2.2 版本开始, qt 主要从下面三个方面对多线程编程提供支持:一、构造了一些基本的与平台无关的线程类;二、 提交用户自定义事件的 thread-safe 方式;三、多种线程间同步机制,如信号量,全局锁。这 些都给用户提
21、供了极大的方便。在某些情况下,使用定时器机制能够比利用 qt 本身的多线程机 制更方便地实现所需要的功能,同时也避免了不安全的现象发生。 qt 包含下面一些线程相关的类: qthread 提供了开始一个新线程的方法 qthreadstorage 提供逐线程数据存储 qmutex 提供相互排斥的锁,或互斥量 qmutexlocker 是一个便利类,它可以自动对 qmutex 加锁与解锁 qreadwriterlock 提供了一个可以同时读操作的锁 qreadlocker 与 qwritelocker 是便利类,它自动对 qreadwritelock 加锁与解 锁 qsemaphore 提供了一个
22、整型信号量,是互斥量的泛化 qwaitcondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。 3 系统需求分析 3.1 用户需求分析 随着 internet 的发展,进入信息时代后快速获得网络共享资源成为很简单的事情,人们对互联 网也有了很大的依赖性。人们甚至希望只轻松点击鼠标就可以得到自己想要的东西。比如,针对一 些专业的论坛提供了很多相关资料以方便人们阅读或了解;还有更多的人希望能过下载到他们喜欢 听得音乐、好看的图片、喜欢的电影等等。也可以看出人们在上网时再也不单是打开浏览器来浏览 网页,越来越多的人们开始使用下载软件来获取资源。同时人们也更希望使用更新更快的下载
23、软件。 由于用户下载需求的增大,也要求下载软件能够迅速完成对资源的下载。多线程程序设计可以 很好的解决程序并发的问题。最恰当的比喻就是用户会感到 cpu 似乎同时出现在两个地方,在下 载软件中应用多线程技术可以理解为将一个下载任务分成若干份来完成,其中的并发控制将使下载 的效率大大提高。 由于下载资源是一个过程,当中用到的时间可能会很长。那么在很长的这段时间中很有可能会 出现很多的意外情况使下载中断或是停止,比如电源意外被切断、网络中断、或是操作系统故障导 致系统重新启动。这些原因都会导致下载的中断,但是当用户重新下载资源时发现原来下载的数据 已经消失你还是要回头再来。断点续传就是用来解决这样
24、的问题的,它的任务是在下载任务停止时, 记录当前下载的信息并且利用网络协议中的一些重定向机制继续完成下载任务而不必从头再来。 可以将需求整理如表 3-1 所示。 表 3-1 用户需求分析表 序号功能名称功能描述 1多线程一个下载任务同时由多个线程同时下载 2支持 http 协议能够下载 http 类型的资源数据 3断点续传当断电或者关闭下载任务后,下次能够继续下载 4图形界面输入 url,保存地址和文件名,线程数 根据上面的需求分析,可以将系统分为以下几个模块: 1.用户界面:菜单栏、工具栏、下载信息栏 2.任务管理:新建下载任务,暂停下载任务,开始下载任务,删除下载任务,打开文件目录、 获取
25、下载源文件消息,判断获取的 url 是否有效 3.信息显示:显示下载进度,显示下载信息 4.配置管理:常规设置,如任务完成时播放提示音、全部下载完成时自动关机以及在任务栏通 知区显示图标,下载目录设置,连接设置 3.2 业务流分析 多线程断点续传的业务流程:首先由用户进入软件系统,在新建任务中填写必要的下载资源的 相关属性,比如相关资源下载地址 url、存储路径、以及下载线程数等。由软件发送 http 消息 请求,然后服务器根据请求返回响应消息。确认无误就可以启动线程开始下载资源。将缓存中存储 的数据最终存储到目的存储路径。此外,系统为用户提供了一些对任务的基本操作,比如,停止、 继续、删除等
26、。 3.3 可行性分析 可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要达到这 个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完 成后所能带来的效益是否达到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一 次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析 和设计的过程。 系统的可行性分析主要包括技术上的可行性和操作上的可行性。 技术可行性:通过根据软件的需求,对本设计的技术实现进行全面的了解,可以采用多线程机 制,通过设置 http 的请求头信息,可以实现连接远程资源的指定偏移位
27、置,通过这个特性我们 就可以实现多线程及断点续传的功能。所以根据目前已知的技术,在技术上实现多线程下载没有问 题。 操作可行性:下载程序的具备友好的用户界面,而且操作简单易于被用户接收,使用此下载程 序十分方便,因为软件的操作思路比较清晰,而且用户实际操作的内容较少,所以用户只需要熟练 操作计算机即可。因此从使用操作方面看,此系统得开发是可行的。 4 系统概要设计 4.1 用户界面分析 本系统的用户界面由多个类组成,包括下载文件属性面板类、添加下载任务对话框、按钮工具 条等。用户界面类功能图如图 4-1 所示。 图 4-1 用户界面类功能图 界面显示菜单栏、工具栏、下载信息栏以及显示时间区,设
28、计代码如下。 class ui_getit public: qaction *new; /新建下载 qaction *quit;/退出 qaction *start;/开始下载 qaction *pause;/暂停下载 qaction *delete;/删除下载 qaction *config;/配置管理 qaction *about;/关于 qwidget *centralwidget; qtablewidget *tasktable;/下载信息表 qlabel *label_time;/系统时间 qmenubar *menubar;/菜单栏 qmenu *menu;/菜单 1 qmenu
29、*menu_2;/菜单 2 qmenu *menu_3;/菜单 3 用户界面 下载文件属性面板 应用程序主窗口 添加下载任务对话框 主窗口中按钮工具条 qtoolbar *maintoolbar;/工具栏 void setupui(qmainwindow *getit) /创建对象 new = new qaction(getit); new-setobjectname(qstring:fromutf8(new); qicon icon; new-seticon(icon); quit = new qaction(getit); quit-setobjectname(qstring:fromut
30、f8(quit); start = new qaction(getit); start-setobjectname(qstring:fromutf8(start); qicon icon1; start-seticon(icon1); pause = new qaction(getit); pause-setobjectname(qstring:fromutf8(pause); qicon icon2; pause-seticon(icon2); delete = new qaction(getit); delete-setobjectname(qstring:fromutf8(delete)
31、; qicon icon3; delete-seticon(icon3); config = new qaction(getit); config-setobjectname(qstring:fromutf8(config); qicon icon4; config-seticon(icon4); about = new qaction(getit); about-setobjectname(qstring:fromutf8(about); centralwidget = new qwidget(getit); centralwidget-setobjectname(qstring:fromu
32、tf8(centralwidget); tasktable = new qtablewidget(centralwidget); if (tasktable-columncount() setcolumncount(10); 4.2 下载任务管理模块 任务管理模块主要是新建下载任务,以及对正在下载的文件进行相关操作。下载任务定义了下 载任务的所有信息。包括:下载任务对应的 url 地址;下载任务对应文件的大小(以字节数来衡量); 下载任务要使用线程数,这样才能根据文件总的大小来计算出每个线程要下载的那一小段的大小; 下载完的文件存放的目录和存放的文件名。 此外为了支持断点续传功能,在下载任务实
33、体类中还需要定义上次文件下载和当前文件已下载 长度。任务管理模块如图 4-2 所示。 图 4-2 任务管理模块 任务管理包含新建下载任务、开始下载任务、暂停下载任务及删除下载任务等,设计代码如下。 class getit : public qmainwindow q_object public: getit(qwidget *parent = 0); getit(); private: qtimer *timer; qqueue tasklist; qclipboard *clipboard; struct taskinfo/下载信息 qtablewidgetitem *name; qlabe
34、l *filesize; qprogressbar *pro; qlabel *downloadedsize; qtablewidgetitem *host ; qlabel *taskspeed; qlabel *timeused; qlabel *timeremaining; qtablewidgetitem *filestyle; ; private slots: void updatetaskinfo();/更新任务 void on_new_clicked();/新建下载 void on_start_clicked();/开始下载 void on_pause_clicked();/暂停
35、下载 void on_delete_clicked();/删除下载 void on_about_clicked();/关于 void on_quit_clicked();/退出 void timerevent(qtimerevent* event);/显示时间 ; 任务管理 新建下载任务 开始下载任务 暂停下载任务 删除下载任务 测试连接 url 是否有效 获取下载源文件消息 4.3 任务信息显示模块 信息显示模块是在建立连接后,将下载进度及相关下载信息显示在界面上。 信息显示模块设计如图 4-3 所示。 图 4-3 信息显示模块 任务信息主要包含 url、保存路径、线程数等,在新建下载任务时
36、需要选择下载保存路径, 设计代码如下。 class newdialog : public qdialog private: bool init(); public: newdialog(qwidget *parent); qlabel *urlpath;/url qlabel *savepath;/保存路径 qlabel *threadcount;/线程数 qspinbox *threadcountbox;/选择线程数 qlineedit *urlline;/填写 url qcombobox *savepathbox;/选择保存路径 qpushbutton *browse;/选择目录 qpus
37、hbutton *ok;/确定 qpushbutton *cancel;/取消 qstringlist savedir;/选择的存储目录 bool reply;/true 表示确定 private slots: void on_browse_clicked();/选择目录 void ok_clicked();/确定 void on_cancel_clicked();/取消 ; 4.4 配置管理模块 配置管理模块是对软件的常规设置,包含对提示音的设置,全部下载完成时自动关机以及下载 目录设置,默认线程设置。 线程监听类功能图如图 4-4 所示。 任务信息显示 上次文件下载长度 下载任务的 url
38、 下载文件的大小 下载文件存放目录 当前文件已下载长度 图 4-4 配置管理模块 配置管理设计代码如下。 class ui_config : public qdialog public: qwidget *centralwidget; qlabel *config;/设置 qradiobutton *lasttime_dir;/设置为上次使用过的目录 qradiobutton *choose_dir;/使用指定的存储目录 qcombobox * savepathbox;/选择目录 qpushbutton * savepath_btn;/选择目录按钮 qlabel *others;/其他设置 q
39、label *threadcount;/线程数 qspinbox * threadcountbox;/线程数选择 qcheckbox *shutdown;/关机 qpushbutton *ok;/确定按钮 qpushbutton *cancel;/取消按钮 void setupui(qmainwindow *mainwindow) this-resize(361, 279); centralwidget = new qwidget(mainwindow); label = new qlabel(centralwidget); radiobutton = new qradiobutton(cen
40、tralwidget); radiobutton_2 = new qradiobutton(centralwidget); combobox = new qcombobox(centralwidget); pushbutton = new qpushbutton(centralwidget); label_2 = new qlabel(centralwidget); label_3 = new qlabel(centralwidget); spinbox = new qspinbox(centralwidget); spinbox-setobjectname(qstring:fromutf8(
41、spinbox); spinbox-setgeometry(qrect(190, 150, 41, 21); spinbox-setvalue(5); checkbox = new qcheckbox(centralwidget); pushbutton_2 = new qpushbutton(centralwidget); 配置管理模块 提示音的设置 下载完成后自动关机 下载目录设置 默认线程设置 pushbutton_3 = new qpushbutton(centralwidget); 5 系统功能实现 5.1 主界面实现 下载程序的主界面设计使用 qt creater 开发主要分成四部
42、分:第一部分是菜单栏,提供功 能选项;第二部分是标准按钮栏,作为对菜单栏的一个快捷方式;第三部分是信息列表框,其中包 括下载软件的名称、大小、下载进度、下载速度、剩余时间等下载任务的属性;第四部分是显示当 前时间栏。在下载过程中,文件的相关信息都会显示在信息列表框中,用户可以方便地看到下载文 件的状况。主界面如图 5-1 所示。 图 5-1 主界面 整个界面是继承了 qmainwindow 类,以窗口状态呈现。菜单栏使用了 qmenubar 类, 相应的每个菜单使用了 qmenu 类,具体的操作使用了 qaction 类,比如新建下载、开始下载等。 通过调用 addaction()函数,将该操
43、作附加到菜单上。信息列表框实用了 qtablewidget 类, 里面的每一项使用了 qtablewidgetitem 类。 界面实现代码 bool newdialog:init() this-resize(329,163); this-setwindowtitle(tr(新建); qpalette palette; qbrush brush(qcolor(255, 255, 255, 255); brush.setstyle(qt:solidpattern); palette.setbrush(qpalette:active, qpalette:base, brush); qbrush br
44、ush1(qcolor(233, 235, 254, 255); brush1.setstyle(qt:solidpattern); palette.setbrush(qpalette:active, qpalette:window, brush1); palette.setbrush(qpalette:inactive, qpalette:base, brush); palette.setbrush(qpalette:inactive, qpalette:window, brush1); palette.setbrush(qpalette:disabled, qpalette:base, b
45、rush1); palette.setbrush(qpalette:disabled, qpalette:window, brush1); this-setpalette(palette); urlpath =new qlabel(tr(url:); urlline =new qlineedit(this); urlpath-setbuddy(urlline); savepath=new qlabel(tr(保存目录:); savepathbox =new qcombobox(this); browse =new qpushbutton(tr(浏览.); browse-resize(10,20
46、); threadcount =new qlabel(tr(线程数量:); threadcountbox =new qspinbox(); threadcountbox-setvalue(5); threadcountbox-setrange(1,10); ok =new qpushbutton(tr(确认); cancel =new qpushbutton(tr(取消); qgridlayout *gridlayout = new qgridlayout(); gridlayout-setspacing(0); gridlayout-setcontentsmargins(11, 11, 11
47、, 11); gridlayout-setobjectname(qstring:fromutf8(gridlayout); gridlayout-setcontentsmargins(0,0,0,0); gridlayout-addwidget(urlpath, 1,0,2,0); gridlayout-addwidget(urlline, 1,1,2,21); gridlayout-addwidget(savepath,2,0,2,1); gridlayout-addwidget(savepathbox, 2,1,2,18); gridlayout-addwidget(browse, 2,2
48、0,2,1); gridlayout-addwidget(threadcount, 3,0,2,1); gridlayout-addwidget(threadcountbox, 3,1,2,1); gridlayout-addwidget(ok,4,3,2,1); gridlayout-addwidget(cancel,4,18,2,1); qvboxlayout *mainlayout =new qvboxlayout(); mainlayout-addlayout(gridlayout); setlayout(mainlayout); this-savepathbox-seteditabl
49、e(true); this-savepathbox-setedittext(qfsfileengine:homepath(); this-ok-setdefault(true); return true; 5.2 任务管理功能实现 下载任务管理主要是对下载任务进行操作,下载任务中主要包括新建下载任务、开始下载任务、 暂停下载任务、删除下载任务。 5.2.1 下载功能实现 下载功能的实现主要原理是: 1.判断 newhttptask 构造函数中参数是否合法; 2.然后通过使用 httpclient 包,建立 http 连接; 3.通过 head 方法得到相应文件的长度信息; 4.判断是否支持多线
50、程下载; 5.通过判断状态码(status code)判断是否有异常或者文件是全部下载还是部分下载,也 就是文件是第一次下载还是有过停止后继续下载。 6.根据下载线程数把文件分块; 7.建立相应线程进行下载,并写到指定路径; 新建下载任务对话框的设计主要是根据 qdialog 设计实现,如图 5-2 所示。 图 5-2 新建下载任务对话框 新建下载任务流程图,如图 5-3 所示。 任务管理界面 新建任务界面 填写任务信息栏 是否符合 http 请求 开始完成下载 返回 http 响应信息 n y 图 5-3 新建下载任务流程图 多线程下载程序是通过网络协议支持进行资源的下载,在这里对建立下载任
51、务(task)添加 方法 starttask、pausetask、downloadprogress、downloadfinished 对任务进 行操作。由支持 http 协议下载(httptask) ,继承 task 的并实现通过 http 协议下载。这样 做的好处就是软件会有很好的扩展性,通过对 task 的继承还可以产生支持不同协议的下载,比如 ftp 下载、ed2k 下载、http 下载等等。 从对话框中可以看到下载任务的三个主要参数:url 地址、存储目录、以及选择下载线程数, 在信息填写完毕后按下确定按钮就会对 newhttptask 建立实例开始进行下载。 下载任务类图如图 5-4
52、 所示。 +starttask() +pausetask() +downloadprogress() +downloadfinished() t ta as sk k +starttask() +pausetask() +downloadprogress() +downloadfinished() h ht tt tp pt ta as sk k +starttask() +pausetask() +downloadprogress() +downloadfinished() f ft tp pt ta as sk k +starttask() +pausetask() +downloadpr
53、ogress() +downloadfinished() e ed d2 2k kt ta as sk k 图 5-4 下载任务类图 1.starttast():用于开始下载任务 2.pausetast():用于暂停下载任务,记录当前下载的位置,以便下次可进行断点续传 3.downloadprogress():若下载状态改变,则完成下载 4.downloadfinished():完成下载 下载任务根据用户需求新建任务,在新建任务中填写必要的下载资源的相关属性,比如相关资 源下载地址 url、存储路径、以及下载线程数等。由软件发送 http 消息请求,然后服务器根据 请求返回响应消息。确认无误就
54、可以启动线程开始下载资源。 下载任务顺序图如图 5-5 所示。 图 5-5 下载任务顺序图 下载任务管理主要的是对下载任务进行的一系列操作,包括新建下载任务、暂停下载任务、删 除任务等一些操作。新建下载任务是是根据用户下载需求来创建下载任务的功能,用户需要提供下 载资源的 url 地址、选择存储文件的路径、用户希望下载时的线程数、以及存储时的文件名称。 下载软件会根据新建任务栏的信息完成下载任务并且进行监控。其中选择存储文件的路径可以通过 单击浏览按钮来选择存储文件夹。暂停下载任务是暂停正在下载的文件。删除任务是删除下载的文 件。 5.2.2 断点续传实现 断点续传实现原理:用一个变量将该线程
55、下载的值保存起来,需要在 http 请求的 header 中添加 rang 节,告诉服务器从文件的那个位置开始传输。 下载 http 中断点续传代码: httpthread:httpthread(short threadindex,long startbyte,long endbyte,qurl url,qfile *file) this-threadindex=threadindex;/第几个线程 this-startbyte=startbyte;/开始 this-endbyte=endbyte;/结束 this-url=url; this-file=file; this-donebytes
56、=0;/已下载 void httpthread:run() /根据 http 协议,写入 range 头部,说明请求文件的范围,并且开始下载 qhttprequestheader header; header.setrequest(get,url.path(); /告诉服务器从 startbyte 起开始传输 header.setvalue(range,bytes=+qstring:number(startbyte)+-+qstring:number(endbyte); qstring useragent = getit/0.1; header.setvalue(host, url.host(
57、); header.setvalue(accept, */*); header.setvalue(user-agent, useragent); http.sethost(url.host(); http.request(header); connect( connect( this-exec(); 5.3 下载信息显示模块实现 5.3.1 下载信息显示 下载信息主要包括 url、下载线程数、下载文件长度、文件名、下载状态信息、平均下载速 度、下载运行时间。 功能实现代码如下: void getit:on_new_clicked() newdialog n(this); if(!this-cl
58、ipboard-text().isempty()/判断剪切板是否为空 if(this-clipboard-text().contains(:/) n.urlline-settext(this-clipboard-text(); n.exec(); qstring url=n.urlline-text();/取 url 的值 qstring aa=url.split(:/).first();/取 url 中:/前面的值 if(n.reply = ok) if(url = ) qmessagebox:information( this, tr(警告), tr(对不起,url 不能为空.); ret
59、urn; if(url.split(:/).first()=http)/判断是不是 http 下载 httptask t(qurl(url),qdir(n.savepathbox-currenttext(), n.threadcountbox-value(); if(t.state!=error) /url、下载线程数、下载文件长度、文件名、下载状态信息、平均下载速度 tasklist.append( struct taskinfo info= new qtablewidgetitem(t.taskname,0), new qlabel(),new qprogressbar(0), new q
60、label(),new qtablewidgetitem(t.url.host(),0), new qlabel(),new qlabel(),new qlabel(), new qtablewidgetitem(t.taskname.right (t.taskname.length()-t.taskname.lastindexof(.)+1+ file,0) ; taskinfolist.append( this-showtaskinfo(taskinfolist.size()-1); tasklist.last()-run(); else if(url.split(:/).first()=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025协管员考试试题及答案
- 基于FPGA的双余度FC-AE-ASM光纤通信卡逻辑设计与验证
- VA族低维无铅钙钛矿材料的制备及光电性能研究
- UHPLC-Q-Exactive-Orbitrap-MS实验技术结合理论化学研究参苓白术颗粒的化学成分及其防伪质量标记物
- 斯特林直线发电系统控制策略研究
- 2025年第六届全国国家版图知识竞赛测试试题题库(中小学组)及答案详解【基础+提升】
- 加速康复外科背景下结直肠癌患者术后氮平衡与早期预后的关系及影响因素分析
- 2025年生态循环农业技术模式在有机农业中的应用与效益报告
- 工业互联网平台视角下2025年传感器网络自组网技术发展报告
- 2025年特色农产品电商平台金融服务平台构建研究报告
- 诚信教育主题班会
- 成都医学院辅导员考试真题2022
- 氯磺化聚乙烯生产工艺技术
- 桐庐县2023年三下数学期末综合测试试题含解析
- 装饰施工阶段安全检查表完整
- 数值课件第章非线性方程求根
- TEC-5600除颤操作培训
- 苏科版二年级下册劳动第7课《做皮影》课件
- 芯片手册盛科sdk用户开发指南
- SH/T 0659-1998瓦斯油中饱和烃馏分的烃类测定法(质谱法)
- GB/T 4100-2015陶瓷砖
评论
0/150
提交评论