接著第一篇
的工作,本篇繼續分析種子檔案監聽伺服器的實現細節。
先簡單描述下其工作流程,首先伺服器在
6880
埠處開啟乙個套接字監聽,然後開啟乙個守護執行緒用於處理到來的
「開啟種子檔案列表
」請求,在這個服務執行緒中不斷迴圈讀取來自客戶的請求,對
torrent
檔案列表進行解析。如果此時
azureus
的各個元件都已經建立完畢,則說明
azureus
的核心處理元件可用,則直接對
torrent
檔案列表進行處理,否則,先將
torrent
檔案列表加入種子檔案佇列中,等到各個元件建立完畢後再來處理種子佇列中的各個種子檔案。
下面來檢視其源**,先看其成員變數:
private
serversocket socket;
//伺服器套接字
private
intstate;
//伺服器當前狀態
private
boolean
bcontinue;
//服務執行緒是否繼續執行
public
static
final
intstate_faulty =0
;//錯誤狀態
public
static
final
intstate_listening =1
;//監聽狀態
protected
list queued_torrents
=new
arraylist();
//待解析種子檔案佇列,這裡並沒有考慮同步互斥的問題
protected
boolean
core_started
=false;//
核心處理元件是否已經啟動
在其建構函式中完成伺服器的建立和啟動:
socket
=new
serversocket(
6880
, 50
, inetaddress.getbyname(
"127.0.0.1
"));
//nolar: only bind to localhost
state
=state_listening;
//設定伺服器狀態為「監聽」 而在
pollforconnections
中為azureus
新增了乙個生命週期***,這樣當其所有元件完成時就會通知此***,而後者會呼叫
openqueuedtorrents
方法,對待解析種子檔案佇列中排隊的種子檔案進行處理,此外,這個方法中還建立了乙個守護執行緒用於處理到來的開啟種子檔案列表請求,實際的處理工作在
pollforconnectionssupport
方法中完成:
public
void
pollforconnections(
final
azureuscore azureus_core )
}});
if( socket
!=null)};
t.setdaemon(
true
);t.start();
//啟動執行緒}}
這裡執行緒的中斷採用設定執行標誌的方式,我覺得這並不是乙個很好的解決方案,因為若執行緒要完成的工作十分耗時,則執行緒的中斷就不能立即見效。更好的辦法應該是
interrupt
方法和中斷標誌混合起來使用。
private
void
pollforconnectionssupport(azureuscore azureus_core)
logger.log(
newlogevent(logid,
"main::startserver: decoded to '"+
debug_str +"
'"));processargs(azureus_core,args);
//處理解析出的種子檔案列表}}
}sck.close();
}catch
(exception e)
finally
catch
(exception e) }}
} 在種子檔案列表解析成功後,對其處理要分情況考慮,若處理核心還未啟動,則將其加入種子佇列中排隊等待,否則直接對其解析處理。
try);//
加入種子檔案佇列中
queued
=true;}
}finally
if(
!queued )
具體的處理工作由
handlefile
完成,其中呼叫了
opentorrent
方法來開啟種子檔案,具體的種子檔案解析見
第二篇文章。
protected
void
handlefile(azureuscore azureus_core,string file_name,
boolean
open )
else
else}}
catch
(throwable e)}
當azureus
生命週期來到各個元件都建立完畢時,會通知其監聽者,從而呼叫
openqueuedtorrents
方法來處理排隊中的種子檔案
protected
void
openqueuedtorrents(azureuscore azureus_core )
finally
//處理種子佇列中的種子檔案
for(
inti=0
;i<
queued_torrents.size();i++)
}
Azureus原始碼剖析(四)
aethread只是乙個簡單的執行緒類,提供乙個抽象方法runsupport 供我們重寫,相必之下,aethread2有幾個改進的地方 1 加入了執行鎖機制,執行執行緒和等待執行緒的結束這兩個操作需要爭搶執行鎖,若鎖未放開,則說明執行緒還在執行,必須等待鎖的釋放。2 設定了乙個守護執行緒鍊錶,若待建...
Azureus原始碼剖析(四)
aethread只是乙個簡單的執行緒類,提供乙個抽象方法runsupport 供我們重寫,相必之下,aethread2有幾個改進的地方 1 加入了執行鎖機制,執行執行緒和等待執行緒的結束這兩個操作需要爭搶執行鎖,若鎖未放開,則說明執行緒還在執行,必須等待鎖的釋放。2 設定了乙個守護執行緒鍊錶,若待建...
原始碼剖析 Hashtable 原始碼剖析
hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...