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