BT源代码学习心得(十):客户端源代码分析(相关对象一览) 转自CSDN:gushenghua的专栏
发信人: wolfenstein (NeverSayNever), 个人文集
标 题: BT源代码学习心得(十):客户端源代码分析(相关对象一览)
发信站: 水木社区 (Sat Aug 13 11:34:58 2005), 文集
标 题: BT源代码学习心得(十):客户端源代码分析(相关对象一览)
发信站: 水木社区 (Sat Aug 13 11:34:58 2005), 文集
(本文包含HTML标记,终端模式下可能无法正确浏览)
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(与其定义于同一模块中。)它内部还维护了
其它对象。
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一一对应。
对象,定义于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一一对应。
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一一对应。
_SingleTorrent的搜集信息函数时,最终还是要和该对象打交道(可以参阅
_SingleTorrent.get_status函数的实现)。与_SingleTorrent一一对应。