基于Java的下载工具的设计与实现毕业作品.docx

上传人:b****8 文档编号:9812536 上传时间:2023-02-06 格式:DOCX 页数:37 大小:189.25KB
下载 相关 举报
基于Java的下载工具的设计与实现毕业作品.docx_第1页
第1页 / 共37页
基于Java的下载工具的设计与实现毕业作品.docx_第2页
第2页 / 共37页
基于Java的下载工具的设计与实现毕业作品.docx_第3页
第3页 / 共37页
基于Java的下载工具的设计与实现毕业作品.docx_第4页
第4页 / 共37页
基于Java的下载工具的设计与实现毕业作品.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

基于Java的下载工具的设计与实现毕业作品.docx

《基于Java的下载工具的设计与实现毕业作品.docx》由会员分享,可在线阅读,更多相关《基于Java的下载工具的设计与实现毕业作品.docx(37页珍藏版)》请在冰豆网上搜索。

基于Java的下载工具的设计与实现毕业作品.docx

基于Java的下载工具的设计与实现毕业作品

 

毕-设

业-计

(二零届)

基于Java的下载工具的设计与实现

所在学院

专业班级计算机科学与技术

学生姓名学号

指导教师职称

完成日期年月

摘要:

本设计采用Java设计一个具有断点续传和多线程下载功能的下载工具。

整体使用Java语言编写,实现其基本功能,并在MyEclipse平台上运行。

能对指定的资源进行下载,并解决资源下载中断时,不能在原有的基础上继续下载,以及下载速度偏低等问题。

本设计实现了基本GUI操作界面,操作简单。

但是下载文件路径需要指定是个问题,需要改进。

当然还有许多问题也待完善。

关键字:

Java;多线程;断点续传;Swing

TheDesignandImplementationofDownloadingtoolbasedonJava

Abstract:

ThisdesignuseJavatowritewhichhastheMultithreadDownloadandResumeBrokenTransferfunctions.UsetheJavalanguagetoachieveitsbasicfunctionsontheMyEclipseplatform.Itcandownloadtheappointedfiles,alsogivethesolutiontodownloadinterruptionanddownloadspeedduetofastproblems.ThisdesignachievedaneasyGUIinterface,simpleoperationisrequired.Butthedownloadpathmustbespecifiedisaproblem,shouldbeimproved.Alsomanyotherproblemsmayneedtobeimproved.

Keywords:

Java;Multithreading;Swing;Resumebrokentransfer

1.引言

1.1系统背景

随着互联网应用范围不断发展,网络包含的信息资源日益增多,互联网用户可以通过网络下载所需的数据资源保存在本地磁盘当中,因此相应的基于网络的下载工具应运而生。

对于一个网络下载工具,有两个问题一直阻碍着下载技术的发展:

速度和下载中断问题。

几年来,下载技术也在不停地发展。

最原始的下载功能仅仅是个“下载”过程,即从WEB服务器上连续地读取文件。

其最大的问题是,由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。

随后,“断点续传”的概念就出来了,顾名思义,就是如果下载中断,在重新建立连接后,跳过已经下载的部分,而只下载还没有下载的部分。

在“网络蚂蚁”软件流行开后,许多下载软件也都纷纷效仿,是否具有“多线程下载”技术、甚至能支持多少个下载线程都成了人们评测下载软件的要素。

“多线程下载”的基础是WEB服务器支持远程的随机读取,也即支持“断点续传”。

这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。

至于多线程下载的原理是这样的:

通常服务器同时与多个用户连接,用户之间共享带宽。

如果N个用户的优先级都相同,那么每个用户连接到该服务器上的实际带宽就是服务器带宽的N分之一。

可以想象,如果用户数目较多,则每个用户只能占有可怜的一点带宽,下载将会是个漫长的过程。

但是伴随着基于网络的多线程下载技术的出现,如今的下载工具彻底摆脱了这两个问题的束缚并且向着更为人性化的方面发展下去。

1.2系统意义

本系统是开发一个简单的多线程下载工具,实现资源的多线程下载,同时实现断点续传的功能。

实现这么一个下载最大的意义是探索多线程下载的基本原理,综合运用大学四年所学的知识,提高自己的动手能力,及查阅资料继续学习的能力,也是四年学习成果的展示,并完成学校的毕业设计任务。

其次就是为用户提供一个操作简单、功能齐全的下载工具,使用户能更好的获取网络资源。

多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码乱序执行,由此带来的线程调度问题。

由于是多线程进行断点续传,还要考虑记录多个断点位置,且记录断点位置时也要考虑同步互斥等问题。

所有这些都使得这一步比较复杂。

但是可以明显提高网络文件的下载速度。

1.3网络构架

网络下载基本构架主要包括两种:

C/S与P2P架构。

传统的C/S网络发展出了HTTP/FTP下载,并在客户端发展出了多线程下载方式。

而P2P网络则发展出了BT、eMule这样的多源文件传输方式。

传统的HTTP/FTP下载方式都是属于C/S架构,即客户端/服务器架构。

这种模式的基本方法是将共享文件上传服务器上,而需要这些文件的用户再向服务器索取和下载共享文件,也就意味着来自各个客户端的大量的上传下载数据都必须经过服务器这个中转站。

BT协议则是属于P2P架构,即PeertoPeer。

虽然对于P2P并没有一个统一的定义或标准,但P2P都有一个共同点就是充分利用各结点的资源,形成一个自组织网络,在网络中每个结点都是对等的,既享受别人的服务也为别人提供服务,传输文件数据时不再需要经过服务器。

2.系统分析

2.1设计概述

对于一个多线程下载工具的设计,首先就是要设定好实现的目标,确定开发的环境。

只有明确了目标才能知道自己要做什么,思路更清楚。

而一个好的开发环境对提高开发的效率起着很重要的作用。

2.1.1设计目标

实现一个实用的多任务,多线程下载工具。

具备以下功能:

(1)实现一个简洁的易操作的GUI界面。

(2)实现新建下载任务的功能。

(3)下载过程实现多任务,多线程的功能。

(4)实现任务暂停,及恢复下载的功能。

(5)实现停止任务功能。

2.1.2开发环境

MyEclipse,WindowsXP

2.2.相关主要技术简介

简略的介绍下系统开发过程中用到的相关技术。

如Java语言、多线程技术、HTTP1.0协议、断点续传技术等。

2.2.1Java语言简介

Java是一种简单、面向对象、分布式、解释型、健壮安全、结构中立、可移植、性能优异、多线程的语言,自1995年SUN推出JAVA语言后,全世界的目光都被这个神奇的语言所吸引。

由于Java所具有的以上那些特性,并且在大学里也学习了两个学期,对这门语言比较熟悉。

所以选用JAVA作为本次毕业设计的开发语言。

2.2.2多线程技术简介

线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。

也可以把它理解为代码运行的上下文。

所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。

通常由操作系统负责多个线程的调度和执行。

利用线程,用户可按下一个按钮,然后程序会立即做出响应,而不是让用户等待程序完成当前任务以后再做出响应。

线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。

线程越多,下载速度越快。

当前的下载软件都支持多线程技术。

在本次设计中,多线程技术用在新建任务和下载过程上,在系统中可以开起多个下载线程下载同一网络上的资源而互不干扰。

互不干扰也是相对的,首先下载的资源不能重复,其次如何合理的分解整个资源,使得有相应的线程对其进行下载,下载结束后如何将资源重新整合等。

线程的运行在操作系统的调度下,各自得到一定的时间片,当某一线程获取到时间片时,它就进入运行状态。

各个线程按照一定的协议分别获取时间片。

当对一个复杂对象进行某种操作时,从操作开始到操作结束,被操作的对象往往会经历若干非法的中间状态。

调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态。

如果其他线程企图访问一个处于不可用状态的对象,该对象将不能正确响应从而产生无法预料的结果,如何避免这种情况发生是线程安全性的核心问题。

线程同步提供了保证不同线程按适当顺序使用共享资源的工具。

线程可直接访问共享数据,既有相互之间高效通信的优点,也有线程间任意相互干扰的弊端。

安全的多线程数据使用方案要求不同线程处理不同的数据,即多个线程不能共享临界区。

例如:

有10张车票供2个顾客预定,而又要求2个顾客尽可能多地预定10张车票,这10张车票作为共享资源,可能导致1张票预定给2个顾客的情况,针对这种情况,设计时应采用正确的同步机制。

若2个线程同步执行时需要相互打开,就会出现1个线程依赖于另1个要打开的线程而形成死锁。

它不是资源不够引起的,而是由线程的调度引起的。

对于死锁可用下述方法解决:

(1)尝试在尽可能短的时间内执行锁定的代码,占用时间越长,另一线程出现和需要对象的可能性越大。

(2)当我们从另一个被同步的方法中激活被同步的方法时要小心,最好是清楚地定义每个线程的任务,并考虑使用什么数据和什么时候使用。

总之,在多线程程序设计中,要充分考虑各种可能出现的情况,并用适当的方法给予解决,使线程在运行过程中按所预期定义的目标进行。

2.2.3HTTP1.0协议

HTTP是Web协议集中的重要协议,它是从客户机/服务器模型发展起来的。

客户机/服务器是运行一对相互通信的程序,客户与服务器连接时,首先,向服务器提出请求,服务器根据客户的请求,完成处理并给出响应。

浏览器就是与Web服务器产生连接的客户端程序,它的端口为TCP的80端口。

举一个大家都很常见的例子,浏览器与Web服务器之间所遵循的协议就是HTTP。

Web的应用层协议HTTP是Web的核心。

HTTP在Web的客户程序和服务器程序中得以实现。

运行在不同端系统上的客户程序和服务器程序通过交换HTTP消息交流。

HTTP定义这些消息的结构以及客户和服务器如何交换这些消息。

HTTP定义Web客户(即浏览器)如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户。

HTTP1.0(HypertextTransferProtocolVertion1.0)超文本传输协议1.0。

超文本传输协议(HTTP)是一种应用层协议与速度分布必要的协作超媒体信息系统。

这是一种一般、无状态的、面向对象的协议,可用于多种任务,例如域名服务器和分布式对象管理系统,通过它的请求方法(命令)的延伸。

一种特征HTTP是代表性的数据输入,使系统的独立于数据生成转移HTTP。

它是用来在Internet上传送超文本的传送协议。

它是运行在TCP/IP协议族之上的HTTP应用协议,它可以使浏览器更加高效,使网络传输减少。

任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。

您的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。

驻留程序接收到请求,在进行必要的操作后回送所要求的文件。

[1]

2.2.4断点续传的技术

在当今的网络时代,下载软件是使用最为频繁的软件之一。

几年来,下载技术也在不停地发展。

最原始的下载功能仅仅是个“下载过程”,即从WEB服务器上连续地读取文件。

其最大的问题是,由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。

随后,“断点续传”的概念就出来了,顾名思义,就是如果下载中断,在重新建立连接后,跳过已经下载的部分,而只下载还没有下载的部分。

多线程下载的基础是WEB服务器支持远程的随机读取,也即支持“断点续传”。

这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。

这项技术在关机或者网络出错的情况下不仅能完整的保护你已下载的部分,还能使你重新连接下载时继续下载未完成的部分。

2.3可行性分析

可行性分析是通过对项目的主要内容和配套条件进行调查研究和分析比较,并对项目建成以后可能取得的经济效益及社会环境影响进行预测,从而提出该项目是否值得投资和如何进行建设的咨询意见,为项目决策提供依据的一种综合性的系统分析方法。

可行性研究应具有预见性、公正性、可靠性、科学性的特点。

可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。

它的目的不是解决问题,而是确定问题是否值得去解决。

2.3.1技术可行性分析

多线程跨平台的下载工具的实现不是很困难,首先是多线程,JAVA语言很好的支持了多线程,其API中的ExecutorService提供了多线程的处理。

其次是跨平台,JAVA语言本身就是平台无关性的语言,编译成class的字节码文件,不同的平台提供不同的JVM,确保了JAVA的跨平台性。

第三是对协议的支持,API中的J.*中提供了对HTTP支持的方法。

最后也是最复杂的就是Java的图形化界面,JAVA本身不擅长图形化界面,但AWT及Swing也提供了足够的支持。

[2]

首先要了解要做个什么样的下载工具,对设计的技术实现全面的了解。

可以采用java的多线程机制,通过设置HTTP1.0的请求头信息,可以实现连接远程资源,通过这个连接可以与远程资源进行交互,这样就可以实现多线程及断点续传的功能。

所以在技术上实现多线程下载是没有问题。

2.3.2经济可行性分析

赢利不是制作这个下载工具的目的,而只是为了探索多线程下载的基本原理,综合运用所学的知识,提高自己的动手能力,及查阅资料继续学习的能力,并完成学校安排的毕业设计,顺利完成学业。

所以它也就不存在经济的问题。

而从它的意义上来说,绝对值得制作这个下载工具。

2.3.3操作可行性分析

下载工具应面向广大的互联网用户,所以在设计中采用简洁的GUI界面。

也因为简洁的界面设计使得系统在操作方式上很容易让用户接受。

即使对一个没有计算机操作经验的人来

说也能顺利完成下载,因此在操作上也是行得通的。

3.概要设计

3.1系统结构图

本系统采用三层结构进行系统分层,这三层分别为GUI表现层,控制层,底层下载操作,文件及网络操作,系统的结构图如图3-1

图3-1系统结构图

3.2功能流程图

新建下载及恢复下载功能流程图见图3-2,新建任务与恢复任务仅是在任务的构建方式上不一样,在网络操作及下载操作上都没有什么区别,这样的实现主要得益于对代码重用性的设计。

图3-2新建/恢复任务流程图

暂停与停止的功能实现流程图见图3-3,从这个图中可以发现和暂停任务,停止任务一样具备同样的代码利用,停止线程过程是同一个,他们两个在功能上唯一的不同仅是暂停任务时需要将暂停的断点记录下来,而停止任务却是将断点记录给删除,并删除已下载的部分文件信息。

图3-3暂停/停止任务流程图

4.详细设计

4.1获取网络资源

获取网络资源是下载过程中的第一个步骤,也是很关键的一步。

由于网络的问题是多变的,有可能指定的下载资源已经不存在,或者网络连接有问题,等一系列的问题,因此在连接资源过程中得对相应的连接进行测试,如输入的URL是否正确或存在、网络连接是否正常等。

4.1.1功能说明

要下载一个远程的资源就需要先定位到指定的资源,并建立连接。

在本模块中实现的基本功能说是与远程的资源进行连接,并测试其连接状态。

4.1.2设计说明

在做这个模块之前得先来了解下HTTP协议。

HTTP协议就是超文本传输协议,采用了请求/响应模型。

客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。

服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息,实体元信息以及可能的实体内容。

1、连接资源

通过JDK的net包中包含的URL及HttpURLConnection两个类对网上资源进行操作。

URL指定网络资源的位置,而HttpURLConnection中则封装了操作指定网络资源的方法。

在本系统中设计了类SplitFileTask,它的主要功能就是通过提供指定的URL获取HttpURLConnection对象,为控制层代码利用HttpURLConnection对象操作网络文件提供支持。

控制层代码只要调用SplitFileTask.connection()即可。

2、测试连接

在网络连接过程中可能出现各种各样的问题,而需要的只是连接成功的正确网络资源,所以有必要对通过SplitFileTask获取的与服务器的连接进行测试。

如果测试成功,即能正确获取到指定的资源,之后才对指定的资源进行下载操作,否则抛弃信息,并对用户进行相应的提示。

通过对HTTP1.0协议的了解,知道只要发送一个指定的请求头信息,服务器就会返回一个携带着请求后服务器处理完成的信息,这个信息就包括请求是否成功等。

要做的就是构造这样一个带有指定的请求的头信息发送到服务器端,然后查看它返回的响应码,因为完成可能从响应码中去了解一个请求是否成功。

要设计一个什么样的请求头才能符合的要求的测试效果呢?

通过设计请求头信息中的RANGE字段可以指定请求URL指向目标资源的偏移量,而不是从头开始读。

这个也是断点及多线程下载资源的一个重要属性,将在后面作更详细说明。

如果设置完这个头信息并发送到服务器端,如果源请求的资源存在并且服务器支持断点续传,这时它返回的响应码信息就是206,如果存在但不支持断点则返回200,而其它的情况就都是连接失败的情况了。

[3]

这样测试连接的理论基础就完成了,那用net包的类怎么设置请求头信息,如何获取响应码信息呢?

其实这些都是很容易的,代码如下:

connection.setRequestProperty("Range","bytes="+downloaded+"-");设置请求头的

RANGE字段

connection.getResponseCode();获取响应码信息。

到此,有关网络连接,及测试连接的设计就告一段落了。

4.1.3核心代码

(1)获取连接

如果获取网络资源出错时则返回一个空值

HttpURLConnectionconnection=(HttpURLConnection)url.openConniection();

connection.setRequestProperty("Range","bytes="+downloaded+"-");

//连接服务器

connection.connect();

//检查返回值

if(connection.getResponseCode()/100!

=2){

error();

}

//检查文件是不是有错

intcontentLength=connection.getContentLength();

if(contentLength<1){

error();

}

(2)测试连接

privateURLverifyUrl(Stringurl){

if(!

url.toLowerCase().startsWith("http:

//"))

returnnull;

URLverifiedUrl=null;

try{

verifiedUrl=newURL(url);

}catch(Exceptione){

returnnull;

}

if(verifiedUrl.getFile().length()<2)

returnnull;

returnverifiedUrl;

}[4]

4.2线程任务分配

通过对http1.0协议的了解后,知道通过对它的请求头进行设置,就可以获取到远程文件的指定部分,而不用从头开始下载。

利用这个特性就可以设计一个多线程下载的原型出来了。

要进行多线程下载,主要实现的是为每个线程分配一个指定范围的数据下载,那怎么为每一个下载线程进行任务分配呢?

这就是这一节要讨论的内容。

4.2.1功能说明

在多线程下载过程中,需要让每一个线程都指向指定资源的一部分,且不重复,如何为每一个下载线程分配它指向的特定部分就是这个模块所要完成的任务。

4.2.2设计说明

确定了采用分块的形式进行任务的分配,那要考虑的问题就只有如何分块了,如何分配才能准备无误,并且保证各个下载线程所要下载的任务更合理。

本系统采用的是平均分配的方法。

就是为每一个下载线程分配尽可能相同的字节数,在这个过程中得指定下载任务相对于资源起点的偏移量及下载的长度。

分配过程如下:

获取资源长度,这个可以从请求的响应信息中获取“filelength”字段获得,即通过tempFile对象写入文件信息获取[5]。

根据线程数计算各个任务块的偏移量及下载长度,这个过程简单,但得注意字节重复的问题。

4.2.3设计流程

图4-1任务分配流程图

4.3创建下载任务

有了之前的一系列操作,就可以着手创建下载任务了,下载任务有很多不同的状态和状态信息,这些信息包括URL地址、文件保存路径、下载文件长度、任务状态、支持断点标志、下载进度、下载状态。

并在程序里面设计一个类FileInfo描述文件信息,详细请看图。

FileInfo包括重写了的hashCode()方法、以取得下载文件的信息进行比较,equals()方法来验证是否为续传文件,通过传入对象的下载文件URL和文件名区分是否为同一文件。

[6]

下图是FileInfo图4-2的类图:

图4-2文件信息类图

创建下载任务流程图:

图4-3创建下载任务流程

4.4任务下载

任务下载模块是本系统的核心,在任务运行过程中主要的时间也是在花这一块,它的设计质量,会对软件的效率,占用资源的大小,软件的可靠性及可用性有很大的影响。

就拿软件的可用性来说,因为在系统的下载过程中,读取出来的长度是随机的,而且还要关心着本线程的下载范围,因此如果未对其中的各个细节进行考虑,很容易就会出现读脏数据的情况,导致最终下载过来的数据无法使用。

4.4.1功能说明

创建完任务就可以开始进行下载操作了。

在这个模块中,要使用线程技术实现一个可重用的,较高效的实现程序。

主要功能就是能读取出指定资源相应偏移量的数据,并调用文件操作模块将下载的数据保存到相应文件中去。

4.4.2设计说明

SpliteFileTask类图:

图4-4-2分任务类图

核心代码:

//执行分任务

publicvoidrun()

{

if(isOver)//如果分任务下载已完成,则退出

{

isStop=true;

return;

}

InputStreaminput=connection();

byte[]b=newbyte[10240];

intlen;

try

{

dataFile=newRandomAccessFile(saveFileName,"rw");

while((len=input.read(b,0,b.length))>0&&!

isOver&&!

isStop)

{

dataFile.seek(startPos);//定位输入点

dataFile.write(b,0,len);

startPos+=len;

if(startPos>=endPos)

{

isOver=true;

isStop=true;

}

}

}catch(IOExceptione)

{

e.printStackT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1