计算机专业毕业论文)基于java的http断点续传的设计与实现内容摘要:

MVC模式图 (1) 由于本系统不是 WEB 编程所以页面部分就没有用到 JSP,用 swing 图形界面所代替, 那么怎样来实现 MVC 编程呢。 系统 MVC模型图 (2) 下面 以 系统 中的 Dilog 包来 举个列子来说明这个问题: 这是一个 Control 类 : package。 import。 public class StartDialog { private final DialogActionImpl dilogAction = new DialogAction()。 private final DialogGUIImpl dilogGUI = new DialogGUI()。 public StartDialog(JTable table) { (dilogAction)。 (table)。 } public void showDialog() { ()。 } public void setTable(JTable table) { SWING 包 中 的 类 , 例 如JButton,Jtable之类 实现包含 SWING 包的类 并实现了一个连接到 Controler 类的接口 连接到 Controler 类的接口,包含了获取 SWING包的类 功能性代码 实现功能代码并实现了一个连接到 Controler类的接口 连接到 Controler 类的接口,并能提供功能代码 这个是一个 Controler 类他的作用是负责把图形界面和功能性代码结合到一起,使之形成一个完成的模块,实现了可插拨似接口 以接口为基础连接Controler 以接口为基础连接Controler (table)。 } } 其中的 dilogAction 和 dilogGUI 都是一个接口 根据 JAVA 的多态性,使得可以用子类来赋值这两个变量 ,那么上面的 MVC 模式变可实现。 下面再看 DialogGUIImpl这一个类中的 addActionLiionner(dilogAction)方法。 public void addLiionner(final DialogActionImpl dilogAction) { (new ActionListener() { public void actionPerformed(ActionEvent e) { (impl)。 } })。 (new ActionListener() { public void actionPerformed(ActionEvent e) { (impl)。 } })。 (new ActionListener() { public void actionPerformed(ActionEvent e) { (impl)。 } })。 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { (impl)。 } })。 } 在这当中都是接口实现的功能 ,而且功能性代码已经被抽出到 Action 类当中去了,所以这样在图形编程的时候就不会再花太多时间去编写功能代码,而且能够分工合作,让图形界面和功能代码同步进行。 而且可以使代码变得更加的清晰。 同样可以把 GUI 的工作和功能性代码的工作区分开,达到可插拔的方式方便以后修改功能性代码或者是 GUI的修改 ; 程序 设计原理分析 其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 ,文件名为。 GET / HTTP/ Accept: image/gif, image/xxbitmap, image/jpeg, image/pjpeg, application/ excel, application/msword, application/, */* AcceptLanguage: zh AcceptEncoding: gzip, deflate UserAgent: Mozilla/ (patible。 MSIE。 Windows NT ) Connection: KeepAlive 服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下: 200 ContentLength=106786028 AcceptRanges=bytes Date=Mon, 30 Apr 2020 11:46:21 GMT ETag=W/02ca57e173c11:95b ContentType=application/octetstream Server=MicrosoftIIS/ LastModified=Mon, 30 Apr 2020 11:46:21 GMT 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。 所以在客户端浏览器传给 Web 服务器的时候要多加一条信息 从哪里开始。 下面是用自己编的一个 浏览器 来传递请求信息给 Web 服务器,要求从 1043070 字节开始。 GET / HTTP/ RANGE: bytes=1043070 Accept: text/html, image/gif, image/jpeg, *。 q=.2, */*。 q=.2 仔细看一下就会发现多了一行 RANGE: bytes=2020200 这一行的意思就是告诉服务器 这个文件从 2020200 字节开始传,前面的字节不用传了。 服务器收到这个请求以后,返回的信息如下: 206 ContentLength=106786028 ContentRange=bytes 1043070106786027/106786028 Date=Mon, 30 Apr 2020 11:45:21 GMT ETag=W/02ca57e173c11:95b ContentType=application/octetstream Server=MicrosoftIIS/ LastModified=Mon, 30 Apr 2020 11:45:21 GMT 和前面服务器返回的信息比较一下,就会发现增加了一行: ContentRange=bytes 1043070106786027/106786028 , 返回的 代码也改为 206了,而不再是 200 了。 软件模块设计 功能设计 该软件系统实现了以下的功能:  实现多线程下载,同一个任务可以开启多个线程进行下载。 即在开启任务的时候分配多个线程连接服务器,同时进行分块下载,以实现最大化网络资源的利用度  实现下载中暂停功能,在下载过程中能够暂停任务,并且在下次启动的时候实现暂停位置继续下载的功能,从而使得不再担忧断电或者是突然断网。  实现删除任务功能,删除正在进行的任务或者是已经完成的任务,当不再需要一个下载任务的时候可以通过该功能实现删除  实现下载文 件管理功能,对下载下来的任务进行分类管理,关联到绝对路径 ,使用户可以清晰地看到任务 保存位置。 功能 模块 设计 根据面向对象的思想 和上面的设计模式 把模块分为:图形化界面类,功能模块类,核心类。 包含的类如下图 : 源码结构图 为核心类 包 ,实现 HTTP 断点续传 ,是本系统的核心部分所在,外界向他传输一个变量,那么就可以实现多任务多线程下载 ; 为软件记录数据包,包括下载 数据和软件设置数据 ,数据包主要保存任务的属性,比如开始时间,结束时间,文件长度,名字以及大小 ; 为用户体验对话框 的包, 包括 UI 和功能模块 ,主要包括启动任务,对任务名字进行输入 ,保存地址进行输入 ; 为用户体验主界面的包 ,包括 UI和功能模块 ,主要包括了一个 Tree 树 , 一个显示详细信息的 JTabPanle,一个任务进度显示的 JTable; 为用户体验主界面的菜单 栏包,包括 UI和功能模块, 有新建任务选项 ,点击可开启新建任务 ; 为用户体验主界面的表格包,包括 UI 和功能模块,重新渲染表格的一 列 使其显示 成 JProgress。 的皮肤包,重绘 JButton,Jpanel使图形化更美观。 为界面显示的下载任务和已下载任务列表,通过添加 监听实现表格互相切换。 5. 系统 设计与 实现 多线程任务下载 设计 任务 启动 线程 设计 在 这个包中有的 SiteFileFetch 类是启动任务线程的类,它实现的功能是获取文件长度,判断是否能进行 HTTP 断点续传 ,以及读写文件。 public SiteFileFetch(String url, String fileName, String srcPath, int chunk) { = new DownloadData(url, fileName, srcPath)。 String tmpName[] = (\\p{Punct})。 tmpFile = new File(() + + tmpName[0])。 if (!()) { startPoints = new long[chunk]。 endPoints = new long[chunk]。 try { createFile(false)。 } catch (IOException e) { (创建临时文件出错 )。 } } else { bFirst = false。 readFilePoint()。 } 上面这段代码是为正在进行的任务创建临时信息, 临时信息为总线程数,以及每个线程下载开始和结束的位置,同时通过查找临时文件判断此任务是否为第一次下载。 private void readFilePoint() { try { // 输入 流, 从临时文件中读取指针位置 DataInputStream input = new DataInputStream(new FileInputStream( tmpFile))。 // 读取第一个 int类型数据 ,保存的內容 为 : 起始位置 int nCount = ()。 startPoints = new long[nCount]。 endPoints = new long[nCount]。 for (int i = 0。 i。 i++) { startPoints[i] = ()。 endPoints[i] = ()。 } ()。 } catch (IOException e) { ()。 } catch (Exception e) { ()。 } } 这段代码是读取临时文件夹的信息,以初始化线程,以便分配任务 ,在读取的第一个int 类型数据,表示线程的个数,其后每两个数据为一组,前面的一个数据表示该子线程开始的位置 ,后面的一个数据表示该线程结束的位置。 private void writeFilePoint() { try { DataOutputStream out = new DataOutputStream(new FileOutputStream( tmpFile))。 ()。 for (int i = 0。 i。 i++) { // (nPos[i])。 (fileSplitters[i].getStartPoints())。 (fileSplitters[i].getEndPoint())。 } ()。 } catch (IOException e) { ()。 } catch (Exception e) { ()。 } } 这是向临时文件中写数据 的函数, 根据上面的读取函数可以知道,第一个 writeInt(),是向文件中写入线程数,也就是 startPoints的数组长度, 后面的 for 循环是把每个位置的数据中的指向位置写到文件中去。 同时这个类 实现了 Runable 接口,那么这样就可以做为线程任务,开启多个任务。 其Run()函数的内容为: public void run() { boolean erro = false。 boolean isHTTP = true。 if (bFirst) { /。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。