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