java论文java多线程与线程安全实践-基于http协议的断点续传内容摘要:

icrosoftIIS/ LastModified=Mon, 30 Apr 2020 12:56:11 GMT 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。 所以在客户端浏览器传给 Web 服务器的时候要多加一条信息 从哪里开始。 下面是用自己编的一 个 浏览器 来传递请求信息给 Web 服务器,要求从2020200 字节开始。 GET / HTTP/ UserAgent: NetFox RANGE: bytes=2020200 Accept: text/html, image/gif, image/jpeg, *。 q=.2, */*。 q=.2 仔细看一下就会发现多了一行 RANGE: bytes=2020200, 这一行的意思就是告诉服务器 这个文件从 2020200 字节开始传,前面的字节不用传了。 服务器收到这 个请求以后,返回的信息如下: 206 ContentLength=106786028 ContentRange=bytes 2020200106786027/106786028 Date=Mon, 30 Apr 2020 12:55:20 GMT ETag=W/02ca57e173c11:95b ContentType=application/octetstream Server=MicrosoftIIS/ LastModified=Mon, 30 Apr 2020 12:55:20 GMT 和前面服务器返回的信息比较一下,就会发现增加了一行 : ContentRange=bytes 2020200106786027/106786028 返回的代码也改为 206 了,而不再是 200 了。 知道了以上原理,就可以进行断点续传的编程了。 3 需求分析 分析 第 6 页 共 25 页 随着 Inter 的发展,进入信息时代后 快速获得网络共享资源成为很简单的事情,人们对 互联网 也有了很大的依赖性。 人们甚至希望只轻松点击鼠标就可以得到自己想要的东西。 比如, 针对一些专业的论坛提供了很多 相关资料以方便人们阅读或了解;还有更多的人希望能过下载到他们喜欢听得音乐、好看的图片、喜欢的电影等等。 也可以看出人们在上网时再也不单是打开浏览器来浏览网页,越来越多的人们开始使用下载软件来获取资源。 同时人们也更希望使用更新更快的下载软件。 由于用户下载需求的增大,也要求下载软件能够迅速完成对资源的下载。 多线程程序设计可以很好的解决程序并发的问题。 最恰当的比喻就是 用户 会感到CPU 似乎同时出现在两个地方,在下载软件中应用多线程技术可以理解为将一个下载任务分成若干份来完成,其中的并发控制将使下载的效率大大提高。 由于下载资源是一个过程,当中用到的时间可能会很长。 那么在很长的这段时间中很有可能会出现很多的意外情况使下载中断或是停止,比如电源意外被切断、网络中断、或是操作系统故障导致系统重新启动。 这些原因都会导致下载的中断,但是当 用户 重新下载资源时发现原来下载的数据已经消失你还是要回头再来。 断点续传就是用来解决这样的问题的,它的任务是在下载任务停止时,记录当前下载的信息并且利用网络协议中的一些重定向机制继续完成下载任务而不必从头再来。 随着使用下载工具的时间的增长,用户下载的资源越来越多,因此在下载列表中的项目也越来越 多,越来越混乱,因此为了便于管理和用户使用方便,用户迫切希望下载工具具有下载文件分类的功能。 在下载任务的管理这一块,用户不仅希望下载工具具有下载一个一个资源的功能,而且具有批量下载有些相似的或有关联的资源的功能。 还有些特殊情况下,用户在下载任务开始后由于种种原因希望放弃资源的下载,这就要求下载工具具有删除任务的功能了。 为了对下载任务进行掌控,用户往往具有设置下载任务的线程数,文件下载网址,文件下载存储目录和在下载过程中对下载任务的状态进行监控等功能需求。 鉴于某些软件使用初学者甚至某些电脑初学者的实际情 况,他们 往往需要系统有一个格外的帮助文档,使他们能够更快、更好地学会使用断点续传下载软件,提高效率。 业务流分析 多线程断点续传的 业务流程: 首先由用户进入软件系统,在新建任务中填写必要的下载资源的相关属性,比如相关资源下载地址 URL、存储路径、以及下 第 7 页 共 25 页 载线程数等。 由软件发送 HTTP 消息请求,然后服务器根据请求返回响应消息。 确认无误就可以启动线程开始下载资源。 将缓存中存储的数据最终存储到目的存储路径。 此外, 系统 为 用户提供了一些对任务的基本操作,比如,停止、继续、删除等。 4. 系统设计 系统设计 要点 随着用户下载需求的增大,用户下载的资源越来越大,下载的过程也就越来越久,这就要求下载软件能够迅速完成对资源的下载,为了提高下载效率的问题,所以本系统采用多线程的方式来实现下载速率的提高。 多线程的优点之一是所有线程都可以访问相同的全局变量和共享资源,它提供了程序设计的简捷性与便利性,提高了对信息处理的并发度,但也带来了数据的讹误或线程得不到某一资源而被饿死(即死锁)的可能性。 为了避免这些现象的产生,线程在使用共享资源或对象前必须获得一个约束访问同步对象的权力,也就是通过同步的机制来控制这种权力的使用,这 就是线程的安全问题。 Http 协议是互联网中一个非常重要而且应用十分频繁的协议,所以本系统的设计是基于 Http 协议的。 长期以来,断点续传始终是困扰网虫们的一大难题,眼看着已经下载到 99%的软件,却由于突然掉线而前功尽弃的那种沮丧 恐怕人人都经历过,于是本系统采用断点续传的方式来设计。 本系统设计的基本目标就是利用编写一个时下流行的基于 Http 协议的 多线程 断点续传的程序 来研究 Java 多线程与线程安全的机制。 系统总体功能结构 通过对多线程断点续传下载软件的需求分析并结合实际情况的分析,本系统由下载分类管 理、任务管理、设置管理、系统帮助四个主模块构成。 本系统的功能结构图如图示: 其中下载文件的分类模块主要是通过在新建下载任务时候设置下载文件的存储目录甚至新建一个存储目录的方式来实现。 下载任务的管理模块主要有三个子模块组成:新建下载任务模块、批量完成下载任务模块、删除任务模块。 在设置任务的管理模块主要有两个子模块组成:在新建(批量)下载任务 的时候进行任务的连接方面的配置模块以及在现在过程中对下载任务的状态进行监视的模块。 在系统帮助模块里主要是包含一些对整个系统的说明,便于用户理解。 另外系统还支持将资源 下载 URL 地址自动添加到剪贴板中,这样用户只需 第 8 页 共 25 页 要点击地址即可开始下载,而不是需要手动粘贴、复制 URL 地址到指定位置。 图 1 下载 程序 功能结构图 本下载 程序 提供两种操作模式:一种是使用命令行参数对下载软件进行操作;另一种方式是通过图形界面对下载软件进行操作。 在此对图形界面的实现进行详细介绍。 下载 程序 的主界面设计使用 Eclipse 开发主要分成四部分:第一部分是菜单栏,提供功能选项;第二部分是标准按钮栏;第三部分是信息列表框,其中包括下载软 件的名称、大小、下载进度、下载速度、剩余时间等下载任务的属性;最后一部分是一个文本框用来监视下载文件时返回的信息,包括下载文件的 URL地址、下载文件的长度、以及完成任务的所有线程数和每个线程完成的块大小。 在下载过程中上边提到的相关信息都会显示在列表框和文本框中,用户可以方便地监视到下载文件的状况。 菜单栏的设计使用了 包的 action 类, JFace 中引用了action 的概念主要用完成用户动作的代码复用。 在这里每一个 action 都可以用来响应一个用户的动作,比如打 印文件、打开文档或是显示对话框。 程序 的主界面菜 单栏的设计就是对 action 的复用。 首先创建用户动作,包括下载 工具 功能 模块 下 载 文 件 分类 下 载 任 务 设 置 任 务 系 统 帮 助 新 建 下 载 任务 批量 完成 下载 任务 删 除 任 务 连 接 配 置 监 视 配 置 监 视 下 载 信息 自动 添加 剪贴 板功 能 第 9 页 共 25 页 新建下载任务动作( newTaskAction)、新建批量下载任务动作( batchTaskAction)、删除任务动作( deleteTaskAction)、帮助动作( aboutAction)和退出动作( exitAction),这些都是 action。 在主界面 GUI 中代码设计如下。 添加用户动作。 添加新建下载任务动作: public class NewTaskAction extends Action { public NewTaskAction() { super(新建任务 @Ctrl+N, (,icons/ ))。 setToolTipText(新建任务 )。 } } 添加新建批量下载任务动作: public class BatchTaskAction extends Action { public BatchTaskAction() { super(新建批量任务 @Ctrl+B,(, icons/ ))。 setToolTipText(新建批量任务 )。 } } 添加删除任务动作: public class DeleteTaskAction extends Action { public DeleteTaskAction() { super(删除下载任务 @Delete, (, icons/ ))。 setToolTipText(删除下载任务 )。 } } 添加退出动作: public class ExitAction extends Action { public ExitAction() { super(退出 @Alt+F4)。 setToolTipText(退出 )。 } }  在界面菜单中创造用户动作的实例,并将这些实例添加到菜单栏的菜单 第 10 页 共 25 页 项当中。 public class GUIDownloader extends ApplicationWindow { public static GUIDownloader APP。 newTaskAction = new NewTaskAction()。 batchTaskAction = new BatchTaskAction()。 exitAction = new ExitAction()。 aboutAction = new AboutAction()。 deleteTaskAction = new DeleteTaskAction()。 protected MenuManager createMenuManager() { MenuManager menuManager = new MenuManager()。 MenuManager fileMenu = new MenuManager(文件 (amp。 F))。 (fileMenu)。 (newTaskAction)。 (batchTaskAction)。 (deleteTaskAction)。 (new Separator())。 (exitAction)。 }。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。