基于HTTP协议的断点续传应用系统开发毕业设计说明书(论文)_第1页
基于HTTP协议的断点续传应用系统开发毕业设计说明书(论文)_第2页
基于HTTP协议的断点续传应用系统开发毕业设计说明书(论文)_第3页
基于HTTP协议的断点续传应用系统开发毕业设计说明书(论文)_第4页
基于HTTP协议的断点续传应用系统开发毕业设计说明书(论文)_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本科毕业设计说明书(论文)本科毕业设计说明书(论文) 题目:基于 http 协议的断点续传应用系统开发 毕业设计(论文)原创性声明和使用授权说明毕业设计(论文)原创性声明和使用授权说明 原创性声明原创性声明 本人郑重承诺:所呈交的毕业设计(论文) ,是我个人在指导教师 的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标 注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果, 也不包含我为获得 及其它教育机构的学位或学历而使用过的 材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作 了明确的说明并表示了谢意。 作 者 签 名: 日 期: 指导教师签名: 日期:

2、使用授权说明使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文) 的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本; 学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与 阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文; 在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名: 日 期: 基于基于 http 协议的断点续传应用系统开发协议的断点续传应用系统开发 摘摘 要要 文件的上传下载是计算机网络核心应用之一。计算网络的发展围绕 在怎样使得文件上传下载更快、更好、更安全。当今的网络时代,下载 软件是使用最频繁的软件之一,而

3、网络的不稳定常常造成数据传输的不 稳定,为了获得可靠、高效的数据传输,断点续传技术应运而生。 本系统开发基于 http 协议,具有断点续传、多线程下载功能,这 些功能的实现大大减少资源的浪费,节省用户下载的时间。本系统的开 发用到了多线程技术、网络编程、i/o 流技术和 swing 用户界面编程, 涉及到 j2se 中一些基本技术,达到了综合运用所学过的 java 知识的目 的。 本文对系统的需求分析、关键技术和难点进行了的详细描述,同时 又详细介绍本系统的设计与实现。 关键词关键词:断点续传,多线程,下载,http the development of technology for down

4、loading continuously from break points system based on http protocol abstract to upload and download files is one of core applications of computer network. development of network computing is how to make file upload and download faster, better, more secured. at present, the softwares for downloading

5、 files are used frequently. data transmission problem that is caused by network instability is quite unstable. in order to obtain reliable and efficient data transfer, tdcbp technology turns out. based on the http protocol, the system implements technology for downloading continuously from break poi

6、nts (tdcbp). it is also dependent on multi-threads programming, which greatly reduces resources and saves downloading time. during development of system, it utilizes a multi- threading, network programming, i/o streaming technology, and swing library for user interface programming. and then it reach

7、es the purpose of integrated application based on java. this article not only analyzes the requirements of this system with detailed descriptions of the key technology and dificulties, but also introduces the system design in detail and implementation of this system. key words: tdcbp, multithreading

8、, download, http 目 录 摘摘 要要.1 1 abstract.2 2 第一章第一章 绪论绪论.1 1 1.1研究的背景.1 1.2研究的意义.1 1.3研究的目标.2 1.4可行性分析.2 1.4.1技术可行性.2 1.4.2操作可行性.3 1.5论文内容概述.3 第二章第二章 相关理论与技术相关理论与技术.4 4 2.1java 的简介.4 2.2swing 技术简介.6 2.2.1swing 组件的简介.8 2.3eclipse 的简介.10 2.3.1eclipse 的起源和发展.10 2.3.2eclipse 的体系结构.10 2.4http 协议的简介.11 2.5

9、开发环境.12 2.6本章小结.12 第三章第三章 需求分析及关键技术和难点需求分析及关键技术和难点.1313 3.1用户需求分析.13 3.2系统功能需求分析.14 3.2.1下载任务实体类的基本功能分析.14 3.2.2系统工具类的基本功能分析.15 3.2.3线程下载类的基本功能分析.15 3.2.4下载任务总线程控制类的基本功能分析.15 3.2.5用户界面类的基本功能分析.16 3.3系统流程及模块划分.16 3.4关键技术和难点.17 3.4.1java 多线程技术 .17 3.4.2java i/o 流技术.18 3.5本章小结.20 第四章第四章 系统详细设计与实现系统详细设计

10、与实现.2121 4.1系统基本流程.21 4.2系统功能模块设计.22 4.2.1系统下载功能的实现.22 4.2.2断点续传功能的设计与实现.26 4.2.3多线程的设计与实现.28 4.2.4文件序列化保存下载信息.30 4.2.5系统界面设计.31 4.3本章小结.33 第五章第五章 系统运行测试系统运行测试.3434 5.1系统测试.34 5.1.1数据正确性测试.34 5.1.2系统功能测试.35 5.2本章小结.38 第六章第六章 总结总结.3939 参考文献参考文献.4040 致谢致谢.4242 附录附录.4343 附录 1 毕业设计文献综述.43 附录 2 毕业设计开题报告.

11、43 附录 3 毕业设计外文翻译(中文译文与外文原文).43 第一章第一章 绪论绪论 1.1 研究的背景 文件的上传下载是计算机网络核心应用之一。计算网络的发展围绕在怎样使得 文件上传下载更快,更好,更安全的核心周围1。当今的网络时代,下载软件是使 用最频繁的软件之一。这些年来,下载技术一直在发展,最原始的下载功能仅仅是 个“下载”过程,即从 web 服务器上连续地读取文件。其最大的问题是,由于网 络的不稳定性或者异常的操作,一旦连接断开使得下载过程中断,就不得不全部从 头再来一次。随后, “断点续传”的概念就出来了。 “断点续传” ,顾名思义就是如果 下载中断,在重新建立连接后,跳过已经下载

12、的部分,而只下载没有下载的部分。 这样可以大大减少资源的浪费,节省下载的时间2。 自从“多线程下载”技术发明以来,这项技术得到前所未有的关注已是不争的 事实。在“网络蚂蚁”软件流行开后,许多下载软件也都纷纷效仿,是否具有“多 线程下载”技术、甚至能支持多少个下载线程都成了人们评测下载软件的要素。 “多 线程下载”的基础是 web 服务器支持远程的随机读取,也即支持“断点续传” 。这 样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载3。 java 又是一种适用于平滑移植、安全、健壮和可扩展等跨平台开发语言,能 开发出跨平台的应用对象和应用程序,所以本系统的实现后可以在多个操作

13、系统平 台上运行,如 windows、linux 等,甚至是在非 pc 上,比如手机或 pda 上该设 计采用 java 多线程与线程安全机制,在一定程度上能提高下载的速度和安全性4。 1.2 研究的意义 多线程和传统的单线程在程序设计上最大的区别是各个线程的控制流彼此独立, 使得各个线程之间的代码是乱序执行,由此带来的线程调度问题。多线程进行断点 续传,还要记录多个断点位置,且记录断点位置时也要考虑同步互斥等问题,这些 都使得设计开发变得更复杂,但是可以明显提高网络文件的下载速度6。现在,不 要说编写专门的下载软件,在自己编写的软件中,加入下载功能有时也非常必要。 1.3 研究的目标 开发基

14、于 http 协议的断点续传应用系统,其目标是为了方便用户,提供给用 户便捷的下载方式,更快的下载速度。本系统充分利用了网络上的多余带宽,采用 “断点续传”技术,能在上次中止部位继续下载,有效避免了重复劳动,大大节省 了下载者的连线下载时间。 1.4 可行性分析 可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够 解决。要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系 统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系 统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设 计的过程,也就是在较高层次上以较抽象的方式进

15、行的系统分析和设计的过程。 系统的可行性分析主要包括技术上的可行性和操作上的可行性。本系统的可行 性分析如下: 1.4.1 技术可行性 下载程序功能模块的实现主要利用了面向对象的 java 高级编程语言。使用 java 作为开发工具主要是因为 java 是目前比较流行而且非常成功的编程语言。多线程编 程技术是 java 语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子 任务。特别是在网络编程中,有很多功能是可以并发执行的。 java 中实现多线程的 类有两种方法:1.扩展 java.lang.thread 类,用它覆盖 thread 类的 run 方法。2.生成 实现 java.l

16、ang.runnable 接口的类并将其它的实例与 java.lang.thread 实例相关联。 thread 类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能, 在 java 中只要简单地从 thread 类派生一个子类就可以了。扩展 thread 类,如 printthread.java。由于同一进程的多个线程共享同一片存储空间,在带来方便的同 时,也带来了访问冲突这个严重的问题。java 语言提供了专门机制以解决这种冲突, 有效避免了同一个数据对象被多个线程同时访问。由于我们可以通过 private 关键 字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机

17、制,这套机 制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。本系统使用 eclipse 的 swing 图形界面技术进行开发。系统的可行性分析主要 包括技术上的可行性和操作上的可行性。 1.4.2操作可行性 下载程序的具备友好的用户界面,而且操作简单易于被用户接收,使用此下载 程序十分方便,因为软件的操作思路比较清晰,而且用户实际操作的内容较少,所 以用户只需要熟练操作计算机即可。因此从使用操作方面看,此系统得开发是可行 的。 1.5 论文内容概述 各章节的主要内容如下: 第一章是绪论,讨论课题的研究背景、意义和研究目标

18、,及可行性分析,包括技 术可行性,操作可行性。第二章是软件开发工具和技术介绍,主要介绍了毕业设计 中用到的技术及开发工具。第三章是需求分析,介绍系统业务流程概况,主要阐述 了在线作业系统功能模块的需求用例。第四章是概要设计和详细设计,描述了数据 库设计方案,以及各功能模块的技术实现方案。 第五章是系统实现,这一章主要讲 了开发环境及配置,并通过两个典型例子介绍了该系统的技术实现架构,阐述技术 关键及解决方法和经验总结。第六章是结束语。 第二章第二章 相关理论与技术相关理论与技术 本系统用 java 技术开发,开发工具是 eclipse,涉及到 java 多线程、 swing、http 等相关技

19、术,本章将对上述技术进行简要的阐述。 2.1 java 的简介 java 技术既是一种高级的面向对象的编程语言,也是一个平台。java 技术基 于 java 虚拟机(java virtual machine,jvm)的概念 这是语言与底层软件和 硬件之间的一种转换器。java 语言的所有实现都必须实现 jvm,从而使 java 程序 可以在有 jvm 的任何系统上运行6。 java 编程语言(java programming language)与众不同之处在于:java 程序既 是编译型的(compiled) (转换为一种称为 java 字节码的中间语言) ,又是解释型的 (interpret

20、ed) (jvm 对字节码进行解析和运行) 。编译只进行一次,而解释在每次 运行程序时都会进行。编译后的字节码采用一种针对 jvm 优化过的机器码形式; 解释器是 jvm 的实现。 java 平台(java platform) 是一种纯软件平台,它可以在各种基于硬件的平台 上运行。它有三个版本(参见后面的 java 平台的多个版本) 。它由 jvm 和 java 应用程序编程接口(java application programming interface,api)组成。java api 是一个大型的现成软件组件(类)集合,它可以简化 applet 和应用程序的开发和部 署,包括健壮、安全且可

21、互操作的企业应用程序。它涵盖从基本对象到连网和安全 性,再到 xml 生成和 web 服务的所有东西。java api 组织成相关类和接口的库; 库也称为包(package) 。 除了 java api 之外,每个完整的 java 平台实现还包含: 用来编译、运行、监视、调试应用程序以及建立应用程序文档的开发工具。 用来部署应用程序的标准机制。 用来创建复杂的图形用户界面(gui)的用户界面工具包。 用来启用数据库访问和操作远程对象的集成库。 java 技术是最初由 sun microsystems 公司开发的。java community process(jcp,一个由全世界的 java 开

22、发人员和获得许可的人员组成的开放性组织) 对 java 技术规范、参考实现和技术兼容性包进行开发和修订。在 2006 年 8 月, sun microsystems 宣布它打算开放 java 平台的源码,并开始征询对许可协议和管 理方式的反馈7。 java 语言的主要好处是,java 应用程序可以跨硬件平台和操作系统进行移植 这是因为每个平台上安装的 jvm 都可以理解同样的字节码。java 语言和平 台的可伸缩性非常强。在低端,现有的应用程序可以很容易地适应内存资源有限的 设备。这种语言是进行服务器端 web 编程的理想框架。因为它被设计为按照一种 安全的方式通过网络运行,在通过互联网进行操

23、作时,它提供了一定程度的安全性。 在本质上,java 技术将用户的计算能力从桌面扩展到了 web 资源。web 组件由称 为 web 容器(web container) 的运行时平台支持,web 容器的服务包括请求分派、 安全性、并发性、生命周期管理以及对命名、事务和电子邮件等 api 的访问。在高 端,java 应用服务器(application server) 作为 java 组件、xml 和 web 服务的 web 容器,可以与数据库进行交互并提供动态的 web 内容;它们还为企业应用程 序提供应用程序开发环境,具有事务管理、安全性、集群、性能、可用性、连接性 和可伸缩性等功能。 jav

24、a 平台有三个版本,这使软件开发人员、服务提供商和设备生产商可以针对 特定的市场进行开发: (1) java se(java platform,standard edition) 。java se 以前称为 j2se。它允 许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 java 应用程序。 java se 包含了支持 java web 服务开发的类,并为 java platform,enterprise edition(java ee)提供基础。大多数 java 开发人员使用 java se 5,也称为 java 5.0 或 “tiger”(2006 年 6 月,java se 6

25、 或 “mustang” 发布了 beta 版。 )java ee(java platform,enterprise edition) 。这个版本以前称为 j2ee。企业版本帮助开 发和部署可移植、健壮、可伸缩且安全的服务器端 java 应用程序。java ee 是在 java se 的基础上构建的,它提供 web 服务、组件模型、管理和通信 api,可以 用来实现企业级的面向服务体系结构(service-oriented architecture,soa)和 web 2.0 应用程序。 (2) java ee(java platform,enterprise edition) 。这个版本以前

26、称为 j2ee。企业 版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 java 应用程序。java ee 是在 java se 的基础上构建的,它提供 web 服务、组件模型、管理和通信 api,可以用来实现企业级的面向服务体系结构(service-oriented architecture,soa)和 web 2.0 应用程序。 (3)java me(java platform,micro edition) 。这个版本以前称为 j2me。java me 为在移动设备和嵌入式设备(比如手机、pda、电视机顶盒和打印机)上运行 的应用程序提供一个健壮且灵活的环境。java me 包括灵活

27、的用户界面、健壮的安 全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支 持。基于 java me 规范的应用程序只需编写一次,就可以用于许多设备,而且可以 利用每个设备的本机功能8。本系统是基于 java se 开发。 2.2 swing 技术简介 swing是一个用于开发java应用程序用户界面的开发工具包。它以抽象窗口工具 包(awt)为基础使跨平台应用程序可以使用任何可插拔的外观风格。swing开发 人员只用很少的代码就可以利用swing丰富、灵活的功能和模块化组件来创建优雅的 用户界面。 swing的体系结构如图2.2所示 图2.2 swing的体系结构 swi

28、ng 的主要特性包括: swing 是由 100%纯 java 实现的,swing 组件是用 java 实现的轻量级(light- weight)组件,没有本地代码,不依赖操作系统的支持,这是它与 awt 组件的最大 区别。由于 awt 组件通过与具体平台相关的对等类(peer)实现,因此,swing 比 awt 组件具有更强的实用性。swing 在不同的平台上表现一致,并且有能力提供本 地窗口系统不支持的其他特性。 swing 采用了一种 mvc 的设计范式,即“模型-视图-控制器”(model-view- controller) ,其中,模型用来保存内容,视图用来显示内容,控制器用来控制用

29、户输 入。 swing 采用可插入的外观感觉(pluggable look and feel,pl t.start( ); 在调用 start( )方法时,将创建一个新的控制线程,新线程进入可运行状态,它 将向线程调度器注册这个线程。接着它将调用 run( )方法。 每个线程都是通过某个特定 thread 对象所对应的 run( )方法来完成其操作,因 为 run( )方法中的代码定义执行线程所需要的功能,所以 run( )方法被称为线程体。 每个线程都是通过某个特定 thread 对象所对应的 run( )方法来完成其操作的,因为 run( )方法中的代码定义执行线程所需的功能,所以 run

30、( )方法被称为线程体17。 3.4.2java i/o 流技术 为了进行数据的输入/输出操作,java 中把不同的输入/输出源抽象表述为“流” (stream) 。java.io 包中定义了多个流类型来实现输入/输出功能。 按照流的方向划分,可以分为输入流和输出流。 输入流:只能从中读取字节数据,而不能向其写入数据。 输出流:只能向其写入字节数据,而不能从中读取数据。 按照流所处理的数据类型划分,可以分为字节流和字符流。 节点流:可以从(向)一个特定的 i/o 设备读(写)数据的流,节点流也被 称为低级流。 处理流:用来实现对一个已存在的流的连接和封装,是通过所封装的流的功 能调用实现数据读

31、/写操作的流,处理流也被称为高级流。 java.io 包支持两种类型的流,包括二进制数据的字节流和包括字符数据的字符 流。在读/写数据时,这两种流以不同方式工作18。当向字节流写数据时,数据以字 节序列的形式写入流,与它在内存中的形式一样,数据不发生任何转换。二进制数 值只能被写为字节序列,4 个字节构成一个 int 型值,8 个字节构成一个 long 型值等。 java 其内部将字节符存储为 16 位的 unicode 码字符,因此每个 unicode 码字符可以 写成 2 个字节的二进制流,先写高 8 位。字符流用于存储和检索文本,而且可以使 用它读取由非 java 程序生成的文本文件。所

32、有二进制数据在写向字符流之前必须转 换为字符流能够接受的表达形式。该形式由原始二进制数据值转换成的字符组成。 因此,从包含文本的字符流中读取数据比直接读取二进制数据涉及更多的工作19。 在本系统中,由于下载文件不一定是只包含字符的文本,因此在实现过程中使 用的是更加通用的字节流。在 java.io 包中,inputsteam 和 outputstream 类及它们的 子类均表示字节流,并且提供了读/写二进制数据的方法。inputstream 类中包含 3 个 read( )方法,用来数据流中读取二进制代码。 输入流的基本方法如下: read( ),这个方法在 inputstream 类中是抽象

33、的,因此它必须定义在子类中。此方 法以 int 型返回流的下一个可读字节。如果到达流的末尾,则方法的返回值为-1.如 果 i/o 发生错误,将抛出 ioexception 类型的异常。 read(byte array),此方法将流中字节读到数组的连续元素中,读出的字节数量 最大为 array.length 的值。在读取完输入数据或是检测到流尾时,才从本方法返回。 本方法将返回读取的字节个数,或者如果因为到达流尾而没有读取任何字节则返回- 1.如果 i/o 发生错误,将抛出 ioeception 类型异常。如果传给方法的参数为 null,则 抛出 nullpointerexception 异常。

34、 read(byte buffer,int offset,int length),此方法将数据读入一个字节数组,从数组 的 offset 指定的位置开始存放,并用 length 来指定读取的最大字节数。 输入流的其他方法如下: void close( ),关闭流。 int available( ),返回可以从中读取的字节数。 long skip(long n),在输入流中跳过 n 个字节,将实际跳过的字节数返回。 boolean marksupported( ),判断流是否支持标记功能。 void mark( int readlimit),在支持标记的输入流的当前位置设置一个标记。 void

35、reset( ),返回到流的上一个标记。注意,流必须支持标记功能。 outputstream 类包含 3 个 write( )方法,用来向数据流写入二进制代码。这些操 作与 inputstream 类的 read( )方法相对应20。 输出流的基本方法如下: void write( int c)。 void write(byte buffer)。 void write(byte buffer, int offset, int length)。 在本系统的实现过程中主要涉及两部分 java 流操作,一个是从打开的 url 连 接中获得网络的输入流,一个是向文件写入内容的输出流。 3.5本章小结

36、本章对项目本系统需求进行了用户需求分析和系统功能需求分析,并描述了系 统流程及模块划分,而且分析了关键技术和难点,明确了系统的使用对象、大致功 能结构及各个业务系统所需实现的功能等问题,为后续系统设计打下了基础。 第四章第四章 系统详细设计与实现系统详细设计与实现 4.1系统基本流程 该系统基本流程(如图 4.1 所示):运行程序后,可以在主界面上输入 url 地 址、保存地址也可以在文件菜单中新建一个任务,然后在 url 地址栏中输入 http 地址,用户可以选择需要下载的线程数,程序还提供下载弹出窗体保存位置的选择, 而且每当新建一个新的任务时,程序会自动载入默认的存储位置,不需要用户反复

37、 的输入地址。点击确定时,程序将在主界面显示刚刚新建的下载任务,包括了详细 的信息。 图 4.1 系统基本流程图 新建完任务后,用户还可以继续添加下载的任务。选中想要下载的任务,可以 多选,点击“开始”按钮,程序将开始任务的下载,当第一次运行程序时,程序将 在程序的当前目录下自动新建一个配置文件,该文件名为 globalget.init,该配置文件 将记录该程序的默认下载地址和所有上一次的任务下载信息。所以每当用户退出程 序时,程序都会自动保存当前的所有任务下载信息,做到“断点续传”的可视化。 当开始一个新的任务下载时,该程序也将自动创建一个新的保存任务下载信息的文 件,该文件用户记录该文件的

38、下载点,也就是实现“断点续传”的保存信息,文件 名以下载的文件名加上.tmp 命名,当该文件下载完成时,程序会自动删除该记录文 件。用户单击“删除任务”按钮可以删除选中的任务,可以多选。单击“新建按钮” , 将可以新曾下载的任务。 4.2系统功能模块设计 本系统分为五个功能模块,分别为下载任务实体类模块、系统工具类模块、线 程下载类模块、下载任务总控制模块、用户界面模块。每个模块的功能在上一章的 系统功能需求分析已经详细介绍过,这里不再重述。 4.2.1系统下载功能的实现 按照功能划分,下载过程可以分为两部分,即建立连接并读取待下载文件的信 息、下载文件。由于论文的篇幅有限,涉及到代码只张贴了

39、重点部分。 建立连接并获取下载信息 public static testresult testurl(string tmp) testresult r = new testresult(); url tmp_url; try system.out.println(正在连接 url + tmp + ); tmp_url = new url(tmp);/ 建立连接 httpurlconnection http = (httpurlconnection) tmp_url .openconnection(); if (http.getresponsecode() = 400) system.out.p

40、rintln(资源 + tmp_url + 服务器响应错误!); r.myurl = null; r.myresult = -1; return r; else system.out.println(资源 + tmp_url + 连接成功!); r.myurl = tmp_url; r.myresult = 1;/ 获取文件长度 r.filelength = http.getcontentlength(); if (r.filelength = -1) system.out.println(资源 + tmp + 无法获知的文件长度!); else system.out.println(资源 +

41、 tmp + 文件大小为 math.round(r.filelength / 1024 * 100) / 100.0+ k。); / 获取文件名 r.filename = getfilename(http); system.out.println(资源 + tmp + 文件名为 + r.filename); / 获取 mime 列表 r.http_mime = getmime(http); return r; catch (malformedurlexception e1) system.out.println(资源 + tmp + 格式错误!); r.myurl = null; r.myre

42、sult = -2; return r; catch (ioexception e2) system.out.println(资源 + tmp + 连接错误!); r.myurl = null; r.myresult = -3; return r; 它的作用是从下载 url 地址中文件名和文件长度。功能的实现是通过 httpurlconnection 类来完成的。httpurlconnection 实例都可用于生成单个请求, 再通过实例调用 getfilename 方法和 getcontentlength 方法来获取文件名大长度。请 求后在 httpurlconnection 的 inputs

43、tream 或 outputstream 上调用 close() 方法 可以释放与此实例关联的网络资源。 下载文件 public downloadthread(int id, string urladdress, string saveposition, long start, long end, int subthreadcount) system.out.println(id+id+,start: + start + ,end: + end); this.id = id; this.start = start; this.end = end; downloadthread.subthrea

44、dcount = subthreadcount; downloadthread.saveposition = saveposition; oos2 = downloadthread.getinstance(); downloadinfo2 = new downloadinfo(); downloadinfo2.setid(id); downloadinfo2.setendpoint(end); try url url = new url(urladdress); urlconnection request = url.openconnection(); bis = new bufferedin

45、putstream(request.getinputstream(); file file1 = new file(saveposition); if(!file1.exists() file file2 = file1.getparentfile(); if(!file2.exists() file2.mkdirs(); file1.createnewfile(); file = new randomaccessfile(saveposition, rw); catch (exception e) e.printstacktrace(); 下载文件的实现就是流传递,先根据 url 创建 ur

46、lconnection 的实例对象 bis,由该对象 bis 调用 getinputstream 方法,套接在 bufferedinputstream 里面,把数 据流加载到内存里面。 if(len = bis.read(buf, 0, 1024 * 2) 0) start = start + len;/首先判断开始点是否大于结束点 if (start end) len = integer.valueof(string .valueof(start - (start - len) - (start - end); system.out.println(线程 + id + ,原先的 start:

47、 + skiplen+ ,start: + start +,end: + end+ 需要写入 len: + len); 再用实例对象 bis 调用 read(byte b, int off, int len)方法,把数据读入到 byte 数 组 b 里。这样下载的数据就存在 b 里面。 下面再介绍如何从 byte 数组 b 里写到文件。 file = new randomaccessfile(saveposition, rw); 创建一个随机访问文件 file,如上。 file.write(buf, 0, len); 再用file调用write(byte b, int off, int len

48、)方法,把byte字节数组b的数据写到file 里,如上,最后关闭文件流。这样就实现了文件的下载。因为有java.io的存在,它 里面已经封流输入的方法,只要调用这些方法下载文件数据传输功能就能比较容易 的实现了。 4.2.2断点续传功能的设计与实现 本节介绍断点续传的原理及 java 实现断点续传的关键几点。 断点续传的原理 其实断点续传的原理很简单,就是在 http 的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 ,文件名为 down.zip。 get /down.zip http/1.1 accept: i

49、mage/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- excel, application/msword, application/vnd.ms-powerpoint, */* accept-language: zh-cn accept-encoding: gzip, deflate user-agent: mozilla/4.0 (compatible; msie 5.01; windows nt 5.0) connection: keep-alive 服务器收到请求后,按要求寻找请求的文件,提取文件的

50、信息,然后返回给浏 览器,返回信息如下: 200 content-length=106786028 accept-ranges=bytes date=mon, 30 apr 2001 12:56:11 gmt etag=w/02ca57e173c11:95b content-type=application/octet-stream server=microsoft-iis/5.0 last-modified=mon, 30 apr 2001 12:56:11 gmt 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端 浏览器传给 web 服务器的时候要多加一条信息-从哪里开

51、始。下面是用自己编的一 个浏览器来传递请求信息给 web 服务器,要求从 2000070 字节开始。 get /down.zip http/1.0 user-agent: netfox range: bytes=2000070- accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 仔细看一下就会发现多了一行 range: bytes=2000070- 。这一行的意思就是告 诉服务器 down.zip 这个文件从 2000070 字节开始传,前面的字节不用传了。 服务器收到这个请求以后,返回的信息如下: 206 content

52、-length=106786028 content-range=bytes 2000070-106786027/106786028 date=mon, 30 apr 2001 12:55:20 gmt etag=w/02ca57e173c11:95b content-type=application/octet-stream server=microsoft-iis/5.0 last-modified=mon, 30 apr 2001 12:55:20 gmt 和前面服务器返回的信息比较一下,就会发现增加了一行: content-range=bytes 2000070-106786027/10

53、6786028 返回的代码也改为 206 了,而不再是 200 了。知道了以上原理,就可以进行断 点续传的编程了。 java 实现断点续传的关键几点 用什么方法实现提交 range: bytes=2000070。 当用最原始的 socket 是肯定能完成的,不过那样太费事了,其实 java 的 net 包中 提供了这种功能。代码如下: url url = new url(http:/ httpurlconnection httpconnection = (httpurlconnection)url.openconnection(); /设置 user-agent httpcon

54、nection.setrequestproperty(user-agent,netfox); /设置断点续传的开始位置 httpconnection.setrequestproperty(range,bytes=2000070); /获得输入流 inputstream input = httpconnection.getinputstream(); 从输入流中取出的字节流就是 down.zip 文件从 2000070 开始的字节流。接下来 要做的事就是怎么保存获得的流到文件中去了。保存文件采用的方法。我采用的是 io 包中的 randaccessfile 类。操作相当简单,假设从 200007

55、0 处开始保存文件,代 码如下: randomaccess osavedfile = new randomaccessfile(down.zip,rw); long npos = 2000070; /定位文件指针到 npos 位置 osavedfile.seek(npos); byte b = new byte1024; int nread; /从输入流中读入字节流,然后写到文件中 while(nread=input.read(b,0,1024) 0) osavedfile.write(b,0,nread); 4.2.3多线程的设计与实现 多线程的控制与实现主要由 downloadfileco

56、ntrol.java 来完成。该类包含了从配 置文件中读取线程数的方法、读取所有线程的开始点和结束点方法、将下载文件分 割成 subthreadcount 个线程分别启动他们进行下载方法、用户判断当前所有的子线 程是否都已经结束方法、关闭子线程下载的文件输出流方法、暂停所有子线程的运 行方法、计算下载了多少字节方法。通过这些方法来控制线程,实现多线程下载。 而这个方法将下载文件分割成 subthreadcount 个线程分别启动他们进行下载是最为 重要的,下面介绍这这个方法设计。 int filesize = request.getcontentlength(); / 将下载文件 subthr

57、eadcount 等分,得到每块下载的大小 long block = filesize / subthreadcount; 先通过 getcontentlength 方法获取下载文件的大小,再装下载文件 subthreadcount 等分,得到每个下载块的大小。subthreadcount 是线程数,线程数 是在 frame 里输入。 downthread = new downloadthreadsubthreadcount; downloadinfo object = new downloadinfosubthreadcount; / 设置每个子线程开始下载的指针 for (int i =

58、0; i subthreadcount; i+) objecti = new downloadinfo(); objecti.setsavepoint(begin); begin = begin + block; /生成各个子线程对象 for (int i = 0; i subthreadcount; i+) if (i subthreadcount - 1) downthreadi = new downloadthread(i, urladdress, fileposition, objecti.getsavepoint(), objecti .getsavepoint() + block,

59、 subthreadcount); else downthreadi = new downloadthread(i, urladdress, fileposition, objecti.getsavepoint(), filesize, subthreadcount); / 启动线程 for (int i = 0; i downthread.length; i+) downthreadi.start(); 根据线程数创建相应数量的线程,并且为每个线程创建信息类 downloadinfo 用于保存该信息。用 setsavepoint 方法为每个子线程设置开始下载的指针,然后根 据相应的 url

60、等信息生成各个子线程对象,最后启动线程。当线程下载完成,就销 毁该线程。该系统在默认的线程数为 3,可设置线程数从 1 到 10。 4.2.4文件序列化保存下载信息 序列化就是将对象的状态信息转换为可以存储或传输的窗体的过程。序列化后 可以把信息或对象保存在文件里,当需要用到这些信息与对象就可以从文件在恢复。 一个类要具有可序列化的特性就必须实现接口 java.io.serializable。对于可以序列化 的对象可以用类 java.io.outputstream 来输出该对象,而且可以用类 java.io.objectinputstream 来读入该对象。 该系统对 downloadinfo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论