最近在学习p2p方面的知识,所以有了分析p2p软件源码的冲动啊!
呵呵,其实我看 azureus 有两个原因,一是他是java 写的,而emule是c++写的,我对c++不是很熟悉,
怕理解上没有 azureus 理解上来的快, 二是看crmky 的blog 上有对 azureus 的分析,他说不错,恩,那就
瞧瞧啦!,呵呵
crmky 对 azureus 的评价如下:
读azureus源码
因为要构架公司的p2p框架,所以想先阅读已有的java p2p软件代码,看看有什么可借鉴之处。头一个值得借鉴的就是azureus了,非常成功的bt下载软件,而且我们要实现的功能和bt也差不了多少,可以说就是bt流媒体版:)。
在看azureus代码过程中还有一些趣事,一些朋友跟我说不要看azureus代码了,说写的很差的;我们头也说azureus中interface太多,他不喜欢……不过我看了部分后发现,azureus代码写的蛮好的。interface也不多,倒是实现写的太紧密了,一个实现洋洋洒洒的千几行代码,要是没有interface的定义,我估计会看晕掉。并不是说azureus代码中没有问题,但是我相信和我说azureus代码写的差的那位朋友没有仔细看过它的代码,总之开卷有益,我是从它的代码中学到了不少:)
我主要看的是org.gudy.azureus2.core3包,plugin包和ui包我都忽略掉了,并且主要研究其构架,实现并未细看。org.gudy.azureus2.core3的下一级包的作用分列如下:
category,分类管理,体现在界面上显示为右上角的一排按钮,可以按照不同类别将bt种子分类 config,配置管理,运行时维护内存中所有配置信息,并能持久化 disk,磁盘管理,可以进行异步或同步i/o请求 download,下载管理,每个bt下载对应其中一个downloadmanager global,全局管理,管理所有的bt下载,即管理所有downloadmanager html,html下载和分析,似乎主要用于判断软件是否需要更新 internat,国际化处理 ipchecker,检查ip,似乎主要用于判断nat的外部ip地址 ipfilter,ip过滤,用于黑名单 logging,日志处理 peer,节点管理,bt下载是从多个节点下载 security,安全管理,用ssl加密来保证安全性 stats,统计管理,将统计信息记录入磁盘 torrent,torrent文件解析 torrentdownloader,torrent种子文件下载,体现在界面上为文件–>打开–>url,从网络直接下载到硬盘上 tracker,与bt tracker通信 util,工具类 xml,xml处理相关工具类
建议阅读顺序
azureus文档中并没有建议开发者按什么顺序去理解azureus的构架和代码。我个人的看法是先看util包,稍做理解后可阅读global包,再看download包,再阅读其余相关包。因为azureus的结构是一个globalmanager管理多个downloadmanager,每个downloadmanager关联到一个diskmanager,一个peermanager。
亮点
util.systemtime,用独立线程读取系统时间,并判断系统时间是否进行回调过,进行记录。不过只是在日志中记录该变化而已,并未做出处理。可以考虑扩展该类,保证从程序启动以来系统时间都是往前增加。(否则在平均速度计算等方面,由于时间回调可能导致一些异常发生)
util.average,求平均速度。
util.debug,记录日志时要得到是哪个类调用该类,可以抛出一个异常并捕捉该异常,得到其调用序列。
util.directbytebufferpool,运行时捕获outofmemoryerror,做一些内存清理工作,比如移除一些缓存,如果再不行,则抛出异常;初始化时将map中所有key/value放置好(value是一个集合),这样运行时该map为只读状态,可以不用同步访问。(改变的只是map中value集合而已)
disk,该包实现了可以将i/o操作队列化,可以用一个异步的方式进行,因此可以将所有i/o操作放到一个线程中。比如一个写请求,可以添加到一个写的队列中,写入完成时已一个事件通知。
azureus是一个考虑非常细致的程序,连systemtime这个类都出来了,让我不得不佩服它设想的周到;某些我看不太懂的地方,我愿意相信是我的水平不够,没能够理解作者的设计意图。azureus是一个写的很不错的程序,希望对azureus抱有怀疑态度的朋友再认真读一读代码,也许会有不一样的印象:)
