java多线程与线程安全实践基于ttp协议的断点续传—计算机毕业设计内容摘要:

时出现在两个地方,在下载软件中应用多线程技术可以理解为将一个下载任务分成若干份来完成, 其中的并发控制将使下载的效率大大提高。 由于下载资源是一个过程,当中用到的时间可能会很长。 那么在很长的这段时间中很有可能会出现很多的意外情况使下载中断或是停止,比如电源意外被切断、网络中断、或是操作系统故障导致系统重新启动。 这些原因都会导致下载的中断,但是当用户重新下载资源时发现原来下载的数据已经消失你还是要回头再来。 断点续传就是用来解决这样的问题的,它的任务是在下载任务停止时,记录当前下载的信息并且利用网络协议中的一些重定向机制继续完成下载任务而不必从头再来。 随着使用下载工具的时间的增长,用户下载的资源 越来越多,因此在下载列表中的项目也越来越多,越来越混乱,因此为了便于管理和用户使用方便,用户迫切希望下载工具具有下载文件分类的功能。 在下载任务的管理这一块,用户不仅希望下载工具具有下载一个一个资源的功能,而且具有批量下载有些相似的或有关联的资源的功能。 还有些特殊情况下,用户在下载任务开始后由于种种原因希望放弃资源的下载,这就要求下载工具具有删除任务的功能了。 为了对下载任务进行掌控,用户往往具有设置下载任务的线程数,文件下载网址,文件下载存储目录和在下载过程中对下载任务的状态进行监控等功能需求。 鉴于某些 软件使用初学者甚至某些电脑初学者的实际情况,他们往往需要系统有一个格外的帮助文档,使他们能够更快、更好地学会使用断点续传下载软件,提高效率。 业务流分析 多线程断点续传的 业务流程: 首先由用户进入软件系统,在新建任务中填写必要的下载资源的相关属性,比如相关资源下载地址 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)。 } 使用这样的方法就完成了上述用户动作,只要点击菜单栏按钮同 样完成相应事件的动作,比如按下新建下载任务后可以弹出新建下载任务对话框。 标准按钮栏和菜单栏的添加方法和菜单栏很相似,只需要添加按钮后同样添加用户动作即可。 用户界面除了按钮部分还包括下载时显示下载任务诸多属性的表格( Table),和监视下载信息的列表框( List)。 在 Table 与 List 的设计中主要采用分割条( SashForm)对 Table 和 List 进行分隔。 使用 SashForm 的好处就是可以使用户界面显得更标准、更美观;而且 SashForm 的功能是可以拉伸,从而调整Table 与 List 之间的比例最终达到 用户满意的效果;操作非常方便。 设计 Table、 List 与 SashForm 的主要代码: private Table tasksTable。 private List taskLogger。 public Table getTasksTable() { return tasksTable。 } public List getTaskLogger() { return taskLogger。 } protected Control createContents(Composite parent) { SashForm pane = new SashForm(parent, )。 tasksTable = new Table(pane, | )。 第 11 页 共 25 页 for (int i = 0, n =。 i n。 i++) { TableColumn col = new TableColumn(tasksTable, )。 (COLUMNTEXTS[i])。 (COLUMNWIDTHS[i])。 } (true)。 (true)。 } 用户主界面如图 2 所示: 图 2 下载软件的主界面 下载任务实现 下载任务类图 多线程下载程序是通过网络协议支持进行资源的下载,在这里对建立下载任务( Task)添加抽象方法 start、 stop、 resume 来建立任务。 由支持 HTTP 协议下载( HTTPTask)继承 Task 的抽象方法并实现通过 HTTP 协议下载。 这样做的好处就是软件会有很好的扩展性,通过对 Task 的继承还可以产生支持不同协议的下载,比如 FTP 下载、 BT 下载、 EDonkey 下载等等。 下载任务类图如下: 第 12 页 共 25 页 图 3 下载任务类图 下载任务顺序图 下载任务根据用户需求新建任务,在新建任务中填写必要的下载资源的相关属性,比如相关资源下载地址 URL、存储路径、以及下载线程数等。 由软件发送 HTTP 消息请求,然后服务器根据请求返回响应消息。 确认无误就可以启动线程开始下载资源。 将缓存中存储的数据最终存储到目的存储路径。 下载任务顺序图如图 4 所示: 图 4下载任务顺序图 第 13 页 共 25 页 下载任务管理主要的是对下载任务进行的一系列操作,包括新建下载任务、批量下载任务、删除任务、清除文件的一些操作。 新建下载任务是是根据用户下载需求来创建下载任务的功能, 用户需要提供下载资源的 URL 地址、选择存储文件的路径、用户希望下载时的线程数、以及存储时的文件名称。 下载软件会根据新建任务栏的信息完成下载任务并且进行监控。 其中选择存储文件的路径可以通过单击浏览按钮来选择存储文件夹。 批量下载的原理和下载任务的原理和相似,只是同时进行多个下载任务。 删除任务和清除文件就是对任务和以下载的文件。 下载任务具体实现 下载任务管理主要是对下载任务进行操作,下载任务中主要包括新建下载任务、批量下载任务、退出任务。 任务管理的结构图如图 5 所示: 图 5下载任务结构图 新建下载任务设计使用 SWT/JFace 中的对话框( Dialog)设计实现,新建下载任务流程图,如图 6 所示:。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。