刚运行了 Azureus ,给我的感觉是这界面真不象是Java 写的,发誓看完这套代码!

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

时间: 2024-11-03 03:09:56

刚运行了 Azureus ,给我的感觉是这界面真不象是Java 写的,发誓看完这套代码!的相关文章

java代码-急求java高手,帮忙看下面的游戏代码,为何只能运行界面类然后其他都看不见也不能玩

问题描述 急求java高手,帮忙看下面的游戏代码,为何只能运行界面类然后其他都看不见也不能玩 //子弹Bullet类 package hy; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; public class Bullet { //坐标 public int x,y; //子弹大小 public int width,height; //子弹杀伤力 public int kill; //速度

最近几天把马士兵的 基础语法,面向对象视频看完, 感觉晕呼呼的

问题描述 哎呀小弟不才呀刚接触java最近几天把马士兵的基础语法,面向对象视频看完,感觉晕呼呼的大家帮找找方向 解决方案 解决方案二:这个是很基础的问题,如果这关过不了,以后的东西都不能进行,怎么谈方向啊,只有把基础学扎实了,后面才会好学,到时候,你再问这个问题也不迟啊?解决方案三:这个道理我也了解所以现在找基础呀,主要有没有学习的方法借鉴一下解决方案四:呵我正在看解决方案五:再看一遍就过吧,自己编几个小代码,自己写代码要比看教程印象深.加油,和你一起奋斗在java的战线上!解决方案六:引用2楼

求助:写了个简单的python通信窗口,为什么刚运行一会就会崩掉呢?

问题描述 求助:写了个简单的python通信窗口,为什么刚运行一会就会崩掉呢? 代码如下,不知道为什么会崩,在线等大神解答: # -*- coding:utf-8 -*- # file : server.py from PyQt4 import QtGui, QtCore import sys import socket import threading class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__

visual studio-用Visual Studio,网页在浏览器中无法运行(错误提示看不懂)?代码和运行截图如下。

问题描述 用Visual Studio,网页在浏览器中无法运行(错误提示看不懂)?代码和运行截图如下. 用Visual Studio设计的一个网页,为什么在浏览器中无法运行(错误提示看不懂)?代码和运行截图如下. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Feedback.aspx.cs" Inherits="tushu.Feedback" %&g

网站开发-java写的网页,服务器端运行的是什么运行程序

问题描述 java写的网页,服务器端运行的是什么运行程序 php写的网页,服务器端运行的是什么运行程序 服务器端肯定要装jre或者装php,那服务器程序是什么 解决方案 通过访问Tomcat服务器跳转到你想要的界面,例如你的工程为"BookStore",那么你访问的应该是"http://localhost:8080/BookStore".

java网络编程-Java写了个简单的网络编程程序,运行没有结果,求解谢谢!

问题描述 Java写了个简单的网络编程程序,运行没有结果,求解谢谢! import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import ja

语言-新手求帮忙看下这段代码的数据溢出问题,没有C币理解下(我是在CodeBlock10.05下运行的)

问题描述 新手求帮忙看下这段代码的数据溢出问题,没有C币理解下(我是在CodeBlock10.05下运行的) #include #include #include unsigned int Ex_secret[30]={11,4,120,75,170,204,90,59,78,49,//用0~255的数表示8位2进制,一共240位 148,248,190,137,0,9,17,91,174,105,45,124,177,205,57,97,194,155,120,36}; unsigned in

效果-java线程问题(是否可将部分代码设置在后台运行一段时间)

问题描述 java线程问题(是否可将部分代码设置在后台运行一段时间) 我想要的效果是我在下载文件时显示下载进度条, 并在下载完成后弹出提示框询问是否安装! 实际上是一开始下载时询问的提示框就和进度条一起出现了, 并且进度条显示到30%多的时候会突然降为0, 然后一段时间后再增加,所以进度条总是无法显示到100% 解决方案 你把界面和下载线程分开就好了,然后通过线程向外面传参数 解决方案二: 这是我积累的一些java项目源码 你可以参考参考 不过有点基础http://download.csdn.n

c++-新手,刚看完C++primer plus ,接下来看哪一本书或做什么哩

问题描述 新手,刚看完C++primer plus ,接下来看哪一本书或做什么哩 新手,刚看完C++primer plus ,接下来看哪一本书或做什么哩 解决方案 记得我小时候学basic,那时候很有兴趣,我会找各种不同的书来看,虽然大部分内容都是重复的,但是还是乐此不疲. 20年过去了,我到现在为止甚至可以背出书上的程序. 解决方案二: 这又不是小说书,看完了就拉倒了.写个程序试试看看你会了没有. 比如最简单的,http://hero.csdn.net/ 里面随便找个题,看看能不能做. 解决方