2830.多线程下载工具的设计与实现论文.doc
《2830.多线程下载工具的设计与实现论文.doc》由会员分享,可在线阅读,更多相关《2830.多线程下载工具的设计与实现论文.doc(24页珍藏版)》请在课桌文档上搜索。
1、简单多线程下载工具的设计与实现【摘要】随着互联网应用范围不断扩展,网络包含的信息资源日益增多。互联网用户可以通过网络下载所需的数据资源并保存到本地磁盘当中,因此相应的基于网络的下载工具应运而生。随着基于网络的多线程下载技术的出现,如今的下载工具已彻底摆脱了带宽瓶颈的束缚并且向着更为人性化的方向发展。本设计采用Java和多线程技术设计并实现了一个简单多线程下载工具。该工具可对指定的任务进行下载,同时支持断点续传功能。【关键字】java;多线程;断点续传;Swing目录1.引言31.1 开发背景31.2 开发意义32. 系统分析32.1 设计概述32.1.1 实现目标32.1.2 开发环境32.2
2、.开发相关技术简介32.2.1 Java语言简介32.2.2 多线程技术简介42.2.3 HTTP1.1协议42.2.4 断点续传的技术42.3 可行性分析42.3.1 技术可行性分析42.3.2 经济可行性分析52.3.3 操作可行性分析53. 概要设计53.1 系统结构图53.2 功能流程图54.详细设计64.1 获取网络资源64.1.1 功能说明64.1.2 设计说明64.1.3 核心代码74.2 线程任务分配84.2.1 功能说明84.2.2 设计说明84.2.3 设计流程84.3 创建下载任务94.4 任务下载104.4.1 功能说明104.4.2 设计说明104.4.3 核心流程1
3、14.5 事件监听器设计124.5.1 功能说明124.5.2 设计说明124.6 下载控制器设计124.6.1 功能说明134.6.2 设计说明134.6.3 功能流程144.7 显示控制器设计154.7.1 功能说明154.7.2 设计说明154.8 断点记录文件设计174.8.1 功能说明174.8.2 设计说明174.8.3 保存断点线程流程图184.9 文件操作184.9.1 功能说明184.9.2 设计说明184.9.3 文件操作流程194.10 GUI界面设计194.10.1 功能说明204.10.2 设计说明205. 设计问题总结215.1 断点设置问题215.2 下载速度统计
4、问题226. 参考文献资料221.引言1.1 开发背景随着互联网应用范围不断扩展,网络包含的信息资源日益增多,互联网用户可以通过网络下载所需的数据资源保存在本地磁盘当中,因此相应的基于网络的下载工具应运而生。对于一个网络下载工具,有两个问题一直阻碍着下载技术的发展:速度和下载后的管理。但是伴随着基于网络的多线程下载技术的出现,如今的下载工具彻底摆脱了这两个问题的束缚并且向着更为人性化的方面发展下去。1.2 开发意义本系统是开发一个简单的多线程下载工具,基本实现单资源的多线程任务下载,同时实现断点续传的功能。相对于目前主流下载工具的实现技术,本设计是不能相比的。实现这么一个下载具最大的意义是探索
5、多线程下载的基本原理,综合运用所学的知识,提高自己的动手能力,及查阅资料继续学习的能力。2. 系统分析2.1 设计概述对于这么一个多线程下载工具的设计,首先就是要设定好实现的目标,确定开发的环境。有个合理的设计目标使得在设计过程中不茫然,思路更清楚。而一个好的开发环境对提高开发的效率起着很重要的作用。2.1.1 实现目标实现一个实用的多任务,多线程下载工具。具备以下功能:1、 实现一个简洁的易操作的GUI界面2、 实现新建下载任务的功能3、 下载过程实现多任务,多线程的功能4、 实现任务暂停,及恢复下载的功能5、 实现停止任务功能2.1.2 开发环境Eclipse,windows xp,jre
6、,jdk2.2.开发相关技术简介本节将对本设计中用到的一些主要技术进行简单的介绍。2.2.1 Java语言简介Java是一种简单的、面向对象的、分布式的、解释型的、健壮安全的、结构中立的、可移植的、性能优异、多线程的语言,自1995年SUN推出JAVA语言后,全世界的目光都被这个神奇的语言所吸引。由于Java所具有的以上那些特性,所以我选用JAVA做为本设计的开发语言。2.2.2 多线程技术简介线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。在
7、本设计中,多线程的技术用在新建新任务和下载线程上,在系统中我们可以开始多个下载线程下载同一个网络上的资源而互不干扰。它从宏观上看是并行运行的,但对于微观上来说,它是却是串行运行的,线程的运行在操作系统的调度下,各自得到一定的时间片,当某一线程获取到时间片时,它就进入运行状态。各个线程按照一定的协议分别获取时间片。2.2.3 HTTP1.1协议HTTP1.1(Hypertext Transfer Protocol Vertion 1.1)超文本传输协议-版本1.1 。它是用来在Internet上传送超文本的传送协议。它是运行在TCP/IP协议族之上的HTTP应用协议,它可以使浏览器更加高效,使网
8、络传输减少。任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用用户请求。您的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。2.2.4 断点续传的技术在当今的网络时代,下载软件是使用最为频繁的软件之一。几年来,下载技术也在不停地发展。最原始的下载功能仅仅是个“下载过程”,即从WEB服务器上连续地读取文件。其最大的问题是,由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。随后,“
9、断点续传”的概念就出来了,顾名思义,就是如果下载中断,在重新建立连接后,跳过已经下载的部分,而只下载还没有下载的部分。多线程下载的基础是WEB服务器支持远程的随机读取,也即支持“断点续传”。这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。 不仅在关机或者网络出错的情况下这项技术。2.3 可行性分析可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。它的目的不是解决问题,而是确定问题是否值得去解决。2.3.1 技术可行性分析通过根据软件的需求,对本设计的技术实现进行全面的了解,可以采用java的多线
10、程机制,通过设置HTTP 1.1的请求头信息,可以实现连接远程资源的指定偏移位置,通过这个特性我们就可以实现多线程及断点续传的功能。所以根据目前已知的技术,在技术上实现多线程下载没有问题。2.3.2 经济可行性分析从开发这个简单多线程的意义上我们可以看出,赢利不是制作这个下载工具的目的,而只是为了单纯的探索多线程下载的基本原理,综合运用所学的知识,提高自己的动手能力,及查阅资料继续学习的能力。所以它也就不存在经济的问题。而从它的意义上来说,绝对值得制作这个下载工具。2.3.3 操作可行性分析由于这个多线程下载工具所面向的是广大的互联网用户,所以在设计中采用简洁的GUI界面。也因为简洁的界面设计
11、使得系统在操作方式上很容易让用户接受。在操作上对一没有计算机操作经验的人来说也不会有难度,因此在操作上也是行得通的。3. 概要设计3.1 系统结构图本系统采用现今比较流行的三层结构进行系统分层,这三层分别为GUI表现层,控制层,底层下载操作,文件及网络操作,系统的结构图如图3-1图 3-1 系统结构图3.2 功能流程图新建下载及恢复下载功能流程图见图3-2,在这里新建任务与恢复任务仅是在任务的构建方式上不一样,在网络操作及下载操作上都没有什么区别,这样的实现主要得益于对代码重用性的设计。图 3-2 新建/恢复任务流程图暂停与停止的功能实现流程图见图3-3,从这个图中我们可以发现和新建任务,恢复
12、任务一样具备同样的代码利用,停止线程过程是同一个,他们两个在功能上不同仅是暂停任务时我们需要将暂停的断点记录下来,而停止任务却是将断点记录给删除,并删除已下载的部分文件信息。图 3-3 暂停/停止任务流程图4.详细设计4.1 获取网络资源获取网络资源是下载过程中的第一个步骤,也是很关键的一步。由于网络的问题是多变的,有可能指定的下载资源已经不存在,或者网络连接有问题,等一系列的问题,因些在连接资源过程中我们得对于相应的连接进行相应在测试,它是否可行,它的信息是否是我们想要的,这一节主要就是讨论这个功能。4.1.1 功能说明要下载一个远程的资源就需我们能够先定位到指定的资源,并建立连接。在本模块
13、中实现的基本功能说是与远程的资源进行连接,并测试其连接状态。4.1.2 设计说明在做这个模块之前我们得先来了解下HTTP协议。HTTP协议就是超文件传输协议,采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。1、连接资源通过JDK的net包中包含的URL及HttpURLConnection两个类对网上资源进行操作。URL指定网络资源的位置,而HttpURLConnecti
14、on中则封装了操作指定网络资源的方法。在本系统中我设计了类ConnectionManager,它的主要功能就是通过提供指定的URL获取HttpURLConnection对象,为控制层代码利用HttpURLConnection对象操作网络文件提供支持。控制层代码只要调用ConnectionManager.getConnection(URL)即可。2、测试连接在网络连接过程中可能出现各种各样的问题,而我们需要的只是连接成功的正确网络资源,所以我们有必要对通过ConnectionManager获取的与服务器的连接进行测试。如果测试成功,即能正确获取到指定的资源,包括获取是否支持断点续传的功能,之后我
15、们才对指定的资源进行下载操作,否则抛弃信息,并对用户进行相应的提示。通过对HTTP1.1协议的了解,我们知道只要我们发送一个指定的请求头信息,服务器就会返回一个携带着请求后服务器处理完成的信息,这个信息就包括请求是否成功等。我们要做的就是构造这样一个带有指定的请求的头信息发送到服务器端,然后查看它返回的响应码,因为我们完成可能从响应码中去了解一个请求是否成功。要设计一个什么样的请求头才能符合我们的要求的测试效果呢?通过设计请求头信息中的RANGE字段我们可以指定请求URL指向目标资源的偏移量,而不是从头开始读。这个也是断点及多线程下载资源的一个重要属性,我们将在后面作更详细说明。如果我们设置完
16、这个头信息并发送到服务器端,如果源请求的资源存在并且服务器支持断点续传,这时它返回的响应码信息就是206,如果存在但不支持断点则返回200,而其它的情况就都是连接失败的情况了。这样测试连接的理论基础就完成了,那我们用net包的类怎么设置请求头信息,如何获取响应码信息呢?其实这些都是很容易的,代码如下:connection.setRequestProperty(RANGE,bytes=+0+-);设置请求头的RANGE字段int code = connection.getResponseCode();获取响应码信息到此,有关网络连接,及测试连接的设计就告一段落了。4.1.3 核心代码1、 获取连
17、接如果获取网络资源出错时则返回一个空值public static HttpURLConnection getConnection(URL url)HttpURLConnection huc = null;try huc = (HttpURLConnection)url.openConnection(); catch (Exception e) huc=null;throw new RuntimeException(连接资源错误+e.getMessage();finallyreturn huc;2、 测试连接private int testConnection(URL url)HttpURLCo
18、nnection connection = ConnectionManager.getConnection(url);int state = ConnectionManager.CONNECT_ERROR;/初始值为连接失败if(connection!=null)try /设置请求头,为了判断其是否支持服务器端随机读取connection.setRequestProperty(RANGE,bytes= + 0 + -);/获取响应信息String errorMessage = connection.getResponseMessage();/获取响应码int code = connection
19、.getResponseCode();switch(code)case 200:state = ConnectionManager.NO_BREAKPOINT_SUPPORT;break;case 206:state = ConnectionManager.BREAKPOINT_SUPPORT;break;default:state = ConnectionManager.CONNECT_ERROR;errorManager.addErrors(code,errorMessage); catch (Exception e) state = ConnectionManager.CONNECT_E
20、RROR;errorManager.addErrors(1000, 未知的主机地址,请检查网络连接或者下载URL地址n注:本系当前只运行HTTP下载);return state;4.2 线程任务分配我们通过对http1.1协议的了解后,知道通过对它的请求头进行设置,就可以获取到远程文件的指定部分,而不用从头开始下载。利用这个特性我们就可以设计一个多线程下载的原型出来了。要进行多线程下载,主要实现的是为每个线程分配一个指定范围的数据下载,那怎么为每一个下载线程进行任务分配呢?这就是这一节要讨论的内容。4.2.1 功能说明在多线程下载过程中,我们需要让每一个线程都指向指定资源的一部分,且不重复,如
21、何为每一个下载线程分配它指向的特定部分就是这个模块所要完成的任务。4.2.2 设计说明确定了采用分块的形式进行任务的分配,那我要考虑的问题就只有如何分块了,如何分配才能准备无误,并且保证各个下载线程所要下载的任务更合理。本系统采用的是平均分配的方法。就是为每一个下载线程分配尽可能相同的字节数,在这个过程中我们得指定下载任务相对于资源起点的偏移量及下载的长度。分配过程如下:1、 获取资源长度,这个可以从请求的响应信息中获取“Content-Length”字段获得,代码如下:connection.getHeaderField(Content-Length);2、 根据线程数计算各个任务块的偏移量及
22、下载长度,这个过程简单,但得注意字节重复的问题。4.2.3 设计流程图 4-1 任务分配流程图4.3 创建下载任务有了之前的一系列操作,我们就可以着手创建下载任务了,我将下载的任务封装成两个实体,Task和SubThread。Task用来保存下载任务的基本信息及状态信息,这些信息包括任务号、线程数、URL地址、文件名、文件保存路径、下载文件长度、任务状态、支持断点标志、已下载长度、完成标志。并在Task里面设计一个集合封装SubThread,封装每个下载子线程的下载信息详细请看图 。SubThread包括相对资源头的偏移量(startPosition)、要下载的长度(downFileLengt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2830.多线程下载工具的设计与实现 论文 2830. 多线程 下载工具 设计 实现

链接地址:https://www.desk33.com/p-1266331.html