最近在学习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抱有怀疑态度的朋友再认真读一读代码,也许会有不一样的印象:)