劉路明
【摘要】ICE中間件簡化了客戶端和服務器的通信,使得整體架構數據高度可擴展,且支持語言獨立性,本文基于中間件ICE實現了客戶端界面的美觀以及對用戶的友好性。
【關鍵詞】中間件ICE;客戶端;設計;應用
一、中間件ICE
ICE(Internet Communication Engine)中間件是分布式系統中集成各個組成的軟件粘接劑。也有人把中間件定義為網絡環境中一組為許多應用需要的、可復用和可擴充的服務或功能。大型應用軟件通常要求在軟硬件各不相同的分布式網絡上運行。為了更好地開發和應用能夠在異構平臺上運行的應用軟件,迫切需要一種基于標準的、獨立于計算機硬件以及操作系統的開發和運行環境,中間件技術應運而生。DCOM和CORBA 這樣的使用多年的面向對象中間件平臺,正逐漸顯現出許多難以解決的問題,MicrosoftNET平臺和DCOM都是Microsoft的獨家解決方案,不是異種環境下的選擇。CORBA近年來已停滯不前。Web服務基于HTTP的SOAP協議無論是在網絡帶寬還是在CPU開銷方面,都會給應用造成嚴重的性能惡化,以至于無法適用于許多有苛刻性能要求的系統。
ICE 是一種面向對象的中間件平臺。從根本上說,這意味著ICE為構建面向對象的客戶-服務器應用提供了工具、API和庫支持。ICE應用適合在異種環境中使用:客戶和服務器可以用不同的編程語言編寫,可以運行在不同的操作系統和機器架構上,并且可以使用多種網絡技術進行通信。無論部署環境如何,這些應用的源碼都是可移植的。
在從不發出請求,只是響應請求的意義上,許多服務器常常不是“純粹”的服務器:它們常常充當某些客戶的服務器,但為了完成它們的客戶請求,它們又會充當另外的服務器的客戶。與此類似,在只從某個對象那里請求服務的意義上,客戶常常也不是“純粹”的客戶:它們常常是客戶-服務器的混合物。例如,客戶可以在服務器上啟動一個長時間運行的操作,在啟動該操作時,客戶可以向服務器提供回調對象,供服務器用于在操作完成時向客戶發出通知。在這種情況下,客戶在啟動操作時充當客戶,而在接收操作完成通知時充當服務器。這樣的角色反轉在許多系統中都很常見,所以,許多客戶-服務器系統常常可以被更準確地描述為對等系統。要想與某個ICE對象聯系,客戶必須持有這個對象的代理。代理是客戶的地址空間中的一種制品;對客戶而言,代理就是ICE對象的代表(該對象可能在遠地)。一個代理充當的是一個ICE對象的本地大使。
ICE 對象是一種具有類型、標識,以及尋址信息的概念性實體。但客戶請求最終必須到達具體的服務器端的處理實體,由該實體提供操作調用的行為。換言之,客戶請求最后必須到達服務器,在其內部執行代碼,而這些代碼用特定的編程語言編寫,并在特定的處理器上執行。在服務器端提供操作調用的行為的制品叫做servant。一個servant 提供一個或多個ICE對象的實質內容(或體現這些對象,incarnate)。實際上,servant 就是服務器開發者編寫類的實例,這些類作為一個或多個ICE對象的servant向服務器端run time進行注冊。類的方法對應于ICE 對象的接口上的操作,并且提供這些操作的行為。一個servant 可以只體現一個ICE對象,也可以同時體現若干ICE 對象。如果是前一種情況,servant 所體現的ICE 對象的標識在這個servant中是隱含的。如果是后一種情況,在每次收到請求時,servant也會收到ICE對象的標識,這樣,servant可以決定在處理該請求期間,體現哪一個對象。反過來,一個ICE對象也可以擁有多個servant。使用體現同一個ICE對象的多個servant,你可以構建冗余的系統:客戶端run time試著把請求發給一個服務器,如果失敗,就把請求發給第二個服務器。只有在第二次嘗試也失敗的情況下,錯誤才會報告給客戶端應用代碼。
二、部分系統模塊的設計與實現
(一)配置文件解析
配置文件的解析主要依靠自定義函數parsemainini()函數來完成,該函數主要調用WIN32 API有關解析ini文件的函數來完成從ini文件讀取配置載入到指定變量的操作。
(二)檢查版本更新
版本檢查主要依靠getverinfo()函數載入目前系統版本到變量,再與遠程服務器通信取得最新版本號進行對比的方式進行。同時系統會做出是否需要更新的判斷,如果需要更新,系統再調用startupdate()函數進行更新。實際上,startupdate()函數僅僅是打開外部程序houjieupdateclient.exe,再交由該子程序去完成更新任務。更新子程序會從服務器下載需要更新的文件的列表進行解析,然后根據列表依次下載更新文件,覆蓋到當前文件夾,值得一提的是,若不存在文件夾則會自動創建,若已有文件則自動覆蓋。完成更新以后,子程序重新啟動更新完的主程序,便會自動退出。
(三)注冊與登錄的實現
在注冊界面上,除了一些常規的注冊選項外有幾個值得一提:學校、學院、班級。因為系統目前只對固定的學校的固定專業同學進行內側,所以學校以及專業班級信息必須從服務器取得以保證準確。并且還需要考慮以后對系統進行擴充,所以本系統用注冊通信器第一次向服務器發起請求,取得學校信息,因為學校信息是處于信息鏈的頂層。有你學校信息后,系統利用用戶選定你的學校信息代碼進一步請求服務器,并獲得學院信息,以此類推,最后獲得班級信息。在填寫完所有必須填寫的字段以后提交信息到服務器即可完成注冊。
在處理登錄時,由于驗證登錄信息需要與服務器進行通信,而通信必然有可能存在一定的人為可察覺的延遲。為了使本系統對用戶友好,有必要在登錄的時候顯示登錄動畫。這樣,系統在后臺通信,而UI則響應用戶消息并顯示登錄動畫。為實現這個需求,本系統新初始化一個工作線程,該線程處理與服務器進行登錄信息驗證的事項,主線程則作為UI線程響應用戶消息。這樣也有效防止了登錄時出現的UI界面無反應假死的現象。
(四)教師任務與上傳打印
本系統需要時刻檢測教師布置的新任務并呈現給客戶端用戶下載,系統通過主通信器向服務端請求并取得包含教師所有當前未完成任務的列表,任務則是一個結構體,具體為任務ID、名稱以及任務文檔下載等。由于需要時刻檢測有無新任務出現,所以在實現中,系統首先記錄第一次返回的任務列表中的任務數目,然后系統新增一個工作線程去輪詢服務器返回當前未完成的任務列表,如果新返回的任務列表里的任務數目比已經記錄的要多,說明教師布置了新的任務。這時通知用戶有新任務,并把新任務更新到列表上。在打印文檔上傳的模塊中,用戶可以選擇本地被允許的文件類型進行上傳,上傳前系統會詢問用戶的地址以方便派送。上傳的實現,是通過調用主通信器向服務器發送建立上傳任務以及傳輸的調用來完成。派送的地址在此時也是發送給服務器記錄起來。值得注意的是,在上傳文檔時,需要新增一個工作者線程進行上傳任務的處理,否則會造成主線程堵塞,進而導致假死的現象。
【參考文獻】
[1]楊小,沈曾偉.ICE協議的形式化分析[J].計算機科學,2006(33).
[2]湯曉燕,徐競.ICE中間件的研究與應用[J].常熟理工學院學報,2009(10).