BT源代码学习心得(十):客户端源代码分析(相关对象一览) -- 转贴自 wolfenstein (NeverSayNever)

BT源代码学习心得(十):客户端源代码分析(相关对象一览)
Author:wolfenstein(NeverSayNever),
BitTorrent/download.py中的Multitorrent对象能够开始实际的下载任务。要开始下载,需要创建一个Multitorrent对象,然后反复得调用start_torrent方法开始一个新的下载,调用这个方法时必须已经准备好相应的下载任务的信息作为参数,包括已经处理好的元信息(经过BitTorrent/ConvertedMetainfo.py模块进行处理),配置信息,一个实现了FeedBack接口的类(这样种子在下载的时候状态发生变化可以及时反映出来,至于是反应在文字信息上还是在图形界面上那就看这个FeedBack接口的实现),以及保存种子文件内容的本地目录。这个函数会返回一个_SingleTorrent对象,代表一个单一的种子文件下载任务,这个对象前面的一条短线代表它是私有对象,不能单独创建,只能通过start_torrent来进行创建。它除了使用FeedBack接口来反应状态变化以外,还可以允许界面模块主动地调用_SingleTorrent.get_status来获取关于该种子文件下载状况的一些统计信息。当然不要忘记调用multitorrent.rawserver.listen_forever()开始这一切的调度,在创建multitorrent类时,它会在内部创建一个rawserver。
前面几次都是直接上来就通过流程来分析程序,但是这次不一样,因为客户端的程序结构比较复杂,而且各种对象之间互相关联,必须先对这些对象的功能有一个大致的了解才好继续分析,因此这一次将简要得介绍一下客户端的下载程序中牵涉到的主要对象。
Multitorrent:下载任务管理的主对象,定义于BitTorrent/download.py中,内部维护了一个RawServer,且可以创建_SingleTorrent(与其定义于同一模块中。)它内部还维护了其它对象。
SingleportListener:管理网络连接,是Multitorrent中的RawServer的网络连接处理对象,定义于BitTorrent/Encoder.py中。
FilePool:管理文件池,定义于BitTorrent/Storage.py中,它可以保证同一时刻打开硬盘上的文件数量在一个限定的值以内。
RateLimiter:速度限制类。定义于BitTorrent/RateLimiter.py中,它可以控制全部种子文件下载时上传的速度。
Storage和StorageWrapper:储存管理类。定义于BitTorrent/Storage.py和StorageWrapper.py中,它们的作用是对程序的其它部分屏蔽掉种子文件中第几块对应于实际硬盘上的哪个文件的偏移量多少。即它对程序的其它部分提供诸如以下的这些服务,确定现在本地有第几块,没有第几块;应其它部分要求读出第几块(其它程序就不用管第几块实际上是硬盘上的那个文件),然后它们好发送到网络上;其它部分从网络上得到一块新的数据,叫它存储到硬盘上。Storage和StorageWrapper都和_SingleTorrent一一对应。
Choker:阻塞管理类。定义于BitTorrent/Choker.py中,它的作用是确定上传的阻塞策略,即当前的连接中,阻塞哪些连接。与_SingleTorrent一一对应。
Measure:速度测量器。定义于BitTorrent/CurrentRateMeasure.py中,它的作用是计算速率。在_SingleTorrent中定义了若干Measure对象来计算各种速率(如上传,下载等)。
RateMeasure:也是速度测量器。定义于BitTorrent/RateMeasure.py中,和Measure不一样的地方在于它可以在初始化的时候传入一个表示还剩多少字节的参数进去,因而它多了一个功能,那就是根据当前的速率,估算出预计剩余时间。_SingleTorrent中定义了一个RateMeasure。
PiecePicker:块选取器。定义于BitTorrent/PiecePicker.py中,进行“下一块下载哪块”这件事情的决策工作,与_SingleTorrent一一对应。
Downloader:下载工作管理器。定义于BitTorrent/Downloader.py中,管理该种子任务中的所有下载工作。因为一个种子文件的下载过程中要和很多个对等客户打交道,因此需要建立若干个连接。与_SingleTorrent一一对应。Encoder:连接管理器。定义于BitTorrent/Encoder.py中,管理该种子文件任务中的所有连接(不管是主动连接到其它对等客户上或者是其它对等客户连接到本地),与_SingleTorrent一一对应。
Connection:连接。定义于BitTorrent/Connecter.py中,一个该对象对应于一个连接。因此一个_SingleTorrent中包含了若干个Connection对象(由Encoder负责统一管理)。
SingleDownload:单一下载。定义于BitTorrent/Downloader.py中,对应一个连接中的下载。它与Connection一一对应,且由Downloader对象产生(Downloader.make_download),每次新的连接建立时,Encoder都会把这个连接保存起来,并且产生一个SingleDownload对象。
Upload:单一上传。定义于BitTorrent/Downloader.py中,对应于一个连接中的上传。和SingleDownload一样,它与Connection一一对应,每次新连接建立时,由Encoder产生。
Bitfield:位图对象。定义于BitTorrent/bitfield.py中,用来表示一个比特数组。它典型用途是表示当前的种子文件的下载过程中,本地有第几块,没有第几块。出现在两个地方,StorageWrapper,储存本地的块拥有情况信息,以及SingleDownload中,储存别人的块拥有情况信息(以方便决定以后是不是要从他那里下载)。Rerequester:跟踪请求发生器。定义于BitTorrent/Rerequester.py中,作用就是和跟踪服务器打交道,来获取对等客户的信息。与_SingleTorrent一一对应。
DownloaderFeedback:下载任务状态信息搜集器。定义于BitTorrent/DownloaderFeedback.py中,它提供了搜集下载任务的状态信息的接口,可以完成状态信息的搜集以显示给用户。图形界面程序或者其它的界面程序在调用_SingleTorrent的搜集信息函数时,最终还是要和该对象打交道(可以参阅_SingleTorrent.get_status函数的实现)。与_SingleTorrent一一对应。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值