摘要:文件升級是C/S結構應用系統的維護難點,通過socket網絡編程技術可以解決這個問題。該文首先介紹socket技術的基本原理,然后介紹如何利用socket技術實現文件發布和文件自動升級的基本設計思路和判斷流程,最后介紹基于Delphi開發工具的實現文件自動升級的程序設計方法。
關鍵詞:網絡編程;發布系統;自動升級
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2009)26-7397-03
Use Socket to Realize Files Automatically Upgrade about Application System
WEN Hua
(Guangxi Sundynet Science Tech. Co.Ltd, Liuzhou 545001, China)
Abstract: Upgrade file is C / S structure of the application system difficult to maintain, through the socket network programming technology can solve this problem. This paper first introduces the basic principles of socket technology, and then describes how the use of socket technology to publishing files and files automatically upgrade the basic design ideas and determine the process, finally, introduces Delphi development tools based on the realization of a files automatically upgrade process design method.
Key words: network programming; distribution system; files automatically upgrade
在信息技術高度發達的今天,企業的生產管理和經營業務工作越來越需依賴計算機網絡和信息管理技術的支持,企業每年都需要投入大量資金開發應用軟件或擴展已有系統。由于每個企業生產管理和經營業務都有一定的特殊性,商品化的應用軟件產品通常無法完全滿足企業的特殊要求,許多應用系統都需要量身定制開發,定制的應用系統通常是開發和實施同步進行,在開發和實施的初期,由于需求目標不明晰、編程錯誤、功能不完善等原因,經常需要不斷地增加功能、修改程序、完善算法,從而不得不發布新軟件版本;另外,由于企業生產管理或經營業務的改變,也要求應用系統與時俱進,不斷地擴展系統功能,由此也會產生和發布新的軟件版本。
對于單機結構的應用系統或B/S結構的應用系統,新版本軟件的發布相對簡單,只需將新版本的程序文件復制到單機/服務器即可。但對于C/S結構下的應用系統,當客戶機數量較多、地理位置較遠、地點分布廣時,可以想象得出,靠技術人員逐臺電腦升級程序文件,會是一件非常痛苦事情,同時,由于各客戶端升級不同步,一些客戶端運行的是舊版本軟件,采用的是舊的處理方式和舊的計算方法,往往會造成業務處理錯誤和數據庫混亂。為此,許多應用系統在發布新版本軟件時,要求所有客戶端系統都停止運行,只有將所有客戶端升級完成后,才能允許繼續運行。
不過,通過采用一定的技術手段,以上問題是可以得到很好解決的,那就是采用文件自動升級方式,讓客戶端能夠自動、及時地升級新版本的軟件。文件自動升級技術和方式很多,有的采用FTP文件傳輸協議技術,有的采用數據庫訪問技術,本文介紹利用Socket網絡編程技術來來實現文件的自動升級。
1 socket技術原理
socket是一種基于TCP/IP協議傳輸層上的網絡編程技術,socket意思是“插座”,一般將其翻譯為“套接字”[1]。
TCP是面對連接的傳輸層協議。面向連接,是指在數據傳輸開始前建立一個傳輸數據的通道,這個通道在整個傳輸過程中都保持暢通,到傳輸結束時才關閉這一通道。一個典型的TCP協議雙方通信的過程是:
1) 獲得對方IP地址和端口號。
2) 在本地主機上選擇一個IP地址和端口號。
3) 在通信雙方之間建立socket連接。
4) 傳輸數據。將數據從發送方順序傳輸到到接收方。
5) 傳輸完畢后斷開連接。
在socket編程中,包括客戶端client socket與服務器端 server socket,實際的應用中,需要同時使用client socket和server socket,client向server請求服務和資源,server給client提供服務,返回資源。[2]
在應用系統中,可以利用socket編程技術,實現系統文件發布和文件自動升級,減少人工處理過程,降低C/S應用系統的維護難度。
2文件自動升級的基本設計思路
1) 要實現文件自動升級,必須建立一個文件發布系統。
發布系統存儲最新版本的程序文件,供客戶端獲取,系統開發人員修改或開發出新的功能模塊,經過嚴格測試后,將模塊程序文件提交到文件發布系統中,實現新版本文件的發布;其次,需要建立一套可靠的文件升級機制,確保客戶端能從發布系統中獲取升級文件清單,下載最新版本的程序文件,使本機的文件與發布系統的文件同步。這種發布/升級的方式,非常適合利用socket技術實現。其主要原理就是,在發布系統中創建一個服務端server socket,提供客戶端升級所需的服務接口;在客戶機創建一個client socket,使其與server socket建立連接,調用server socket的服務接口,就可以升級到最新版本程序文件。通過對socket進行必要的編程,就可以實現我們的即定目標。見圖1。
2) 要實現文件自動升級,必須確定升級時機,處理升級判斷流程,即“何時升級”、“升級什么”。
何時升級。升級可以在應用系統運行開始時檢測升級,可以在應用系統運行期間檢測升級,還可以在應用系統運行結束時檢測升級,例如常規殺毒軟件,通常都在系統運行期間檢測是否有新版本病毒庫,如果有則升級。作者開發的應用系統,都將升級行為設計在系統運行時,目的是讓操作員了解系統的升級過程,確信自己運行的是最新版本的程序文件。
升級什么。升級的文件由發布系統確定,當客戶端的文件與發布系統所發布的文件不一致時,客戶端就必須升級。我們通過以下兩個條件可以判斷客戶端是否需要升級,升級什么文件:
① 如果發布系統中存在,客戶端中不存在,則需要升級。
② 如果發布系統中存在,客戶端中存在,但發布系統與客戶端中的文件屬性(文件大小,更新時間)不一致,則需要升級。
判斷流程見圖2。
3) 需要將文件拆分成若干數據小的數據包,以便于網絡傳輸。
由于網絡傳輸數據時,數據是按packet(數據包)的方式接收或發送的,而packet大小是有限制的,當發布的文件數量比較多時,文件清單的數據大小也隨之增大,因而可能無法將目錄清單一次性傳輸完畢,升級文件也因大于packet的大小而無法一傳輸完畢。因此,發布系統必須將發布目錄清單和升級文件拆分成若干個較小的packet,給各packet編上順序號,按順序發送給客戶端,客戶端接收完所有的packet后,按相同順序將packet重新合并還原,最后寫到本地硬盤上,完成所有數據的接收。數據拆分、發送、接收、合并還原過程見圖3。
3 文件自動升級的程序設計
本文實現的應用系統是用delphi工具開發,采用object pascal語言編程。為實現文件的自動升級功能,作者開發的應用系統需要實現以下幾個主要函數:
1) Procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
ServerSocketClientRead()是個Socket服務器端通訊事件處理過程,用于接收客戶端程序的服務請求,并向客戶端程序返回服務請求處理結果。ServerSocketClientRead()函數在服務器端發布系統程序中實現,該函數是發布系統與客戶端程序進行數據傳輸的主要接口。
2) procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
ClientSocketRead ()是個Socket客戶端通訊事件處理過程,用于接收服務器端的返回結果。ClientSocketRead()在文件客戶端程序中實現。該函數是客戶端程序與發布系統進行數據傳輸的主要接口。
3) function GetFileList(): array of TMyFile;
GetFileList()函數的作用是獲取發布系統的文件目錄清單。客戶端程序執行GetFileList()函數時,服務器檢索發布文件,將所有發布文件清單(包括三個文件屬性:文件名,文件大小,更新時間)返回給客戶端程序。
TMyFile為自定義的數據結構,用于保存目錄清單的文件屬性(文件名,文件大小,更新時間),該結構定義如下:
TMyFile = record//定義文件信息結構
FileName : String;//文件名
FileSize : Integer; //文件大小
FileAge: Integer; //更新時間
End;
4) function MakeUpgradeFileList():array of TMyFile;
MakeUpgradeFileList()函數的作用是客戶端程序將本地客戶端文件目錄與通過GetFileList()函數獲得的發布文件目錄作比較,根據圖2的判斷流程生成一個需要升級的文件目錄清單。
5) function GetUpgradeFileData(FileName:String; Block_No:Integer):String;
GetUpgradeFile()函數的作用是向服務器發布系統請求需要升級文件的數據。其中參數為:FileName為申請升級的文件名,Block_No為申請文件的數據包順序號。
服務器接到客戶端請求后,從申請文件中檢索到指定順序號的數據包,將該數據包返回給客戶端。
客戶端接收到數據包后,暫時保存到緩存中,然后繼續調用GetUpgradeFile()函數申請順序號為Block_No+1數據包。當從服務器獲得最后一個數據包后,客戶端程序調用WriteUpgradeFile()函數,將所有的數據包按1、2、3……n順序號合并起來,寫到本地系統目錄中,替代本地系統原有的文件。
客戶端升級完一個文件后,繼續調用GetUpgradeFile()函數升級下一個需要升級的文件,直至所有的文件升級完畢。
6) function WriteUpgradeFile(FileName:String):Boolean;
WriteUpgradeFile()函數是將申請到得數據包按1、2、3……n順序號合并起來,寫到本地系統目錄中。
4 基于socket技術的文件自動升級的應用
根據以上的設計思路和程序實現方法,作者已經在多個基于C/S結構的大型企業信息管理系統中進行了文件發布和
文件自動升級的實踐應用。我們將客戶端安裝程序設計成網頁安裝方式,用戶通過瀏覽器便可下載和安裝客戶端應用程序,當需要更新系統的新版本程序文件時,系統管理人員只需將新版本程序文件簡單地復制到發布系統的指定文件目錄中,客戶端在運行時,自動判斷是否需要升級,如果需要,則自動完成升級的整個過程。整個安裝和升級過程,系統管理員無須親臨客戶端現場,系統管理員的維護工作輕松而便捷。
服務器端發布系統管理界面見圖4。
客戶端文件自動升級界面見圖5。
5 結束語
利用socket實現應用系統文件自動升級的原理是比較簡單的,該技術科應用于常規的操作平臺,可以利用多種開發語言實現。本文對實現原理和編程思路進行了簡要分析和介紹,在實際的設計開發中需要注意一些細節,如需要在數據包中增加額外驗證信息以確保信息傳輸的正確性、需要采用重新請求/重新發送機制處理因網絡延時原因造成數據包無法送達的問題,另外,如果文件比較大,可以考慮采用壓縮/傳輸/解壓過程加快文件升級過程。
參考文獻:
[1] 陳遠森.UNIX網絡實用編程技術[M].北京:中國水利水電出版社,2005.
[2] 柯溫釗.JAVA例解教程[M].北京:中國鐵道出版社,2001.