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

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

  1. BT源代码学习心得(三):种子文件的编码方式 -- 转贴自wolfenstein (NeverSayNever)

    BT源代码学习心得(三):种子文件的编码方式 author: wolfenstein BT的作者使用了一种比较简单易懂的编码方式来对设计种子文件.这种编码方式能够很简单得对python中的各种数据类型 ...

  2. BT源代码学习心得(五):统一网络服务接口--RawServer -- 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(五):统一网络服务接口--RawServer author:wolfenstein 以后的部分都需要网络服务(种子文件的生成在本地就可以完成,但是通过这些种子文件下载实际的内容和提 ...

  3. BT源代码学习心得(二):程序运行参数的获取 -- 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(二):程序运行参数的获取 发信人: wolfenstein (NeverSayNever), 个人文集 标  题: BT源代码学习心得(二):程序运行参数的获取 发信站: 水木社区 ...

  4. BT源代码学习心得(十五):客户端源代码分析(下载过程中的块选取策略)

    BT源代码学习心得(十五):客户端源代码分析(下载过程中的块选取策略) 发信人: wolfenstein (NeverSayNever), 个人文集 标  题: BT源代码学习心得(十五):客户端源代 ...

  5. BT源代码学习心得(九):客户端源代码分析(图形界面浅析) -- 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(九):客户端源代码分析(图形界面浅析)  author:wolfenstein 客户端将从btdownloadgui.py开始进行分析,这样可以顺便把Python中的GUI编程也看 ...

  6. BT源代码学习心得(十三):客户端源代码分析(对等客户的连接建立及其握手协议)

    BT源代码学习心得(十三):客户端源代码分析(对等客户的连接建立及其握手协议) 发信人: wolfenstein (NeverSayNever), 个人文集 标  题: BT源代码学习心得(十三):客 ...

  7. BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) -- 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) author: wolfenstein (NeverSayNever) 上次我们分析了Tracker类初始化的 ...

  8. BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化) -- 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化) author:wolfenstein Tracker在BT中是一个很重要的部分.这个名词我注意到以前的文章中都是直接引用,没 ...

  9. BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) - 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) author: wolfenstein 通过上一次的分析,我们已经知道了Tracker采用http协议和客户端通 ...

最新文章

  1. 周志华:“数据、算法、算力”,人工智能三要素在未来还要加上“知识”
  2. 握手失败_拜托了,看完这篇别再问我什么是TCP三次握手和四次挥手
  3. Android Support 包里到底有什么
  4. c++可视化开发_页面可视化配置搭建工具技术要点
  5. python3打包exe_[求助]入坑学习python 需要装pyinstaller打包成exe
  6. 图文:关于进程与线程,我看过最通俗的解释!
  7. 基于Asp.Net Core打造轻量级内部服务治理RPC(一)
  8. 2007年上半年软件测试_洪恩教育成功登陆纽交所,上市首日大涨超33%!成2020年首家美股上市的中国教育公司...
  9. .NET 项目开发总结
  10. (6)css常用样式属性--文字样式
  11. Android 动画
  12. Word自动给图片编号
  13. dijkstra 路径搜索算法的c++简单实现
  14. python barplot宽度,如何在seaborn barplot上设置宽度
  15. SpringCloud学习笔记7——初级篇之服务降级
  16. 【CAR笔记1】标定的标准——ASAP和ASAM
  17. Netty的深入浅出--79.Netty官方Reference Counted Objects文档说明
  18. Java编程——杨辉三角(一)
  19. jQuery功能简述
  20. 基于单片机智能窗帘无线遥控控制设计(毕业设计)

热门文章

  1. mfs文件服务器,MFS分布式文件系统搭建
  2. 用js做一个简单的秒表计时器
  3. air dots 配对_AirDots 使用分享
  4. Tensorflow小白实战系列
  5. HTML5隐藏图片代码,HTML5终极备忘大全(图片版+文字版)
  6. 跳转饿了么小程序、跳转美团小程序、获取小程序路径、小程序生成小程序码不能选择第三方小程序、领红包功能开发(附源码)
  7. 《四世同堂》金句摘抄(十)
  8. 有没有国产能匹配MSP430单片机的啊
  9. Newton-Raphson切线法解高次方程近似根
  10. 步行导航地图认知特点文献摘要