摘要:該文在分析微軟.NET開發平臺和移動Agent系統基礎上,提出移動Agent系統開發所面臨的三個主要問題,即如何移動代碼、如何執行代碼和如何相互通信等。以一個典型應用開發為例,研究了利用.NET平臺中Remoting、反射等技術實現移動Agent系統開發的技術途徑,簡化了移動Agent系統的開發過程。
關鍵詞:.NET平臺;移動Agent;Remoting;反射
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)34-1627-03
Research on the Development Technology of Mobile Agent System with .NET Platform
ZHOU Xin
(The 28th Research Institute of China Electronic Technology Group Corporation ,Nanjing 210007, China)
Abstract: This Paper analyzes .NET platform and Mobile Agent System (MAS),then points out three main problems of developing MAS, that is how to move,run and communicate the code. With a typical example, this paper researches the development technology of mobile agent system based on .NET Remoting and reflection, which can simplify the usual development process.
Key words: .NET platform; mobile agent; remoting; reflection
1 引言
目前,高級開發語言可分為Java和C#兩大主流陣營,每個陣營又各自推出了J2EE和.NET兩個軟件開發平臺。其中微軟在VISUAL STUDIO基礎上推出的.NET開發平臺,以其豐富的開發資源、友好的開發界面、持續的技術支持、較低的入門要求,主打的C#語言,越發受到廣大程序員的青睞。移動Agent系統由于其代理的移動性,代理的智能化等先進理念,越多越多人們開始關注。專業的移動Agent系統開發環境,如GeneralMagic公司的Telescript、IBM公司的Aglet等,門檻較高,且與主流的編程工具不兼容,一定程度上限制了其普及發展,然而.NET平臺中提供的相關技術可以很方便地構建移動Agent系統,.NET平臺為晦澀難懂、門檻很高的移動Agent系統開發提供了方便之門。
2 移動Agent系統
移動Agent[1]是能夠攜帶代碼、數據及執行狀態在網絡中根據既定的路由在主機間遷移并能夠在新的位置從斷點處繼續執行的程序。而Mobile Agent = Mobile Code + Agent是對移動代理最簡單精確的定義。
不同移動Agent系統的體系結構各不相同,但幾乎所有的移動Agent系統都包括如下三部分:Agent、MAH(代理的宿主) 和MAE(代理的運行環境)。
移動Agent及組成系統概念比較抽象,其實質可以這樣通俗地來理解:系統中的Agent是一些技術精湛的工程師,在這個系統中,有一個技術總部,工程師由此總部培養并向外派遣,這個總部稱之為代理宿主(MAH),工程師們可以攜帶指令和工作要求,按預定的路線到達指定的地點開展相應的工作,完成后向總部報告結果,或待命,或返回,或前進至下一地點展開工作,這里工程師所到展開工作的地點,必須具備相應的條件即提供運行環境(MAE)。移動Agent系統是主動式、分布式、智能式的系統,特別適合于分布式數據采集、網絡監控、科學計算等領域。
3 面臨的問題和解決途徑
1) 移動Agent系統開發面臨的主要問題
在移動Agent系統的開發方面,必須解決三個主要問題:一是代碼如何移動;二是移動的代碼在新的環境中如何編譯生成可執行代碼;三是移動Agent與宿主(派遣代理的主機)如何通信。當然,在實際開發移動Agent系統中還需要考慮更多的事情,如移動的安全性、移動路由選擇等。
2) .NET平臺的解決途徑
.NET平臺除了為程序員提供豐富的框架開發支撐外,有兩項特色技術:Remoting技術[2] 和反射技術[2],特別適合于移動Agent系統的開發。
.NET的Remoting技術是訪問不同應用程序域(AppDomain)中對象的技術,無論該應用程序域位于本地還是遠程,利用該技術可以為Agent、MAH以及MAE之間提供的通信通道,為Agent的移動提供技術保障。
.NET反射技術為創建對象和調用其方法提供了一種動態方法,利用該技術可有效地解決代碼作為一個程序集[2]移動到新的運行環境中被調用和執行的問題。
4 典型移動Agent系統開發實例
4.1 組成功能模型
本文研究的開發實例是一個典型的移動Agent系統,由.NET環境下的三個工程來實現。一是作為服務環境的控制臺進程(工程名為AgentServer)即MAE;二是客戶端控制臺進程(工程名為AgentClient),是代理的發起地即MAH;三是通用類庫(工程名為MobileAgents)。在類庫中,編寫了兩個重要的類:一個是所有移動Agent基類,類名為Agent,另一個類名為AgentHost,可以理解為移動代理的接待類,利用.NET Remoting技術,該類設計成一個遠程對象[2]。
該移動Agent系統至少需要在一臺主機運行客戶端進程,一臺主機上運行服務進程,通用類庫MobileAgents在服務端和客戶端都將被調用,在AgentServer工程執行時,發布遠程對象AgentHost,為移動Agent提供運行環境。AgentClient工程運行時,初始化Agent,調用遠程對象AgentHost,并將Agent移動至服務器進程,并在AgentServer的進程中執行指令。該系統的組成模型、功能及部署運行示意如圖 1所示。在網絡中可以有多個主機運行AgentSever進程。
4.2 具體實現方法
整個工程實例的代碼實現技術如圖2所示。
在AgentClient、AgentServer和MobileAgents三個工程之間主要通過4個引用或派生發生聯系,如圖2所示:一是在AgentClient中建立一個Agent對象,然后調用Move方法,移動到AgentServer進程中,執行指令,實際的MyFirstAgent派生于基類Agent;二是在AgentServer進程中,只是簡單調用MobileAgents中AgentHost遠程對象,并進行發布,從而為Agent運行環境作好準備;三是在Agent基類的Move方法中創建了AgentHost的對象;四是在AgentHost類中HostAgent方法引用了Agent對象,使Agent的Run方法得以運行。
對工程實例中幾個關鍵點說明如下:
1) Agent基類設計
作為所有移動Agent的基類,Agent基類定義成一個抽象類,它具備移動Agent的兩個基本功能:移動和運行,對應著兩個方法:Run 和Move。Run定義成一個抽象方法,以便在子類中繼承并作相應的完善;Run方法是Agent移動到目的地時執行的指令。Move方法包含了系統內部通信的代碼。如圖2所示,在Agent基類的Move方法中調用遠程對象AgentHost實例實現代碼移動,其關鍵是.NET平臺提供的Activator方法,并通過調用HostAgent 執行Agnet的Run功能。在Agent類的開頭加入了[Serializable]標志,以便代碼在移動時,可以被串行化傳輸。
2) AgentHost類設計
AgentHost類是整個系統得以實現的關鍵類,它設計成一個遠程對象,在AgentServer中發布,在AgentClient的Agent中調用。該類采用的通信機制是.NET的Remoting技術,為了實現該系統的Remoting能力,AgentHost中添加了一個初始化的方法,在指定的端口號上,創建了Tcp的通道,(當然也可以使用HTTP協議通道),注冊遠程對象發布的類型為:WellKnownSeverType的SingleCall方式,即服務端激活并為每一個申請的客戶端創建對象,建立統一資源標識。
3) MyFirstAgent的設計
下面是一個簡單的移動Agent實例MyFirstAgent類的完整代碼。它首先獲取創建它的進程名稱,當它運行時,它獲取調用它執行的進程名稱,最后將兩個進程的名稱在控制臺上以格式化的字符進行顯示。通過MyFirstAgent可以有效地測試代碼的移動以及運行的結果,對于所有Agent的子類必須加上[Serializable]標志,以便于在運行后可以被串行化傳遞。
[Serializable]
class MyFirstAgent : MobileAgents.Agent
{ string _startingProcess = string.Empty;
public MyFirstAgent()
{using(Process p = Process.GetCurrentProcess())//獲取本地進程名
_startingProcess = p.ProcessName;}
public override void Run()
{using(Process p = Process.GetCurrentProcess())//獲取移動至新進程的名稱,并顯示。
Console.WriteLine(
\"I started in '{0}' but now am in '{1}'!\",
_startingProcess, p.ProcessName);}
}
4) 程序集的加載運行設計
程序集的加載運行設計用于解決Agent代碼移動至MAE后如何編譯執行的問題,在介紹之前,有必要了解一下.NET 平臺下程序運行的原理以及程序集的一些基本概念。
圖3顯示了.NET平臺下應用程序域(AppDomain)、程序集(Assembly)、類、類實例以及它們之間的關系。
當運行TestApp.exe時,.NET CLR(通用語言運行環境)會首先創建一個應用程序域(AppDomain)來容納TestApp.exe,接著,CLR將引用的程序集加載到該應用程序域中。MSCorLib.dll是一個基本的程序集,該程序集會自動被加載到每個應用程序域中。然后,CLR加載應用程序(即TestApp.exe)所屬以及引用的程序集。程序集的加載一般在應用程序啟動時通過CLR自動加載完畢。然而,.NET平臺也提供了一種應用程序運行后動態加載程序集的方法,即文章前面提到的反射技術,通過該技術動態加載程序集、獲取類類型、創建該類實例、調用實例中的方法,使得動態執行移動Agent代碼成為可能。
在移動Agent系統開發實例中,對程序集加載運行的設計思路如下:
首先,在Agent基類的Move方法中加入TransferAgentAssembliesToHost方法,將程序集傳送至服務端。
其次,在AgentHost遠程對象類中,增加IsAssemblyInstalled(程序集安裝判定) 和SaveAssemblyBits(按位存儲程序集)。方法IsAssemblyInstalled使用參數提供的名稱和路徑來調用程序集,如果失敗,即程序集沒有安裝。SaveAssemblyBits方法也是使用程序集的全名,將其按二進制方式存放到指定的路徑。
最后,在AgentHost類中,增強HostAgent方法的功能,利用反射機制,根據路徑調用存儲的程序集,取得移動Agent的類,并執行Agent的Run方法。
其中有些細節需要說明,在Agent基類傳遞程序集前,需要調用AgentHost中的IsAssemblyInstalled來判斷相關的程序集是否已經安裝,在沒有安裝的情況下才發送,當然還需要通過遞歸的方法將與該程序集有依賴關系的程序集一并發送。為提高程序集的管理效率,可以將程序集獲取、解析、存儲、查找等方法統一歸屬至一個輔助類如AssemblyManager[3]。
5 結束語
移動Agent系統開發面臨著信道建立、代碼移動、程序集加載運行等主要難題,微軟.NET平臺中的Remoting和反射技術,為系統開發提供了很好的環境支撐,大大簡化了開發過程。.NET平臺的強大功能有助于推動移動Agent系統的普及,發揮移動Agent系統在數據采集、網絡管理、科學計算等領域的突出優勢。
參考文獻:
[1] 李朝純,郭頌.移動Agent系統的研究[J].武漢理工大學學報,2004,26(1):38-41.
[2] Chen X.應用框架的設計與實現——.NET平臺[M].溫昱,靳向陽,譯.北京:電子工業出版社,2005.
[3] Neely M.Write Mobile Agents In .NET To Roam And Interact On Your Network[EB/OL].http://msdn.microsoft.com/en-us/magazine/cc163649.aspx.