剛運行了 Azureus ,給我的感覺是這介面真不象是Java 寫的,發誓看完這套代碼!
來源:互聯網
上載者:User
最近在學習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,Tlog 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抱有懷疑態度的朋友再認真讀一讀代碼,也許會有不一樣的印象:)