Skip to content

Latest commit

 

History

History
222 lines (130 loc) · 8.73 KB

需求规格说明.md

File metadata and controls

222 lines (130 loc) · 8.73 KB

需求规格说明

2022.1.14 文档完成

2022.1.16 更新类图和类间关系

2022.1.17 更新类图和类间关系

2022.1.21 根据第二次需求内容更新用例图、类图及相关文档

2022.1.27 根据实际内容对设计进行更改

2022.2.7 根据实际内容对设计进行更改

1、概述

  1. 第1阶段 实现单个文件的下载功能

    可以通过参数指定要下载的文件地址,下载的并发线程数(默认线程数为8),存放文件的地址(默认为当前目录)。

    包括以下参数:

    --url URL, -u URL                URL to download
    --output filename, -o filename   Output filename
    --concurrency number, -n number  Concurrency number (default: 8)
    

    注意:并不是所有网站都支持多线程并发下载,需要先进行检测。

    第2阶段 实现批量多协议文件下载功能

    指定下载地址时

    • 可以在参数中指定多个要下载的文件地址,即允许使用多个url参数
    • 可以将这些地址放入一个文本文件中,指定从该文件中读取。参数
    --input filename, -i filename filename with multiple URL
    
    • 支持使用正则表达式来生成多个下载地址,

    同时,除支持http/https协议外,也能够支持如ftp, bittorrent,磁力链等。

2、用例建模

2.1 用例建模图示

example.drawio_2.0

2.2 用例文档说明

用例图综述

​ 多线程下载软件通过用户的基础设置之后自行进行工作,若是对单个文件进行下载,用户需要设置下载链接、多线程启用的线程数、以及文件的存放位置和名字三项,其中,如果是通过种子文件下载,则不需要设置下载链接,而需要设置种子文件的位置;若是对多个文件进行下载,用户需要指定多个下载链接、多线程启用的线程数、以及文件的存放位置,或者将多个下载链接存于文件,指定文件位置。软件内部按照用户设定的方式,完成文件的下载,若服务器不支持多线程下载会使用单线程完成,无法下载会告知用户。

参与者描述

​ 我们这里将使用者命名成用户,用户使用该软件的下载功能

用例描述1:用户直链下载

用例名称:下载1

基本事件流:用户完成基础设置,多线程并发下载链接中的文件

扩展事件流:服务器不支持多线程下载则使用单线程下载,链接不可下载则告知用户

前置条件:用户完成基本设置

后置条件:下载可行性及方式判定

异常:链接无法下载

用例描述2:用户FTP下载

用例名称:下载2

基本事件流:用户完成基础设置,多线程并发下载ftp服务器上的文件

扩展事件流:服务器不支持多线程下载则使用单线程下载,链接不可下载则告知用户

前置条件:用户完成基本设置

后置条件:下载可行性及方式判定

异常:链接无法下载,用户名或密码错误,服务器没有响应

用例描述3:用户Torrent下载

用例名称:下载3

基本事件流:用户完成基础设置,多线程并发下载其他peer上的文件

扩展事件流:没有可用的下载源

前置条件:用户完成基本设置

后置条件:下载可行性及方式判定

异常:没有可用的tracker,没有可用的peer

用例描述4:用户Magnet下载

用例名称:下载4

基本事件流:用户完成基础设置,将Magnet文件转换为Torrent文件,多线程并发下载其他peer上的文件

扩展事件流:没有可用的下载源

前置条件:用户完成基本设置

后置条件:下载可行性及方式判定

异常:没有可用的tracker,没有可用的peer

3、静态建模

3.1 类及类间关系

leitu_2.drawio

其中Torrent的实现比较复杂,我们为它单独设计一个类图

torrent_class.drawio

3.2 类描述

属性 服务
Download 下载链接、线程数、文件名 开始下载文件、设置下载链接、设置线程数、设置文件名
File 文件名、文件大小、文件内容 创建文件,读取内容,写入内容
Protocol.Protocols 连接、获取文件大小,获取文件内容
Protocol.Http 链接地址 连接、获取文件大小,获取文件内容
Protocol.Ftp 链接地址、用户名、密码 连接、获取文件大小,获取文件内容
Bittorrent 链接地址、tracker、peer 连接、获取文件大小,获取文件内容
Protocol.Magnet 链接地址 连接、获取文件大小,获取文件内容
ThreadPool 线程、线程数 执行线程任务
DownloadTask 下载区间 执行下载任务
Block 块开始位置,块结束位置 获取块开始位置,获取块结束位置
SingleDownload Protocol.Protocols、block 开始下载

3.3 关联描述

类名称 类名称 类间关系
File SingleDownload 一对一普通关联
ThreadPool Download 一对一普通关联
Protocol.Protocols SingleDownload 一对一普通关联
SingleDownload Download 一对一普通关联
DownloadTask Download 一对一普通关联
Download Block 一对多受限关联
DownloadTask Block 一对一普通关联
Download DownloadTask 一对多受限关联

3.4 类图文档

类图

见3.1

类图综述

描述了多线程下载器中所包含的初步的类和类间关系

类描述

实体类有File, Download, ThreadPool, Block, Protocol.Http, Protocol.Ftp, Bittorrent, Protocol.Magnet

方法类有Protocals,DownloadTask类

类间的属性和方法见3.2

关联描述

类间关系见3.3

其他描述

4、动态建模

4.1 活动图及文档

活动图图示

(在torrent和magnet模式下是默认支持多线程的)

swimming1.drawio

活动图文档

活动图综述

​ 描述了“多线程下载器”中单个文件下载过程的活动图,涉及Download、Threadpool、File、Protocols四个核心对象,他们共同完成下载的过程

参与者对象描述

​ 参与者User并不在下载的主体逻辑中,只负责启动程序,这里没有画出

​ Download、Threadpool、File、Protocols是对象,Download是总控,负责调用其他对象完成任务,Threadpool负责启动和管理线程,Protocols主要和文件下载链接进行一系列的网络交互,File则是将从报文中收到的内容写入文件

状态描述

​ 由Download发送网址或文件给Protocols判断下载来源的服务器是否可以并发下载,如若可以,通知线程池创建多线程,每个线程都通过Protocols获取下载内容,然后通知File将内容写入文件;若不支持并发,则直接由单线程完成上述过程;若根本不可下载,则告知用户并退出。

转换描述

​ 在该活动中,有一个分支控制,根据服务器对下载的支持情况,选择对应的下载方式或异常处理

其他描述

4.2 torrent部分程序流程图

​ 虽然我们可以把torrent和magnet部分的交互抽象成上面的样子,但是这并不利于我们理解它的程序运行过程,所以这里我们单独为它设计一份程序流程图(magnet可以转换为torrent文件进行下载,所以只作出torrent的流程图设计)

torrent_liucheng.drawio