最近在学习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的下一级包的作用分列如下:
建议阅读顺序 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抱有怀疑态度的朋友再认真读一读代码,也许会有不一样的印象:) |