引自:http://delia.org.ru/ArticleView/2005-9-7/Article_View_129438.Htm
一、 解釋一下智能客戶端技術
智能客戶端(Smart Client),結合了瘦客戶端(B/S模式)和胖客戶端(C/S模式)的長處,是下一代的客戶端軟件技術。
要了解智能客戶端,首先要認識瘦客戶端技術和胖客戶端技術各自的優(yōu)缺點。
對于前者,典型的應用就是使用瀏覽器,通過輸入URL遠程訪問服務端,并向服務端發(fā)送命令,獲取服務端的資源,然后在客戶端的瀏覽器上顯示出來。由于這種技術數(shù)據(jù)庫存放在服務端,客戶端應用界面的也是由服務端的文件生成,因此在客戶端上占用資源少,對客戶端的設備要求不高,只需一個瀏覽器軟件和可用的網(wǎng)絡便能開始工作,另外,如果系統(tǒng)需要升級修改,只需要在服務端更新文件,當客戶再次訪問時,就可以使用新的應用系統(tǒng)了,因而部署和升級重點都放在了服務端,實現(xiàn)起來比較簡單。但是,這種B/S模式依賴網(wǎng)絡,當網(wǎng)絡不可用時或出現(xiàn)性能不穩(wěn)定的情況時就會導致客戶端變成“死界面”——既不能將數(shù)據(jù)發(fā)送回服務端進行保存,又不能從服務端獲取數(shù)據(jù)拿到客戶端操作,一切的工作將要在網(wǎng)絡恢復后才能得以繼續(xù)。
對于胖客戶端技術,用戶在使用這種軟件時獲得的最大的感官體驗就是——它首先有自己獨特的應用程序界面,而非通過瀏覽器,用戶甚至還可以根據(jù)自己的喜好調整軟件的布局,進行豐富的界面元素的設置,這些都是B/S模式的瘦客戶端技術所不能媲美的。另外,用戶還能獲得較快的反應速度,程序可以充分利用本地機器的資源,在不使用網(wǎng)絡訪問遠程資源時,本地資源的訪問在正常情況下都能得到很快的處理。同樣的,胖客戶端技術也有著不盡人意的地方——在客戶端進行部署時,由于客戶端可能出現(xiàn)各種各樣的情況,所以需要進行必要的設置,部署起來比較困難,如果對軟件的版本進行升級,使用傳統(tǒng)的DLL技術的那將更是一個大的挑戰(zhàn),因為在.NET之前,標準Windows DLL或COM組件可能出現(xiàn)“DLL Hell”——注冊和更新軟件中的DLL時,發(fā)現(xiàn)共享的DLL被最新版本改寫了,并使該機器上的其他軟件也因此不能運行。胖客戶端有可能需要在客戶端實現(xiàn)數(shù)據(jù)庫支持,數(shù)據(jù)庫放在本地有可能導致一些安全問題,因為相對于更重視安全的服務端,客戶端相對而言還是比較脆弱的。
那么智能客戶端技術便出現(xiàn)了,除了包括了胖/瘦客戶端各自的優(yōu)點外,它還具有如下四個最大的優(yōu)點——
1) 充分利用終端設備的優(yōu)勢 (full PC, PDA, phone都可以滿足),因為核心部分在服務端(可能Web Service),所以終端只需實現(xiàn)表示層和一些簡單邏輯;
2) 能夠調用 web services,在server端用web服務實現(xiàn)業(yè)務邏輯,處理各種請求,需要說明的是,由于業(yè)務邏輯實現(xiàn)放在客戶端,因此一方面為客戶端瘦身,另一方面也加強了軟件的隱蔽性和安全性;
3) 支持在線和離線兩種狀態(tài),用戶可以在網(wǎng)絡不可用時繼續(xù)工作,并將數(shù)據(jù)臨時存放在本地,當網(wǎng)絡再次可用,數(shù)據(jù)便可傳上服務器;
4) 能夠如同Web應用程序一般簡單方便的部署,.NET使用程序集技術,同一軟件的不同版本可以共存于統(tǒng)一客戶端。版本的升級也非常簡單,軟件訪問服務端,能自動檢測版本號,從而更新關鍵組件,實現(xiàn)升級。
二、 這種技術用途是什么?前景如何?
其實Smart Client的觀點在一些傳統(tǒng)的軟件技術中也可以看到一些影子,隨后.NET的出現(xiàn),才使這種技術的各個環(huán)節(jié)(客戶端顯示,數(shù)據(jù)連接,在線離線的操作和部署)得以無縫的實現(xiàn)。所以,這種技術是一種新型的客戶端技術的解決方案,是一種技術方法,它可以在各種終端上去實現(xiàn)。
將桌面級的軟件做成智能客戶端軟件,可以增強其功能,因為網(wǎng)絡無限,跳出桌面,就能獲得更多的信息。
基于Internet或intranet及瀏覽器的B/S模式的系統(tǒng),將其實現(xiàn)成智能客戶端軟件,可以擴大其工作范圍,不用再依賴網(wǎng)絡,還能充分利用本地資源,加快工作效率。易于部署的優(yōu)勢在企業(yè)級應用中,更有發(fā)揮的余地,開發(fā)人員只需簡單的在服務端發(fā)布和部署,就能使客戶端同步更新。
舉些可以使用這種技術的應用——
“產(chǎn)品售后服務系統(tǒng)”:產(chǎn)品售后服務人員允許以脫機的形式在本地創(chuàng)建送修工單、裝箱單等,這樣可以加快本地的工作效率,當網(wǎng)絡可用時,再將這些數(shù)據(jù)傳上服務器。并可從服務器獲得需要的信息。如果本地軟件的版本低于服務端的最高版本,將提示用戶進行在線無縫地升級,大大減輕了開發(fā)人員的部署指導工作。
隨著.NET技術的進一步成熟,尤其是Web Service技術的更廣泛應用,乃至微軟將來的系統(tǒng)全面支持.NET,我相信智能客戶端技術將會成為首選的解決方案,應用到各種軟件技術中。
三、 怎么運用這種技術(通過案例)
智能客戶端程序一般都具有偶爾性連接的特征,所以我著重講述偶爾連接的智能客戶端應用程序。同時,其與網(wǎng)路的通訊又有四種方法——Enterprise Services,.NET remoting,Message Queuing(消息隊列)和Web services?;谄毡榈挠^點——Web 服務是生成大多數(shù)智能客戶端應用程序的最佳方法。故在針對面向服務的方法和面向數(shù)據(jù)為中心的方法的選擇中,我決定選擇前者,因此,我重點講述以Web Services作為首選通訊方式,面向服務的智能客戶端技術。
設計面向服務的智能客戶端技術,關鍵要解決如下幾個問題,為使講述清晰,我將以一個案例作為例子。
我們要實現(xiàn)這樣一個購書軟件(姑且命名為BuyBook),服務端有數(shù)據(jù)庫,包含兩張數(shù)據(jù)表。一張表簡單的描述了書籍的價格,這些價格是變動的,管理員可以通過工具對里面的數(shù)據(jù)進行改動;另外一張表則是書籍的訂單,記錄著訂購者ID,訂購書的ID和訂購數(shù)量。兩表只有書的ID作為主外鍵關聯(lián)著。服務端還創(chuàng)建了必要功能的web服務,以供客戶端調用。
下面繼續(xù)接著講面向服務的Smart Client技術關鍵解決的幾個問題。
1) 連接的管理
智能客戶端軟件當然不能過于頻繁地訪問網(wǎng)絡上的服務端,因為這樣會嚴重影響軟件的性能,另外,對于連接發(fā)生的更改(包含如手動連接、自動連接、連接意外中斷和連接長期不用等情況)軟件也要作出相應的反應,以體現(xiàn)其智能的特點。
那么關于連接的管理有些什么適合的方案呢,我將以我舉的范例為例,設計其在這方面的處理方法。
BuyBook應該盡量避免和網(wǎng)絡上的服務端進行交互,即使網(wǎng)絡連接可用??梢詢?yōu)先假設為離線操作,在機器本地進行事務處理,當然這樣會造成一定的問題,有可能系統(tǒng)數(shù)據(jù)沒有和服務端數(shù)據(jù)同步,導致本地操作無效。如服務端書本的價格作為系統(tǒng)參數(shù)保留在本地,當系統(tǒng)的數(shù)據(jù)變化時,用戶在客戶端看到的書本的價格就不是真實的行情了。所以雖然優(yōu)先離線操作,也要考慮到數(shù)據(jù)出現(xiàn)不一致的情況,在數(shù)據(jù)沖突處理會得到詳細解答。
在一些特殊的例子中,如購買股票的情況,由于股票的行情是不斷變化的,所以,為使本地數(shù)據(jù)能體現(xiàn)真實的情況,網(wǎng)絡連接應該采用隔時便來一次與服務端交互的動作,這個“隔時”的時間長度,可以用戶自定義,也可以是系統(tǒng)默認。
我們還可以提供給用戶這么一個功能,他只需點一個按鈕,發(fā)送出一個訪問服務端的命令,這時連接建立,并保持這個連接,直到手動斷開,或網(wǎng)絡不可用。我們稱之為“手動連接”,與之相對應的是“自動連接”,當連接可用時,保持連接狀態(tài),將緩存中的數(shù)據(jù)處理,發(fā)送到服務端,并獲取服務端最新的一些共用系統(tǒng)參數(shù)。
總而言之,對于連接,在設計系統(tǒng)時要把它看作是奢侈品,優(yōu)雅的對待網(wǎng)絡,無論網(wǎng)絡處于什么狀態(tài),用戶的數(shù)據(jù)操作都可以放在本地緩存。
2) WEB服務的交互
面向服務的智能客戶端應用程序,通過網(wǎng)絡與服務端的交互工作重點就在于web service上。按照前面所言,應該減少這種服務端上的遠程交互,可以將本地操作緩存,并且在與web服務交互過程中,不必等待返回信息,在這延遲中可以進行其他的操作。那么要實現(xiàn)這種延遲不影響工作的功能,最有效的辦法就是使用異步通訊的方式,可以考慮使用多線程。
WEB服務使用XML技術,CRUD(Creat Read Update Delete)類型的數(shù)據(jù)庫操作,可以都通過Web Service。那么,就要講究Web Service里交互方法的定義了。當客戶進行一個Create操作時,可能關聯(lián)到系統(tǒng)參數(shù),例如BuyBook應用程序,當客戶提交訂購單時,Web服務應該先檢查本地的商品價格與服務端的價格是否一致,如果價格已經(jīng)不同,應該提示客戶更新最新的價格,然后再作訂購行為的判斷。Upate和Delete操作,很可能導致數(shù)據(jù)沖突。例如刪除動作,應該在客戶端上將相關記錄標記為暫時刪除,然后在服務器上將刪除請求排隊。服務端進行刪除時一定要檢測是否有數(shù)據(jù)沖突,如果出現(xiàn)沖突,還要進行數(shù)據(jù)沖突的處理。
3) 本地數(shù)據(jù)緩存
智能客戶端為了能及時地響應用戶的操作,同時也是為了滿足脫機離線工作的需要,就必須將常用的固定的服務端數(shù)據(jù)緩存到本地。
如果連接是處于在線狀態(tài)的,本地數(shù)據(jù)可以暫時保存在內存中,ADO.NET里的DataSet本身就是可以用內存臨時存儲的數(shù)據(jù)對象,數(shù)據(jù)在內存中存儲只是一個臨時過渡,當數(shù)據(jù)需要經(jīng)過操作后保存回遠程數(shù)據(jù)庫時,方法可以使用DataSet的數(shù)據(jù)適配器DataAdapter將變化的量返回數(shù)據(jù)庫操作,這樣既加快了本地的反應又節(jié)省了帶寬。
如果,應用程序在斷線的狀態(tài)下工作,則將數(shù)據(jù)保存回本地的數(shù)據(jù)存儲結構,待再次連線時,裝載進DataSet,進行處理。
4) 數(shù)據(jù)沖突處理
造成數(shù)據(jù)沖突最常見的原因包括用戶在執(zhí)行更新或刪除數(shù)據(jù)的操作時,有可能該數(shù)據(jù)已經(jīng)被刪除掉了,這樣應用程序找不到更新或刪除的項,自然就會引發(fā)異常而出錯。處理這樣的情況,可以采用一個簡單的辦法,數(shù)據(jù)適配器DataAdapter能對DataSet變化進行判斷——當數(shù)據(jù)往數(shù)據(jù)庫返回時,DataAdapter的Update方法可以檢查DataSet里每個DataRow的RowState,從而可以判斷該DataRow是最新的,還是已修改或已經(jīng)刪除的,然后執(zhí)行適合的數(shù)據(jù)庫操作,像找不到數(shù)據(jù)的那種情況,DataAdapter將得知數(shù)據(jù)庫受影響的行數(shù)不大于零,并產(chǎn)生異常,從而停止更新。然后,應用程序就可以通過這個異常來處理數(shù)據(jù)沖突。
處理辦法是,如果服務端已經(jīng)不存在用戶需要刪除的原始數(shù)據(jù),那么,只要將客戶端的該條數(shù)據(jù)刪除。如果用戶是對該數(shù)據(jù)進行更改,可以先檢測服務端的數(shù)據(jù),看是否存在,倘若不存在,則通知用戶,并視用戶的操作無效,同時將本地的那條過期數(shù)據(jù)刪除。
四、 總結
智能客戶端技術是頗有前途的下一代客戶端技術,它能夠在有網(wǎng)絡連接和網(wǎng)絡斷開的情況下靈活地工作。對用戶而言,這將是新的一種軟件使用體驗,能同時擁有C/S模式軟件快速的反應、豐富的用戶界面體驗和瘦客戶端模式那樣簡單的部署,升級。對開發(fā)者而言,開發(fā)的難度變大了,考慮的方面多了,但還是有靈活的方案可供選擇,還可以結合.NET技術,使用面向服務或面向數(shù)據(jù)的解決方案,在開發(fā)中,要著重解決“連接的管理”,“WEB服務的交互”,“本地數(shù)據(jù)緩存”和“數(shù)據(jù)沖突處理”的技術點。