




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计论文JAVA多线程与线程安全实践基于HTTP协议的断点续传论文作者姓名申请学位专业申请学位类别指导教师姓名(职称)论文提交日期JAVA多线程与线程安全实践基于HTTP协议的断点续传摘要现实世界中的很多过程都具有多条线索同时动作的特性。JAVA语言的一大特性就是内置对多线程的支持。多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。一些同时运行的线程需要共享数据,因此每个线程就必须要考虑其它与它一起共享数据的线程的状态与行为,这就是线程安全的问题。为了对JAVA多线程与线程安全机制进行研究与实践,特此设计一个基于HTTP协议的支持多线程断点续传的下载程序。此下载程序由下载任务模块、设置模块以及系统帮助模块组成。通过APACHEJAKARTACOMMONS下的子项目HTTPCLIENT包对HTTP协议进行支持,从而下载服务器端的资源。程序提供多线程断点续传功能,在完成下载过程中使用多线程技术可以较大幅度地提高下载的速度。关键词多线程;线程安全;断点续传THEPRACTICEOFJAVAMULTITHREADINGANDTHREADSECURITYDOWNLOADTOOLWITHBROKEN/RESUMEFUNCTIONBASEDONHTTPABSTRACTINREALWORLD,MANYPROCESSESHAVETHECHARACTERISTICTHATMULTISTRIPCLUEACTATTHESAMETIMETHEJAVALANGUAGEHASAMAJORCHARACTERISTICOFEMBEDDEDMULTITHREADSUPPORTMULTITHREADINGISTHESTATUSTHATEXISTSEVERALIMPLEMENTATIONBODYATTHESAMETIME,ACCORDINGTOSEVERALDIFFERENTCLUESTOTHEIMPLEMENTATIONOFTHEJOINTWORK,ITMEANSTHATPROGRAMMERSCANEASILYPRODUCEMORETHREADSDEVELOPMENTFUNCTIONS,ITCANALSODEALWITHANUMBEROFTASKSPOWERFULAPPLICATIONRUNNINGSOMEOFTHETHREADSNEEDTOSHAREDATA,SOEACHTHREADMUSTCONSIDEROTHERWITHITTOSHARETHEDATAWITHTHESTATEOFTHETHREAD,THISISTHETHREADSAFETYTOJAVAMULTITHREADINGANDSECURITYMECHANISMSTOCONDUCTRESEARCHANDPRACTICE,DESIGNHEREBYHTTPAGREEMENTONTHESUPPORTMULTITHREADINGDOWNLOADPROCEDURESTHISDOWNLOADPROCEDURESCOMPRISESOFDOWNLOADINGTASKMODULE,SETTINGMODULEANDHELPINGSYSTEMMODULEWITHHTTPSUPPORTOFHTTPCLIENT,ASUBPROJECTOFAPACHEJAKARTACOMMONS,ITCANDOWNLOADRESOURCESCOMINGFROMWEBSERVERTHEPROCEDUREPROVIDESTHEMULTITHREADEDBROKEN/RESUMEFUNCTIONALITY,INTHEPROCESSOFCOMPLETESDOWNLOADINGTOUSETHEMULTITHREADTECHNOLOGYCANGREATLYBOOSTDOWNLOADSPEEDKEYWORDSMULTITHREADINGTHREADSECURITYBROKEN/RESUME目录论文总页数25页1引言111课题的研究背景与意义1111课题的研究背景1112课题的研究意义11可行性分析2121技术可行性2122操作可行性22相关基础知识以及开发平台221JAVA中的多线程与线程安全3211JAVA中的多线程3212JAVA中的线程安全322HTTP协议简介423断点续传原理43需求分析531用户需求分析532业务流分析64系统设计741系统设计要点742系统总体功能结构75系统实现851用户界面实现852下载任务实现11521下载任务类图11522下载任务顺序图12523下载任务具体实现1353监控下载信息设计18531监控下载信息类图18532监控下载信息顺序图19533监控下载信息实现19结论22参考文献23致谢24声明25第1页共25页1引言11课题的研究背景与意义111课题的研究背景以往我们开发的程序大多是单线程的,即一个程序只有一条从头至尾的执行线索。然而现实世界中的很多过程都具有多条线索同时动作的特性。例如,我们可以一边看电视,一边活动胳膊,如果不容许这样做,我们会感觉很难受。再如一个网络服务器可能需要同时处理多个客户机的请求等。JAVA语言的一大特性就是内置对多线程的支持。多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。虽然执行线程给人一种几个事件同时发生的感觉,但这只是一种错觉,因为我们的计算机在任何给定的时刻只能执行那些线程中的一个。为了建立这些线程正在同步执行的感觉。JAVA快速地把控制从一个线程切换到另一个线程。多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。自从“多线程下载”技术发明以来,这项技术得到前所未有的关注已是不争的事实。在“网络蚂蚁”软件流行开后,许多下载软件也都纷纷效仿,是否具有“多线程下载”技术、甚至能支持多少个下载线程都成了人们评测下载软件的要素。“多线程下载”的基础是WEB服务器支持远程的随机读取,也即支持“断点续传”。这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。112课题的研究意义多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行,由此带来的线程调度问题。由于是多线程进行断点续传,还要考虑记录多个断点位置,且记录断点位置时也要考虑同步互斥等问题。所有这些都使得这一步比较复杂。但是可以明显提高网络文件的下载速度。现在,不要说编写专门的下载软件,在自己编写的软件中,加入下载功能有时也非常必要。如让自己的软件支持自动在线升级,或者在软件中自动下载新的数据进行数据更新,这都是很有用、而且很实用的功能。第2页共25页1可行性分析可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。系统的可行性分析主要包括技术上的可行性和操作上的可行性。本系统的可行性分析如下121技术可行性下载程序功能模块的实现主要利用了面向对象的JAVA高级编程语言。使用JAVA作为开发工具主要是因为JAVA是目前比较流行而且非常成功的编程语言。多线程编程技术是JAVA语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。特别是在网络编程中,有很多功能是可以并发执行的。JAVA中实现多线程的类有两种方法1扩展JAVALANGTHREAD类,用它覆盖THREAD类的RUN方法。2生成实现JAVALANGRUNNABLE接口的类并将其它的实例与JAVALANGTHREAD实例相关联。THREAD类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在JAVA中只要简单地从THREAD类派生一个子类就可以了。扩展THREAD类,如PRINTTHREADJAVA。由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。JAVA语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。由于我们可以通过PRIVATE关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是SYNCHRONIZED关键字,它包括两种用法SYNCHRONIZED方法和SYNCHRONIZED块。本系统使用ECLIPSE的SWT图形界面技术进行开发,以HTTPCLIENT包进行支持,上述两个软件或是开发包均为免费下载,十分方便。122操作可行性下载程序的具备友好的用户界面,而且操作简单易于被用户接收,使用此下载程序十分方便,因为软件的操作思路比较清晰,而且用户实际操作的内容较少,所以用户只需要熟练操作计算机即可。因此从使用操作方面看,此系统得开发是可行的。第3页共25页2相关基础知识以及开发平台21JAVA中的多线程与线程安全211JAVA中的多线程JAVA不仅是一门语言,它已成为一门技术,例如JAVA芯片技术、JAVA编译技术、基于JAVA的信息家电联网技术(JINI)等,并以它的平台独立性、健壮性、JAVA虚拟机技术等特点受到广大编程者青睐。JAVA能把所有东西从桌面计算机平稳地转换成基于网络的计算,它是WEB浏览器中必须具备的技术,是一个完全面向对象的语言,是有利于处理网络协议的程序综合库。线程是从一个完整应用程序分出的单独的处理步骤,是程序内部的一个顺序控制流。一个小程序中可含1个或多个线程并可同时运行,由于单线程一旦运行就独占线程的所有时间资源,而多线程的出发点就是提高系统的并发性,因此,引人注意的不是一个单独的线程,而是在一个程序中实现多个线程,它意味着一个程序的多行语句同时执行,即用抢占资源的方式对多个线程实现轮流执行。例如HOTJAVA浏览器就是一个多线程的应用实例。在JAVA语言中,多线程编程已成为编程的一个有效工具,可编制出界面友好、效率高的应用程序。JAVA内在支持多线程,其线程由3部分组成(1)虚拟CPU,封装在JAVALANGTHREAD类中。(2)CPU所执行的代码,传送给THREAD类。(3)CPU所处理的数据,传送给THREAD类。JAVA通过多线程有效地实现了多任务的并发执行,所以,在JAVA多线程编程中,不仅考虑多线程自身的问题分析,还应注意各线程在调度中出现的各种情况。212JAVA中的线程安全当对一个复杂对象进行某种操作时,从操作开始到操作结束,被操作的对象往往会经历若干非法的中间状态。调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态。如果其他线程企图访问一个处于不可用状态的对象,该对象将不能正确响应从而产生无法预料的结果,如何避免这种情况发生是线程安全性的核心问题。线程同步提供了保证不同线程按适当顺序使用共享资源的工具。线程可直接访问共享数据,既有相互之间高效通信的优点,也有线程间任意相互干扰的弊端。安全的多线程数据使用方案要求不同线程处理不同的数据,即多个线程不能共享临界区。例如有10张车票供2个顾客预定,而又要求2个顾客尽可能多地预定10张车票,这10张车票作为共享资源,可能导致1张票预定给2第4页共25页个顾客的情况,针对这种情况,设计时应采用正确的同步机制。若2个线程同步执行时需要相互打开,就会出现1个线程依赖于另1个要打开的线程而形成死锁。它不是资源不够引起的,而是由线程的调度引起的。对于死锁可用下述方法解决(1)尝试在尽可能短的时间内执行锁定的代码,占用时间越长,另一线程出现和需要对象的可能性越大。(2)当我们从另一个被同步的方法中激活被同步的方法时要小心,最好是清楚地定义每个线程的任务,并考虑使用什么数据和什么时候使用。总之,在多线程程序设计中,要充分考虑各种可能出现的情况,并用适当的方法给予解决,使线程在运行过程中按所预期定义的目标进行。22HTTP协议简介HTTP是WEB协议集中的重要协议,它是从客户机/服务器模型发展起来的。客户机/服务器是运行一对相互通信的程序,客户与服务器连接时,首先,向服务器提出请求,服务器根据客户的请求,完成处理并给出响应。浏览器就是与WEB服务器产生连接的客户端程序,它的端口为TCP的80端口。举一个大家都很常见的例子,浏览器与WEB服务器之间所遵循的协议就是HTTP。WEB的应用层协议HTTP是WEB的核心。HTTP在WEB的客户程序和服务器程序中得以实现。运行在不同端系统上的客户程序和服务器程序通过交换HTTP消息彼此交流。HTTP定义这些消息的结构以及客户和服务器如何交换这些消息。HTTP定义WEB客户即浏览器如何从WEB服务器请求WEB页面,以及服务器如何把WEB页面传送给客户。23断点续传原理其实断点续传的原理很简单,就是在HTTP的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文件时,所发出的请求如下假设服务器域名为WWWSJTUEDUCN,文件名为DOWNZIP。GET/DOWNZIPHTTP/11ACCEPTIMAGE/GIF,IMAGE/XXBITMAP,IMAGE/JPEG,IMAGE/PJPEG,APPLICATION/VNDMSEXCEL,APPLICATION/MSWORD,APPLICATION/VNDMSPOWERPOINT,/ACCEPTLANGUAGEZHCNACCEPTENCODINGGZIP,DEFLATEUSERAGENTMOZILLA/40COMPATIBLEMSIE501WINDOWSNT50CONNECTIONKEEPALIVE服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回第5页共25页给浏览器,返回信息如下200CONTENTLENGTH106786028ACCEPTRANGESBYTESDATEMON,30APR2001125611GMTETAGW/“02CA57E173C1195B“CONTENTTYPEAPPLICATION/OCTETSTREAMSERVERMICROSOFTIIS/50LASTMODIFIEDMON,30APR2001125611GMT所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给WEB服务器的时候要多加一条信息从哪里开始。下面是用自己编的一个“浏览器“来传递请求信息给WEB服务器,要求从2000070字节开始。GET/DOWNZIPHTTP/10USERAGENTNETFOXRANGEBYTES2000070ACCEPTTEXT/HTML,IMAGE/GIF,IMAGE/JPEG,Q2,/Q2仔细看一下就会发现多了一行RANGEBYTES2000070,这一行的意思就是告诉服务器DOWNZIP这个文件从2000070字节开始传,前面的字节不用传了。服务器收到这个请求以后,返回的信息如下206CONTENTLENGTH106786028CONTENTRANGEBYTES2000070106786027/106786028DATEMON,30APR2001125520GMTETAGW/“02CA57E173C1195B“CONTENTTYPEAPPLICATION/OCTETSTREAMSERVERMICROSOFTIIS/50LASTMODIFIEDMON,30APR2001125520GMT和前面服务器返回的信息比较一下,就会发现增加了一行CONTENTRANGEBYTES2000070106786027/106786028返回的代码也改为206了,而不再是200了。知道了以上原理,就可以进行断点续传的编程了。3需求分析第6页共25页31用户需求分析随着INTERNET的发展,进入信息时代后快速获得网络共享资源成为很简单的事情,人们对互联网也有了很大的依赖性。人们甚至希望只轻松点击鼠标就可以得到自己想要的东西。比如,针对一些专业的论坛提供了很多相关资料以方便人们阅读或了解;还有更多的人希望能过下载到他们喜欢听得音乐、好看的图片、喜欢的电影等等。也可以看出人们在上网时再也不单是打开浏览器来浏览网页,越来越多的人们开始使用下载软件来获取资源。同时人们也更希望使用更新更快的下载软件。由于用户下载需求的增大,也要求下载软件能够迅速完成对资源的下载。多线程程序设计可以很好的解决程序并发的问题。最恰当的比喻就是用户会感到CPU似乎同时出现在两个地方,在下载软件中应用多线程技术可以理解为将一个下载任务分成若干份来完成,其中的并发控制将使下载的效率大大提高。由于下载资源是一个过程,当中用到的时间可能会很长。那么在很长的这段时间中很有可能会出现很多的意外情况使下载中断或是停止,比如电源意外被切断、网络中断、或是操作系统故障导致系统重新启动。这些原因都会导致下载的中断,但是当用户重新下载资源时发现原来下载的数据已经消失你还是要回头再来。断点续传就是用来解决这样的问题的,它的任务是在下载任务停止时,记录当前下载的信息并且利用网络协议中的一些重定向机制继续完成下载任务而不必从头再来。随着使用下载工具的时间的增长,用户下载的资源越来越多,因此在下载列表中的项目也越来越多,越来越混乱,因此为了便于管理和用户使用方便,用户迫切希望下载工具具有下载文件分类的功能。在下载任务的管理这一块,用户不仅希望下载工具具有下载一个一个资源的功能,而且具有批量下载有些相似的或有关联的资源的功能。还有些特殊情况下,用户在下载任务开始后由于种种原因希望放弃资源的下载,这就要求下载工具具有删除任务的功能了。为了对下载任务进行掌控,用户往往具有设置下载任务的线程数,文件下载网址,文件下载存储目录和在下载过程中对下载任务的状态进行监控等功能需求。鉴于某些软件使用初学者甚至某些电脑初学者的实际情况,他们往往需要系统有一个格外的帮助文档,使他们能够更快、更好地学会使用断点续传下载软件,提高效率。32业务流分析第7页共25页多线程断点续传的业务流程首先由用户进入软件系统,在新建任务中填写必要的下载资源的相关属性,比如相关资源下载地址URL、存储路径、以及下载线程数等。由软件发送HTTP消息请求,然后服务器根据请求返回响应消息。确认无误就可以启动线程开始下载资源。将缓存中存储的数据最终存储到目的存储路径。此外,系统为用户提供了一些对任务的基本操作,比如,停止、继续、删除等。4系统设计41系统设计要点随着用户下载需求的增大,用户下载的资源越来越大,下载的过程也就越来越久,这就要求下载软件能够迅速完成对资源的下载,为了提高下载效率的问题,所以本系统采用多线程的方式来实现下载速率的提高。多线程的优点之一是所有线程都可以访问相同的全局变量和共享资源,它提供了程序设计的简捷性与便利性,提高了对信息处理的并发度,但也带来了数据的讹误或线程得不到某一资源而被饿死(即死锁)的可能性。为了避免这些现象的产生,线程在使用共享资源或对象前必须获得一个约束访问同步对象的权力,也就是通过同步的机制来控制这种权力的使用,这就是线程的安全问题。HTTP协议是互联网中一个非常重要而且应用十分频繁的协议,所以本系统的设计是基于HTTP协议的。长期以来,断点续传始终是困扰网虫们的一大难题,眼看着已经下载到99的软件,却由于突然掉线而前功尽弃的那种沮丧恐怕人人都经历过,于是本系统采用断点续传的方式来设计。本系统设计的基本目标就是利用编写一个时下流行的基于HTTP协议的多线程断点续传的程序来研究JAVA多线程与线程安全的机制。42系统总体功能结构通过对多线程断点续传下载软件的需求分析并结合实际情况的分析,本系统由下载分类管理、任务管理、设置管理、系统帮助四个主模块构成。本系统的功能结构图如图示其中下载文件的分类模块主要是通过在新建下载任务时候设置下载文件的存储目录甚至新建一个存储目录的方式来实现。下载任务的管理模块主要有三个子模块组成新建下载任务模块、批量完成下载任务模块、删除任务模块。在设置任务的管理模块主要有两个子模块组成在新建(批量)下载任务的时候进行任务的连接方面的配置模块以及在现在过程中对下载任务的状态进行监视的模块。第8页共25页在系统帮助模块里主要是包含一些对整个系统的说明,便于用户理解。另外系统还支持将资源下载URL地址自动添加到剪贴板中,这样用户只需要点击地址即可开始下载,而不是需要手动粘贴、复制URL地址到指定位置。图1下载程序功能结构图5系统实现51用户界面实现本下载程序提供两种操作模式一种是使用命令行参数对下载软件进行操作;另一种方式是通过图形界面对下载软件进行操作。在此对图形界面的实现进行详细介绍。下载程序的主界面设计使用ECLIPSE开发主要分成四部分第一部分是菜单栏,提供功能选项;第二部分是标准按钮栏;第三部分是信息列表框,其中包括下载软件的名称、大小、下载进度、下载速度、剩余时间等下载任务的属性;最后一部分是一个文本框用来监视下载文件时返回的信息,包括下载文件的URL地址、下载文件的长度、以及完成任务的所有线程数和每个线程完成的块大小。在下载过程中上边提到的相关信息都会显示在列表框和文本框中,用户可以方便地监视到下载文件的状况。菜单栏的设计使用了ORGECLIPSEJFACEACTION包的ACTION类,JFACE中引用了ACTION的概念主要用完成用户动作的代码复用。在这里每一个ACTION都可以用下载工具功能模块下载文件分类下载任务设置任务系统帮助新建下载任务批量完成下载任务删除任务连接配置监视配置监视下载信息自动添加剪贴板功能第9页共25页来响应一个用户的动作,比如打印文件、打开文档或是显示对话框。程序的主界面菜单栏的设计就是对ACTION的复用。首先创建用户动作,包括新建下载任务动作(NEWTASKACTION)、新建批量下载任务动作(BATCHTASKACTION)、删除任务动作(DELETETASKACTION)、帮助动作(ABOUTACTION)和退出动作(EXITACTION),这些都是ACTION。在主界面GUI中代码设计如下。添加用户动作。添加新建下载任务动作PUBLICCLASSNEWTASKACTIONEXTENDSACTIONPUBLICNEWTASKACTIONSUPER“新建任务CTRLN“,IMAGEDESCRIPTORCREATEFROMFILENEWTASKACTIONCLASS,“ICONS/NEWGIF“SETTOOLTIPTEXT“新建任务“添加新建批量下载任务动作PUBLICCLASSBATCHTASKACTIONEXTENDSACTIONPUBLICBATCHTASKACTIONSUPER“新建批量任务CTRLB“,IMAGEDESCRIPTORCREATEFROMFILENEWTASKACTIONCLASS,“ICONS/ADDBOOKGIF“SETTOOLTIPTEXT“新建批量任务“添加删除任务动作PUBLICCLASSDELETETASKACTIONEXTENDSACTIONPUBLICDELETETASKACTIONSUPER“删除下载任务DELETE“,IMAGEDESCRIPTORCREATEFROMFILEDELETETASKACTIONCLASS,“ICONS/REMOVEBOOKGIF“SETTOOLTIPTEXT“删除下载任务“添加退出动作PUBLICCLASSEXITACTIONEXTENDSACTIONPUBLICEXITACTIONSUPER“退出ALTF4“SETTOOLTIPTEXT“退出“第10页共25页在界面菜单中创造用户动作的实例,并将这些实例添加到菜单栏的菜单项当中。PUBLICCLASSGUIDOWNLOADEREXTENDSAPPLICATIONWINDOWPUBLICSTATICGUIDOWNLOADERAPPNEWTASKACTIONNEWNEWTASKACTIONBATCHTASKACTIONNEWBATCHTASKACTIONEXITACTIONNEWEXITACTIONABOUTACTIONNEWABOUTACTIONDELETETASKACTIONNEWDELETETASKACTIONPROTECTEDMENUMANAGERCREATEMENUMANAGERMENUMANAGERMENUMANAGERNEWMENUMANAGERMENUMANAGERFILEMENUNEWMENUMANAGER“文件MENUMANAGERADDFILEMENUFILEMENUADDNEWTASKACTIONFILEMENUADDBATCHTASKACTIONFILEMENUADDDELETETASKACTIONFILEMENUADDNEWSEPARATORFILEMENUADDEXITACTION使用这样的方法就完成了上述用户动作,只要点击菜单栏按钮同样完成相应事件的动作,比如按下新建下载任务后可以弹出新建下载任务对话框。标准按钮栏和菜单栏的添加方法和菜单栏很相似,只需要添加按钮后同样添加用户动作即可。用户界面除了按钮部分还包括下载时显示下载任务诸多属性的表格(TABLE),和监视下载信息的列表框(LIST)。在TABLE与LIST的设计中主要采用分割条(SASHFORM)对TABLE和LIST进行分隔。使用SASHFORM的好处就是可以使用户界面显得更标准、更美观;而且SASHFORM的功能是可以拉伸,从而调整TABLE与LIST之间的比例最终达到用户满意的效果;操作非常方便。设计TABLE、LIST与SASHFORM的主要代码PRIVATETABLETASKSTABLEPRIVATELISTTASKLOGGERPUBLICTABLEGETTASKSTABLERETURNTASKSTABLEPUBLICLISTGETTASKLOGGERRETURNTASKLOGGER第11页共25页PROTECTEDCONTROLCREATECONTENTSCOMPOSITEPARENTSASHFORMPANENEWSASHFORMPARENT,SWTVERTICALTASKSTABLENEWTABLEPANE,SWTFULL_SELECTION|SWTBORDERFORINTI0,NCOLUMNTEXTSLENGTHINITABLECOLUMNCOLNEWTABLECOLUMNTASKSTABLE,SWTLEFTCOLSETTEXTCOLUMNTEXTSICOLSETWIDTHCOLUMNWIDTHSITASKSTABLESETHEADERVISIBLETRUETASKSTABLESETLINESVISIBLETRUE用户主界面如图2所示图2下载软件的主界面52下载任务实现521下载任务类图多线程下载程序是通过网络协议支持进行资源的下载,在这里对建立下载任务(TASK)添加抽象方法START、STOP、RESUME来建立任务。由支持HTTP协议下载(HTTPTASK)继承TASK的抽象方法并实现通过HTTP协议下载。这样做的好处就是软件会有很好的扩展性,通过对TASK的继承还可以产生支持不同协议的下载,比如FTP下载、BT下载、EDONKEY下载等等。下载任务类图如下第12页共25页图3下载任务类图522下载任务顺序图下载任务根据用户需求新建任务,在新建任务中填写必要的下载资源的相关属性,比如相关资源下载地址URL、存储路径、以及下载线程数等。由软件发送HTTP消息请求,然后服务器根据请求返回响应消息。确认无误就可以启动线程开始下载资源。将缓存中存储的数据最终存储到目的存储路径。下载任务顺序图如图4所示图4下载任务顺序图第13页共25页下载任务管理主要的是对下载任务进行的一系列操作,包括新建下载任务、批量下载任务、删除任务、清除文件的一些操作。新建下载任务是是根据用户下载需求来创建下载任务的功能,用户需要提供下载资源的URL地址、选择存储文件的路径、用户希望下载时的线程数、以及存储时的文件名称。下载软件会根据新建任务栏的信息完成下载任务并且进行监控。其中选择存储文件的路径可以通过单击浏览按钮来选择存储文件夹。批量下载的原理和下载任务的原理和相似,只是同时进行多个下载任务。删除任务和清除文件就是对任务和以下载的文件。523下载任务具体实现下载任务管理主要是对下载任务进行操作,下载任务中主要包括新建下载任务、批量下载任务、退出任务。任务管理的结构图如图5所示任务管理新建下载任务批量下载任务退出任务图5下载任务结构图新建下载任务设计使用SWT/JFACE中的对话框(DIALOG)设计实现,新建下载任务流程图,如图6所示任务管理界面新建任务界面填写任务信息栏是否符合HTTP请求开始完成下载返回HTTP响应信息NY图6新建下载任务流程图新建下载任务对话框的设计主要是根据JFACE中DIALOG设计实现,如图7第14页共25页所示图7新建下载任务对话框从对话框中可以看到下载任务的三个主要参数URL地址、存储目录、以及选择下载线程数,在信息填写完毕后按下确定按钮就会对NEWHTTPTASK建立实例开始进行下载。同时在点击浏览按钮时会弹出浏览目录对话框,如图8所示图8浏览对话框以下是对话框的设计实现核心代码PROTECTEDCONTROLCREATEDIALOGAREACOMPOSITEPARENTCOMPOSITECOMPOSITECOMPOSITESUPERCREATEDIALOGAREAPARENTCOMPOSITEPANELNEWCOMPOSITECOMPOSITE,SWTNONEGRIDDATAPANELDATANEWGRIDDATASWTFILL,SWTFILL,TRUE,TRUEPANELSETLAYOUTDATAPANELDATAPANELSETLAYOUTNEWGRIDLAYOUT5,FALSENEWLABELPANEL,SWTRIGHTSETTEXT“存储目录“第15页共25页BTNBROWSESETTEXT“浏览“BTNBROWSEADDSELECTIONLISTENERNEWSELECTIONADAPTERPUBLICVOIDWIDGETSELECTEDSELECTIONEVENTEFINALSHELLSHELLDISPLAYGETCURRENTGETACTIVESHELLDIRECTORYDIALOGDLGNEWDIRECTORYDIALOGSHELLDLGSETTEXT“浏览文件夹“DLGSETMESSAGE“请选择一个目录“DLGSETFILTERPATH“C/DOWNLOAD“STRINGDIRDLGOPENIFDIRNULLNEWTASKDIALOGTHISCMBDESTFOLDERSADDDIRNEWTASKDIALOGTHISCMBDESTFOLDERSSELECT0NEWLABELPANEL,SWTNONESETTEXT“选择下载线程数“CMBTHREADCOUNTSNEWCOMBOPANEL,SWTREAD_ONLYRETURNPANEL;PROTECTEDVOIDCREATEBUTTONSFORBUTTONBARCOMPOSITEPARENTCREATEBUTTONPARENT,IDIALOGCONSTANTSOK_ID,“确定“,TRUECREATEBUTTONPARENT,IDIALOGCONSTANTSCANCEL_ID,“取消“,FALSE下载功能的实现主要原理是判断NEWHTTPTASK构造函数中参数是否合法;然后通过使用HTTPCLIENT包,建立HTTP连接;通过HEAD方法得到相应文件的长度信息;判断是否支持多线程下载;通过判断状态码(STATUSCODE)判断是否有异常或者文件是全部下载还是部分下载,也就是文件是第一次下载还是有过停止后继续下载。根据下载线程数把文件分块;建立相应线程进行下载,并读入;将读到的数据写到指定路径;核心代码如下/建立连接MULTITHREADEDHTTPCONNECTIONMANAGERCONNECTIONMANAGERNEWMULTITHREADEDHTTPCONNECTIONMANAGERCONNECTIONMANAGERGETPARAMSSETDEFAULTMAXCONNECTIONSPERHOST20第16页共25页HTTPCLIENTNEWHTTPCLIENTCONNECTIONMANAGER/得到文件大小HEADMETHODHEADNEWHEADMETHODURLTOSTRINGHEADSETFOLLOWREDIRECTSFALSEINTSTATUSCODEHTTPCLIENTEXECUTEMETHODHEAD/判断资源是否支持多线程下载IFSTATUSCODEHTTPSTATUSSC_MOVED_TEMPORARILYSTRINGRECENTURLHEADGETRESPONSEHEADER“LOCATION“GETVALUELOGGERINFO“URLREDIRECTION“RECENTURLTHISURLNEWURLURLGETPROTOCOL,URLGETHOST,URLGETPORT,RECENTURLHEADNEWHEADMETHODURLTOSTRINGSTATUSCODEHTTPCLIENTEXECUTEMETHODHEAD/将文件分块,并建立相应线程完成下载CONTENTLENGTHGETRESOURCECONTENTLENMSG“RESOURCECONTENTLENGTHIS“CONTENTLENGTHLOGGERINFOMSGLISTENERONPROGRESSMSGLISTENERONGETCONTENTLENGTHDESTINATIONGETNAME,CONTENTLENGTHLONGCHUNKCONTENTLENGTH/THREADCOUNTSLONGSTARTPOS0LONGENDPOSFORINTI0ITHREADCOUNTSINDPOSSTARTPOSCHUNKIFITHREADCOUNTS1ENDPOSCONTENTLENGTHWORKERSINEWHTTPTASKWORKER“WORKERTHREAD“I1,STARTPOS,ENDPOS1WORKERSISTARTSTARTPOSENDPOS/存储文件DESTINATIONNEWFILEDESTINATION,第17页共25页NEWFILEURLGETPATHGETNAMESTORENEWRANDOMACCESSFILEDESTINATION,“RW“另外,由于在新建任务栏中需要填入下载资源地址URL,而URL地址经常是一串很长的字符串,每次都手工复制、粘贴到下载软件任务栏中显然非常麻烦。为了用户使用更加的方便,下载软件在新建任务时支持将系统剪贴板中的内容(URL地址)自动添加到新建任务中的URL地址栏中,这样就意味着用户在粘贴地址后再打开新建下载任务时,ULR地址已经被填在新建任务中的URL地址栏。这样可以大大节省用户的工作量。主要代码如下PROTECTEDSTRINGGETCLIPBOARDURLCLIPBOARDCLIPBOARDNEWCLIPBOARDDISPLAYGETCURRENTTEXTTRANSFERTEXTTRANSFERTEXTTRANSFERGETINSTANCESTRINGTEXTDATASTRINGCLIPBOARDGETCONTENTSTEXTTRANSFERURLURLTRYURLNEWURLTEXTDATAIFURLGETPROTOCOLEQUALS“HTTP“RETURNTEXTDATACATCHMALFORMEDURLEXCEPTIONERETURN“另外下载任务还提供批量下载任务。批量下载针对的是一些下载资源分成很多部分或是类似下载连续剧URL地址一样的,大部分的URL都是相同的,只是在地址的某个序号不同。如果是这样的话就算是有自动添加剪贴板的功能,仍然需要很大的工作量。软件提供了批量下载就解决了重复工作的。批量下载任务栏中提供输入地址中数字的上下限,从而自动生成所有的URL地址。新建批量任务流程图第18页共25页任务管理界面新建批量任务界面填写任务信息栏是否符合HTTP请求自动生成URL地址新建任务管理界面生成URL自动添加到剪贴板完成下载NY图9批量下载任务流程图图10批量下载任务对话框53监控下载信息设计531监控下载信息类图监控下载信息主要是为用户提供文件下载时的相应返回信息,方便用户使用时能够清楚地知道下载文件当前运行的状况。创建DOWNLOADLISTENER类,提供监听进度(ONPROGRESS)、得到当前内容长度(ONGETCONTENTLENGTH)、第19页共25页ONREADCHUNK等一些方法。分别在命令行参数执行和用户图形界面中分别继承DOWNLOADLISTENER的方法。只要在HTTPTASK类中实现监听就可以得到相应的信息。监控下载信息类图如下图11批量下载任务对话框532监控下载信息顺序图根据下载监听活动描述下载信息监听顺序图图12监听下载信息顺序图533监控下载信息实现要实现对下载文件信息的监控需要先在用户界面中添加监听机制,需要监视的内容主要包括下载文件的文件名、下载文件的大小、下载任务进行的进第20页共25页度(完成的百分比)、下载任务的即时速度、剩余时间、已用时间和文件类型。在“获得当前进度”和“信息的更新”的方法模块中都用到了“SYNCHRONIZED”关键字修饰,这表示,当一个线程A使用这些方法时,其他线程想使用这些方法时就必须等待,直到线程A使用完这些方法。这样的话就有效地保证了这些线程的共享数据的一致性,从而也就保证了程序的正确性,保证了对共享数据操作的完整性,即实现了不同线程对共享数据操作的同步,这是线程安全的核心问题,在这里得到了很好的体现。/获得下载速度PROTECTEDLONGCOMPUTESPEEDINTSIZELONGNOWSYSTEMCURRENTTIMEMILLISLONGSLICENOWLASTTIMEDATARECEIVEDLONGSPEEDSIZE1000/SLICE01SLICERETURNSPEEDPROTECTEDSTRINGGETSPEEDLONGSPEEDSTRINGUNITS“B/S“,“KB/S“,“MB/S“IFSPEED110RETURNSPEEDUNITS0ELSEIFSPEED120RETURNSPEED/110UNITS1RETURNSPEED/120UNITS2/获得剩余时间PROTECTEDSTRINGMILLISECONDSTOSTRLONGMILLISECONDSLONGDAYSMILLISECONDS/1000/246060LONGHOURSMILLISECONDS/1000246060/6060LONGMINUTESMILLISECONDS/10002460606060/60LONGSECONDSMILLISECONDS/100060/获得当前进度PUBLICSYNCHRONIZEDVOIDONPROGRESSFINALSTRINGMSGLOGGERENTRIESADDMSGGUIDOWNLOADERGETAPPGETSHELLGETDISPLAYSYNCEXECNEWRUNNABLEPUBLICVOIDRUNTABLETASKSTABLEGUIDOWNLOADERGETAPPGETTASKSTABLELISTTASKLOGGERGUIDOWNLOADERGETAPPGETTASKLOGGERINTINDEXTASKSTABLEGETSELECTIONINDEXIFINDEX1/在任务刚建立时信息的初始化PUBLICVOIDONGETCONTENTLENGTHFINALSTRINGFNAME,LONGLENTHISFNAMEFNAMECONTENTLENGTHLENLASTTIMEDATARECEIVEDSYSTEMCURRENTTIMEMILLISDISPLAYDISPLAYGUIDOWNLOADERGETAPPGETSHELLGETDISPLAYDISPLAYSYNCEXECNEWRUNNABLEPUBLICVOIDRUNITEMSETTEXTNEWSTRINGFNAME,STRINGVALUEOFCONTENTLENGTH,“0“,“,“,“,“/信息的更新PUBLICSYNCHRONIZEDVOIDONREADCHUNKSTRINGNAME,INTSIZECOMPLETEDSIZELONGSPEEDCOMPUTESPEEDSIZEFINALSTRINGPERCENTSTRINGVALUEOFCOMPLETED100/CONTENTLENGTHFINALSTRINGSPEEDSTRGETSPEEDSPEEDFINALSTRINGTIMEREMAINMILLISECONDSTOSTRCONTENTLENGTHCOMPLETED/SPEED1000FINALSTRINGTIMEELAPSEDMILLISECONDSTOSTRSYSTEMCURRENTTIMEMILLISSTARTTIMEFINALSTRINGFILETYPE“LASTTIMEDATARECEIVEDSYSTEMCURRENTTIMEMILLISDISPLAYDISPLAYGUIDOWNLOADERGETAPPGETSHELLGETDISPLAYDISPLAYSYNCEXECNEWRUNNABLEPUBLICVOIDRUNITEMSETTEXTNEWSTRINGFNAME,STRINGVALUEOFCONTENTLENGTH,第22页共25页PERCENT,SPEEDSTR,TIMEREMAIN,TIMEELAPSED,FILETYPE在完成了监听后,只需要在下载过程中,添加实现监听机制就能够完成对下载信息的监视返回。/添加监听PRIVATESTATICFINALLOGLOGGERLOGFACTORYGETLOGHTTPTASKCLASSPRIVATEDOWNLOADLISTENERLISTENERPUBLICVOIDADDDOWNLOADLISTENERDOWNLOADLISTENERLISTENERTHISLISTENERLISTENERSTRINGMSG“STARTINGTODOWNLOADURL“URLTOSTRINGLOGGERINFOMSGLISTENERONPROGRESSMSGTRYCONTENTLENGTHGETRESOURCECONTENTLENMSG“RESOURCECONTENTLENGTHIS“CONTENTLENGTHLOG
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 雀巢产品面试题及答案
- 村计生考试题及答案
- 计量基础考试题及答案
- 铣工中级考试题及答案
- 心理影射测试题及答案
- 台虎钳考试题及答案
- 火车坠落测试题及答案
- 科目一冷门试题及答案
- 煤矿地测考试题库及答案
- 韩语岗位面试题及答案
- 建筑公司分包合同管理办法
- 2025至2030苏打水行业发展趋势分析与未来投资战略咨询研究报告
- 2025年秋季学期德育工作计划:向下扎根向上开花
- 2025-2030中国家政服务行业信用体系建设与服务质量监管报告
- 2025年成都水务考试题库
- 《医师法》考核试题(附答案)
- 2025年云计算测试题库及答案
- 2025年安徽省普通高中学业水平选择性考试(物理)科目高考真题+(答案解析版)
- 湛江初一分班考试试题及答案
- 2025年成都东部集团有限公司及下属企业招聘考试笔试试卷【附答案】
- 各分项工程质量保证措施
评论
0/150
提交评论