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
一一对应。