




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
核准通过 归档资料 未经允许 请勿外传 本科毕业设计说明书 论文 本科毕业设计说明书 论文 题目 基于 http 协议的断点续传应用系统开发 9jwkffwvg tym jg t start 在调用 start 方法时 将创建一个新的控制线程 新线程进入可运行状态 它 将向线程调度器注册这个线程 接着它将调用 run 方法 每个线程都是通过某个特定 thread 对象所对应的 run 方法来完成其操作 因 为 run 方法中的代码定义执行线程所需要的功能 所以 run 方法被称为线程体 每个线程都是通过某个特定 thread 对象所对应的 run 方法来完成其操作的 因为 run 方法中的代码定义执行线程所需的功能 所以 run 方法被称为线程体 17 3 4 2java i o 流技术 为了进行数据的输入 输出操作 java 中把不同的输入 输出源抽象表述为 流 stream java io 包中定义了多个流类型来实现输入 输出功能 按照流的方向划分 可以分为输入流和输出流 输入流 只能从中读取字节数据 而不能向其写入数据 输出流 只能向其写入字节数据 而不能从中读取数据 按照流所处理的数据类型划分 可以分为字节流和字符流 节点流 可以从 向 一个特定的 i o 设备读 写 数据的流 节点流也被 称为低级流 浙江工业大学本科毕业设计说明书 论文 20 处理流 用来实现对一个已存在的流的连接和封装 是通过所封装的流的功 能调用实现数据读 写操作的流 处理流也被称为高级流 java io 包支持两种类型的流 包括二进制数据的字节流和包括字符数据的字符 流 在读 写数据时 这两种流以不同方式工作 18 当向字节流写数据时 数据以字 节序列的形式写入流 与它在内存中的形式一样 数据不发生任何转换 二进制数 值只能被写为字节序列 4 个字节构成一个 int 型值 8 个字节构成一个 long 型值等 java 其内部将字节符存储为 16 位的 unicode 码字符 因此每个 unicode 码字符可以 写成 2 个字节的二进制流 先写高 8 位 字符流用于存储和检索文本 而且可以使 用它读取由非 java 程序生成的文本文件 所有二进制数据在写向字符流之前必须转 换为字符流能够接受的表达形式 该形式由原始二进制数据值转换成的字符组成 因此 从包含文本的字符流中读取数据比直接读取二进制数据涉及更多的工作 19 在本系统中 由于下载文件不一定是只包含字符的文本 因此在实现过程中使 用的是更加通用的字节流 在 java io 包中 inputsteam 和 outputstream 类及它们的 子类均表示字节流 并且提供了读 写二进制数据的方法 inputstream 类中包含 3 个 read 方法 用来数据流中读取二进制代码 输入流的基本方法如下 read 这个方法在 inputstream 类中是抽象的 因此它必须定义在子类中 此方 法以 int 型返回流的下一个可读字节 如果到达流的末尾 则方法的返回值为 1 如 果 i o 发生错误 将抛出 ioexception 类型的异常 read byte array 此方法将流中字节读到数组的连续元素中 读出的字节数量 最大为 array length 的值 在读取完输入数据或是检测到流尾时 才从本方法返回 本方法将返回读取的字节个数 或者如果因为到达流尾而没有读取任何字节则返回 1 如果 i o 发生错误 将抛出 ioeception 类型异常 如果传给方法的参数为 null 则 抛出 nullpointerexception 异常 read byte buffer int offset int length 此方法将数据读入一个字节数组 从数组 的 offset 指定的位置开始存放 并用 length 来指定读取的最大字节数 输入流的其他方法如下 void close 关闭流 int available 返回可以从中读取的字节数 long skip long n 在输入流中跳过 n 个字节 将实际跳过的字节数返回 浙江工业大学本科毕业设计说明书 论文 21 boolean marksupported 判断流是否支持标记功能 void mark int readlimit 在支持标记的输入流的当前位置设置一个标记 void 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本章小结 本章对项目本系统需求进行了用户需求分析和系统功能需求分析 并描述了系 统流程及模块划分 而且分析了关键技术和难点 明确了系统的使用对象 大致功 能结构及各个业务系统所需实现的功能等问题 为后续系统设计打下了基础 浙江工业大学本科毕业设计说明书 论文 22 第四章第四章 系统详细设计与实现系统详细设计与实现 4 1系统基本流程 该系统基本流程 如图 4 1 所示 运行程序后 可以在主界面上输入 url 地 址 保存地址也可以在文件菜单中新建一个任务 然后在 url 地址栏中输入 http 地址 用户可以选择需要下载的线程数 程序还提供下载弹出窗体保存位置的选择 而且每当新建一个新的任务时 程序会自动载入默认的存储位置 不需要用户反复 的输入地址 点击确定时 程序将在主界面显示刚刚新建的下载任务 包括了详细 的信息 图 4 1 系统基本流程图 新建完任务后 用户还可以继续添加下载的任务 选中想要下载的任务 可以 多选 点击 开始 按钮 程序将开始任务的下载 当第一次运行程序时 程序将 浙江工业大学本科毕业设计说明书 论文 23 在程序的当前目录下自动新建一个配置文件 该文件名为 globalget init 该配置文件 将记录该程序的默认下载地址和所有上一次的任务下载信息 所以每当用户退出程 序时 程序都会自动保存当前的所有任务下载信息 做到 断点续传 的可视化 当开始一个新的任务下载时 该程序也将自动创建一个新的保存任务下载信息的文 件 该文件用户记录该文件的下载点 也就是实现 断点续传 的保存信息 文件 名以下载的文件名加上 tmp 命名 当该文件下载完成时 程序会自动删除该记录文 件 用户单击 删除任务 按钮可以删除选中的任务 可以多选 单击 新建按钮 将可以新曾下载的任务 4 2系统功能模块设计 本系统分为五个功能模块 分别为下载任务实体类模块 系统工具类模块 线 程下载类模块 下载任务总控制模块 用户界面模块 每个模块的功能在上一章的 系统功能需求分析已经详细介绍过 这里不再重述 4 2 1系统下载功能的实现 按照功能划分 下载过程可以分为两部分 即建立连接并读取待下载文件的信 息 下载文件 由于论文的篇幅有限 涉及到代码只张贴了重点部分 建立连接并获取下载信息 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 println 资源 tmp url 服务器响应错误 浙江工业大学本科毕业设计说明书 论文 24 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 资源 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 myresult 2 return r catch ioexception e2 system out println 资源 tmp 连接错误 r myurl null 浙江工业大学本科毕业设计说明书 论文 25 r myresult 3 return r 它的作用是从下载 url 地址中文件名和文件长度 功能的实现是通过 httpurlconnection 类来完成的 httpurlconnection 实例都可用于生成单个请求 再通过实例调用 getfilename 方法和 getcontentlength 方法来获取文件名大长度 请 求后在 httpurlconnection 的 inputstream 或 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 subthreadcount 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 bufferedinputstream request getinputstream file file1 new file saveposition if file1 exists file file2 file1 getparentfile 浙江工业大学本科毕业设计说明书 论文 26 if file2 exists file2 mkdirs file1 createnewfile file new randomaccessfile saveposition rw catch exception e e printstacktrace 下载文件的实现就是流传递 先根据 url 创建 urlconnection 的实例对象 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 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 方法 把byte字节数组b的数据写到file 里 如上 最后关闭文件流 这样就实现了文件的下载 因为有java io的存在 它 浙江工业大学本科毕业设计说明书 论文 27 里面已经封流输入的方法 只要调用这些方法下载文件数据传输功能就能比较容易 的实现了 4 2 2断点续传功能的设计与实现 本节介绍断点续传的原理及 java 实现断点续传的关键几点 4 2 2 1 断点续传的原理 其实断点续传的原理很简单 就是在 http 的请求上和一般的下载有所不同而已 打个比方 浏览器请求服务器上的一个文时 所发出的请求如下 假设服务器域名为 文件名为 down zip get down zip http 1 1 accept image 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 服务器收到请求后 按要求寻找请求的文件 提取文件的信息 然后返回给浏 览器 返回信息如下 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 服务器的时候要多加一条信息 从哪里开始 下面是用自己编的一 个 浏览器 来传递请求信息给 web 服务器 要求从 2000070 字节开始 get down zip http 1 0 浙江工业大学本科毕业设计说明书 论文 28 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 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 106786028 返回的代码也改为 206 了 而不再是 200 了 知道了以上原理 就可以进行断 点续传的编程了 4 2 2 2 java 实现断点续传的关键几点 用什么方法实现提交 range bytes 2000070 当用最原始的 socket 是肯定能完成的 不过那样太费事了 其实 java 的 net 包中 提供了这种功能 代码如下 浙江工业大学本科毕业设计说明书 论文 29 url url new url httpurlconnection httpconnection httpurlconnection url openconnection 设置 user agent httpconnection setrequestproperty user agent netfox 设置断点续传的开始位置 httpconnection setrequestproperty range bytes 2000070 获得输入流 inputstream input httpconnection getinputstream 从输入流中取出的字节流就是 down zip 文件从 2000070 开始的字节流 接下来 要做的事就是怎么保存获得的流到文件中去了 保存文件采用的方法 我采用的是 io 包中的 randaccessfile 类 操作相当简单 假设从 2000070 处开始保存文件 代 码如下 randomaccess osavedfile new randomaccessfile down zip rw long npos 2000070 定位文件指针到 npos 位置 osavedfile seek npos byte b new byte 1024 int nread 从输入流中读入字节流 然后写到文件中 while nread input read b 0 1024 0 osavedfile write b 0 nread 4 2 3多线程的设计与实现 多线程的控制与实现主要由 downloadfilecontrol java 来完成 该类包含了从配 置文件中读取线程数的方法 读取所有线程的开始点和结束点方法 将下载文件分 割成 subthreadcount 个线程分别启动他们进行下载方法 用户判断当前所有的子线 浙江工业大学本科毕业设计说明书 论文 30 程是否都已经结束方法 关闭子线程下载的文件输出流方法 暂停所有子线程的运 行方法 计算下载了多少字节方法 通过这些方法来控制线程 实现多线程下载 而这个方法将下载文件分割成 subthreadcount 个线程分别启动他们进行下载是最为 重要的 下面介绍这这个方法设计 int filesize request getcontentlength 将下载文件 subthreadcount 等分 得到每块下载的大小 long block filesize subthreadcount 先通过 getcontentlength 方法获取下载文件的大小 再装下载文件 subthreadcount 等分 得到每个下载块的大小 subthreadcount 是线程数 线程数 是在 frame 里输入 downthread new downloadthread subthreadcount downloadinfo object new downloadinfo subthreadcount 设置每个子线程开始下载的指针 for int i 0 i subthreadcount i object i new downloadinfo object i setsavepoint begin begin begin block 生成各个子线程对象 for int i 0 i subthreadcount i if i subthreadcount 1 downthread i new downloadthread i urladdress fileposition object i getsavepoint object i getsavepoint block subthreadcount else downthread i new downloadthread i urladdress fileposition object i getsavepoint filesize subthreadcount 浙江工业大学本科毕业设计说明书 论文 31 启动线程 for int i 0 i downthread length i downthread i start 根据线程数创建相应数量的线程 并且为每个线程创建信息类 downloadinfo 用于保存该信息 用 setsavepoint 方法为每个子线程设置开始下载的指针 然后根 据相应的 url 等信息生成各个子线程对象 最后启动线程 当线程下载完成 就销 毁该线程 该系统在默认的线程数为 3 可设置线程数从 1 到 10 4 2 4文件序列化保存下载信息 序列化就是将对象的状态信息转换为可以存储或传输的窗体的过程 序列化后 可以把信息或对象保存在文件里 当需要用到这些信息与对象就可以从文件在恢复 一个类要具有可序列化的特性就必须实现接口 java io serializable 对于可以序列化 的对象可以用类 java io outputstream 来输出该对象 而且可以用类 java io objectinputstream 来读入该对象 该系统对 downloadinfo java 进行了序列化 可对该类保存到文件 又可以从文 件中恢复 ois new objectinputstream new fileinputstream file defaultsaveposition ois readutf value vector ois readobject taskcount value size system out println taskcount taskcount downloadinfo new downloadinfo taskcount taskvecs new vector taskcount dfc new downloadfilecontrol taskcount for int i 0 i taskcount i downloadinfo i new downloadinfo 浙江工业大学本科毕业设计说明书 论文 32 taskvecs i value get i 以上是在程序开始运行时从配置文件中读取信息 而这些信息是在关闭程序之 前保存在文件里 目的是打开程序能记录程序关闭之前的信息 使程序恢复到关闭 之前的状态 readutf 方法读取下载文件保存的地址目录 readobject 方法读取一对 象 该对象保存是一个向量 里面保存着下载信息 如文件大小 下载 url 下载 进度 线程数等等 通过这些信息就能恢复到关闭程序之前的下载状态 private void savemodel file file new file globalget init if file exists try file createnewfile catch ioexception e e printstacktrace else try objectoutputstream oos new objectoutputstream new fileoutputstream file oos writeutf defaultsaveposition oos writeobject value oos close catch exception e e printstacktrace 如上的方法是在关闭程序之前调用 目的是保存下载信息到文件 打开程序又 可以恢复之前的状态 writeutf 方法把保存下载文件的目录 writeobject 方法把 对象写到文件里 最后调用 close 关闭流 4 2 5系统界面设计 该系统的界面是用 swing 设计实现 swing 是一个用于开发 java 应用程序用户 界面的开发工具包 它以抽象窗口工具包 awt 为基础使跨平台应用程序可以使 浙江工业大学本科毕业设计说明书 论文 33 用任何可插拔的外观风格 swing 开发人员只用很少的代码就可以利用 swing 丰富 灵活的功能和模块化组件来创建优雅的用户界面 界面如图 4 2 图 4 2 系统主界面图 添加下载任务的界面图 4 3 图 4 3 下载任务界面图 浙江工业大学本科毕业设计说明书 论文 34 public static void main string args try 仿 mac 在 windows 下的主题 uimanager setlookandfeel new mcwinlookandfeel catch unsupportedlookandfeelexception e system out println 出错啦 jframe frame new mainframe frame seticonimage toolkit getdefaulttoolkit createimage i gif 为了使界面较为美观 用了一个界面美化的加包 里面有多种外观供选择 在 button 里添加图片 这也能使用界面更加美观 4 3本章小结 本章主要进行了系统的详细设计与实现 首先 根据第三章中需求分析对系统 的基本数据流程进行了介绍 然后 对系统的各个主要功能进行设计实现 下载功 能 断点续传 多线程 文件序列化 最后 简略的介绍了 swing 界面的设计与美 化 浙江工业大学本科毕业设计说明书 论文 35 第五章第五章 系统运行测试系统运行测试 5 1系统测试 测试在系统开发中占据相当重要的一部分 它贯穿着整个软件过程 在系统的 开发过程中 做过单元测试 通过白盒测试的方法验证模块逻辑是否被正确编码 做过集成测试 来测试各模块之间的协调和系统的完整性 在本系统中由于时间等 条件所限 尚未做压力测试 性能测试 容量测试 以下主要统主要功能测试 5 1 1数据正确性测试 数据正确性测试主要是验证数据格式的正确性 通过输入一些非法的数据格式 或者内容 观察系统是否有相应的错误提示 如不在主界面上输入下载地址或存储 目录 就会跳出一个对话框提示 如下图 5 1 图 5 1 url 与下载名缺省提示界面 浙江工业大学本科毕业设计说明书 论文 36 输入错误的 url 地址也会跳出一对话框 如图 5 2 图 5 2 提示对话框界面 5 1 2系统功能测试 功能测试是主要验证所开发的系统是否满足软件需求说明书各方面功能的使用 要求 运行程序如图 5 3 图 5 3 程序运行主界面 在主界面上输入 url 选择目录 如图 5 4 浙江工业大学本科毕业设计说明书 论文 37 图 5 4 文件另存为界面 保存目录后点击新建按钮生成下载任务 如图 5 5 图 5 5 由于在主界面新增下载任务不能设置线程数 那也可点击文件菜单新建任务 里面就可以设置线程数 如图 5 6 浙江工业大学本科毕业设计说明书 论文 38 图 5 6 添加下载任务界面 单击确定后 又新增了一任务 如图 5 7 图 5 7 新增一任务后的界面 选中一任务 单击开始按钮 则任务开始下载 如图 5 8 图 5 8 一任务下载完的界面 浙江工业大学本科毕业设计说明书 论文 39 再选中一任务 单击删除按钮 则任务被删除 如图 5 9 图 5 9 删除一任务的界面 关闭程序 再打开程序 还保存着关闭之前的状态 如图 5 10 图 5 10 再次打开程序界面 5 2本章小结 本章对系统进行测试 主要进行系统的数据正确性测试与功能测试 也介绍程 序的使用 浙江工业大学本科毕业设计说明书 论文 40 第六章第六章 总结总结 经过近半个学期的设计 基于 http 协议的断点续传应用系统已经基本设计完 成 在这几个月的开发过程中 学到了许多有关 java 技术进行应用程序开发的知识 涉及到了多线程技术 网络编程 i o 流技术和 swing 用户界面编程 基本上涵盖 了 j2se 中所有核心技术 达到了综合运用所学过的 java 知识的目的 此外 通过 本毕业设计的开发 让本人深刻体会到 java 语言进行软件开发的优点 明白面向对 象程序设计思想的重要性 从系统设计到系统实现完全遵循面向对象程序设计的思 想 尽量做到程序结构清晰 易于以后的功能扩展和系统升级 在这个毕业设计开发的整个过程中 让我完整的经历了项目开发的方方面面更 深刻地体会到了软件工程规范对程序员的重要性 一个优秀的开发人员 不仅应该 有能力写出高效的算法 还要注意代码编写的规范化 模块的重用性 合理的代码 结构 清晰的代码格式等 不但方便开发者修改代码 而且方便项目的交接 方便 后人在此基础上的改进 而除了代码以外 文档也是软件工程中不可缺少的部分 它起到了类似备忘录的功能 使开发过程中所有的问题有据可依 更是项目维护的 财富库 虽然本次毕业设计只是实现了一些基本的功能 但从软件本身来讲 它距离商 业化应用软件的要求还有一段距离 使用不够人性化 操作不够简便 由于本人的 水平有限 在功能方面也有些不足 没有实现对下载后的文件进行管理功能 没有 实现右击 url 进行下载功能 浙江工业大学本科毕业设计说明书 论文 41 参考文献参考文献 1 王玉兴 赵志强 多线程下载软件系统的设计与实现 j 中国医学装备 2009 6 2 30 31 2 行舟 断点续传和多线程下载 j 程序员 2008 3 5 23 25 3 风之梦 ftp 下载与 http 下载 j 软件 e 刊 2005 6 5 42 43 4 雍俊海 java 程序设计教程 m 北京 清华大
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年航空公司飞机维护员新员工岗位专业知识笔试题目及答案
- 生药学试题试卷及答案
- 高校采购合同模板(3篇)
- 高粱种子买卖合同书模板(3篇)
- 高空施工合同范本售后(3篇)
- 地坪施工与设备租赁综合合同
- 农用土地租赁与农业绿色生产模式合作框架协议
- 汽车制造企业生产线员工招聘与安全生产协议
- 民航气象专业面试题及答案
- 幼师专业考试题及答案
- 海水鱼类增殖放流记录表格、人工标志、增殖放流验收报告
- 室内高尔夫行业分析
- 微商培训的课件目录
- 《农业保险承保理赔电子化作业规范》
- 常见呼吸道传染病课件
- 《影视艺术鉴赏》课件
- 老年心脏病护理课件
- 德国国家概况
- 服装立体裁剪课件
- 整本书读写《一颗遗失的扣子》(课件)三年级下册语文统编版
- 检测室安全操作规程
评论
0/150
提交评论