美文网首页
简述火箭下载器的代码设计

简述火箭下载器的代码设计

作者: 程序员吉森 | 来源:发表于2019-12-16 15:29 被阅读0次

    总想用java做点独特的东西,最近入了下载工具的坑,打算用java写一款下载工具,研究了一段时间,在此记录下开发此工具过程中遇到的一些问题,以及解决的方案。有些问题仍在摸索过程中,各位有兴趣的可以一起研究。

    项目地址:https://github.com/lhing17/rocketDownloader.git,欢迎PR和issue。

    这款工具是在几个月之前构思并开始动手尝试的,但是中间工作比较忙,就搁置了一段时间,最近稍微轻松一点,决定把之前的坑继续填下去。入坑之前,对下载可以说一无所知。入坑之后,随着不断地深入研究,思考和调查了一些问题,对整个下载工具逐渐有了一个完整的概念。

    首先聊聊什么是下载。其实这是一个众所周知的概念,下载就是把服务器上的东西“拿”到本机上来。从程序的角度来讲,就是客户端和服务器之间建立起连接,然后客户端向服务器请求数据,服务器不断将要下载的数据发送给客户端 。根据客户端和服务端建立连接的方式不同,又分为http下载、ftp下载等。由于传统服务器下载对服务器压力大,近些年又诞生了P2P(Peer to Peer)下载,即点对点下载,每个人都充当服务器和客户端 ,互相分享数据。当然后面出于安全性等方面考虑,又出现了DHT等去中心化的协议,这个后面再慢慢聊。总之,下载的核心原理就是通过某种协议和互联网上某台或多台计算机建立起联系,并进行数据索取。

    说完下载相关的内容,我们来聊一下下载工具的设计。根据面向对象的原则,我们将下载过程中所需的各个组件分解成程序中的对象,每个对象实现下载流程中的一部分功能。

    1. 作为一款下载工具,我们可能需要一个图形化界面。由于java做GUI(用户图形界面)是弱项,我们将勉为其难地使用Swing画一个粗糙的界面。因此我们设计了一个DownloaderSwing类,作为GUI的入口类,所有图形化界面相关的代码将从这个类进行拓展。由于GUI不是我们的重点,这里仅简单叙述。

    2. 我们需要一个对象对整个下载流程进行调度,因此设计了DownloadManager这个接口,作为全局下载管理器。此接口抽象了所有下载的方法,供GUI层进行调用。对于DownloadManager接口,我们提供了DefaultDownloadManager这一实现类,并将此类设计成单例模式。DownloadManager提供的功能主要包括开始下载、暂停下载、继续下载、删除下载任务、实现全局配置、获取下载过程中各种元数据,前面几个下载任务相关的功能根据需要又分为单任务操作和全部任务操作。

    3. 由于实际下载过程是基于具体下载任务的,我们抽象出了Mission接口,代表实际下载过程中的一个下载任务,根据下载任务本身属性的不同,我们分别提供了HttpMission、BitTorrentMission以及MagnetMission等实现类。Mission接口提供了具体任务开启、暂停、继续和下载和获取元数据的功能,DownloadManager中对任务的操作实际上是由Mission具体完成的。

    4. 由于任务的元数据种类比较多,我们将这些元数据封装成了MissionMetaData类,方便对元数据的整体访问和赋值。涉及的元数据包括下载文件的大小、目标文件夹、目标文件名、下载状态、下载进度文件 、唯一标识、速度、已下载字节数和开启线程数等。

    5. 为了实现断点续传,我们在下载过程中会不断记录实际下载的情况,包括每个线程下载块的起始位置、已下载大小等,并将这些信息封装到DownloadInfo类中。为了防止信息丢失,在下载过程中,DownloadInfo对象中的信息会不断以json的格式持久化到文件中。

    以上就是整个下载工具的核心组件,剩下的难点在于各种不同下载方式的实现细节处理,目前正在啃BT下载这块,等有了具体的实现方案再进行分享。

    相关文章

      网友评论

          本文标题:简述火箭下载器的代码设计

          本文链接:https://www.haomeiwen.com/subject/tfcdnctx.html