自動升級系統的設計與實現(原始碼)
對於PC桌面應用程式而言,自動升級功能往往是必不可少的。而自動升級可以作為一個獨立的C/S系統來開發,這樣,就可以在不同的桌面應用中進行復用。基於的檔案傳送功能,我實現了一個可直接複用的自動升級系統OAUS,現在將其分享給大家。這篇文章將著重介紹OAUS的相關背景、使用方法,至於詳細的實現細節,大家可以直接下載原始碼研究。如果瞭解了OAUS的使用,原始碼的理解就非常容易了。如果需要直接部署使用自動升級系統,那麼,可下載文末的可執行程式壓縮包。
一.OAUS的主要功能
目前主流的程式自動升級策略是,重新下載最新的安裝包,然後重新安裝整個客戶端。這種方式雖然簡單直觀,但是缺陷也很明顯。比如,即使整個客戶端有100M,而本次更新僅僅只是修改了一個1k大小的dll,那也意味著要重新下載100M的全部內容。這對頻寬是極大的浪費,而且延長了升級了時間,相應地也增加了客戶茫然等待的時間。
在上述的場景中,自動升級時,我們能否只更新那個被修改了的1k的dll了?當然,使用OAUS自動升級系統可以輕鬆地做到這一點。OAUS自動升級系統可以對被分發的客戶端程式中的每個檔案進行版本管理,每次升級的基礎單元不再是整個客戶端程式,而是其中的單個檔案。針對單個檔案的更新,包括三種形式:
(1)檔案被修改。
(2)檔案被刪除。
(3)新增加某個檔案。
OAUS對這三種形式的檔案更新都是支援的。每次自動升級,都可以更改N個檔案、刪除M個檔案、新增加L個檔案。
二.OAUS的使用
1.OAUS的結構
OAUS提供了可直接執行的服務端程式和客戶端程式:AutoUpdaterSystem.Server.exe 和 AutoUpdater.exe。 OAUS服務端的目錄結構如下所示:
OAUS的客戶端與伺服器之間通過TCP通訊,可以在AutoUpdaterSystem.Server.exe.config配置檔案中配置伺服器通過哪個TCP埠提供自動升級服務。
FileFolder資料夾初始是空的,其用於部署被分發的程式的各個檔案的最新版本。注意,其下的檔案結構一定要與被分發的程式正常部署後的結構完全一致 -- 即相當於在FileFolder資料夾下部署一個被分發的程式。
OAUS客戶端的目錄結構如下:
可以在AutoUpdater.exe.config配置檔案中配置OAUS伺服器的IP、埠等資訊,其內容如下所示:
<configuration>
<appSettings>
<!--伺服器IP -->
<add key="ServerIP" value="127.0.0.1"/>
<!--伺服器埠-->
<add key="ServerPort" value="4530"/>
<!--升級完成後,將被回撥的可執行程式的名稱-->
<add key="CallbackExeName" value="Demo.exe"/>
<!--主窗體的Title-->
<add key="Title" value="檔案更新"/>
</appSettings>
</configuration>
請注意配置的CallbackExeName,其表示當升級完成之後,將被啟動的分發程式的exe的名稱。這個CallbackExeName配置的為什麼是名稱而不是路徑了?這是因為使用和部署OAUS客戶端時是有要求的:
(1)被分發的程式的可執行檔案exe必須位於部署目錄的根目錄。
(2)OAUS的客戶端(即整個AutoUpdater資料夾)也必須位於這個根目錄。
如此,AutoUpdater就知道分發程式的exe相對自己的路徑,如此就可以確定分發程式的exe的絕對路徑,所以就可以在升級完成後啟動目標exe了。另外,根據上述的兩個約定,再結合前面講到的服務端的FileFolder資料夾的結構約定,當服務端更新一個檔案時,AutoUpdater便可以確定該檔案在客戶端機器上的絕對路徑了。
2.OAUS自動升級流程
下面我們就詳細講講如何使用OAUS來構建自動升級系統,大概的步驟如下。
(1)執行OAUS服務端。
服務端主介面將顯示所有正在自動升級的OAUS客戶端資訊。
(2)將被分發的客戶端程式的所有內容放到OAUS服務端的FileFolder資料夾下,其結構與客戶端程式正常部署後的結構要完全一致。我們以部署VideoChatSystem為例。
(3)使用OAUS服務端為被分發的客戶端程式的每個檔案生成預設版本號,並建立版本資訊配置檔案UpdateConfiguration.xml。這個配置檔案也將被客戶端使用。
點選服務端【工具】選單欄下的【版本管理】子選單,將彈出用於管理各個檔案版本的【檔案版本資訊】窗體。
雙擊列表中的任意一行,可以修改其對應檔案的版本的值(float型別的數值)。注意,此列表中的版本資訊與檔案的真實版本屬性(比如dll的版本屬性X.X.X.X)可以是沒有任何聯絡的,列表中版本的值只是用於標記檔案是否被修改,所以,檔案每被修改一次,其列表中對應的版本的值就應該有所增大。
當關閉【檔案版本資訊】窗體時,只要有某個檔案版本變化,則“最後綜合版本”的值(int型別)會遞增1。通過比較OAUS的客戶端儲存的“最後綜合版本”的值與OAUS的服務端最新的“最後綜合版本”的值,就可以快速地識別客戶端是否已經是最新版本了。
另外,初次開啟這個視窗時,將在OAUS服務端的目錄下,自動生成一個版本資訊配置檔案UpdateConfiguration.xml。而且,每當通過該窗體來設定某個檔案的新版本時,UpdateConfiguration.xml會自動同步更新。
(4)將UpdateConfiguration.xml新增到OAUS的客戶端程式(即上述的AutoUpdater的資料夾)中。
(5)在建立被分發的客戶端的安裝程式時,將OAUS的客戶端(即AutoUpdater的資料夾)也打包進去,並且像前面說的一樣,要將其直接部署在執行目錄(BaseDirectory)下(與分發的exe同一目錄)。
如此,準備工作就完成了,當客戶端通過安裝包安裝好了VideoChatSystem之後,其目錄結構像下面這樣:
(6)當我們有新的版本要釋出時,比如要更新某個檔案(因為檔案被修改),那麼可以這樣做:
a.將修改後的檔案拷貝到OAUS服務端的FileFolder資料夾下的正確位置(或覆蓋舊的檔案)。
b.在OAUS服務端開啟【檔案版本資訊】窗體,雙擊被修改檔案所對應的Row,在彈出的窗體上修改對應檔案的版本號,將版本號的數值增加。(如果是刪除舊檔案或新增新檔案,此處也可進行相應的操作)
(7)如此,當客戶端再啟動AutoUpdater.exe時,就會自動升級,更新那些發生變化的檔案。 以下是AutoUpdater.exe執行起來後的截圖。
(8)當升級完成後,將啟動前述的OAUS客戶端配置檔案中配置的回撥exe。(在本例中就是VideoChatSystem.exe)
(9)OAUS客戶端會在日誌檔案UpdateLog.txt(位於AutoUpdater的資料夾下,在OAUS客戶端首次執行時自動生成該檔案)中,記錄每次自動升級的情況。
3.何時啟動自動升級客戶端?
假設某個系統是下載客戶端形式的,那麼客戶端該如何知道是否有新版本了?然後又該何時啟動AutoUpdater.exe了?
我們的經驗是這樣的:客戶端登入成功之後,從伺服器獲取“最後綜合版本”的值,然後與本地的“最後綜合版本”的值相比較,如果本地的值較小,則表示客戶端需要更新。這個過程可以這樣做到:
(1)當在OAUS服務端的FileFolder資料夾下放置了新的檔案,並通過【檔案版本資訊】窗體正確的更新了版本號,在關閉【檔案版本資訊】窗體時,“最後綜合版本”的值會自動加1。
(2)系統客戶端可以通過呼叫AutoUpdater.VersionHelper類的靜態方法HasNewVersion()來判斷是否有新版本。
(3)如果HasNewVersion方法返回true,則通常有兩種模式:由使用者選擇是否升級,或者是強制升級。
一般而言,如果最新客戶端程式與老版本相容,不升級也影響不大,則可以交由使用者決定是否升級;如果最新客戶端程式不相容老版本,或者是有重大更新,則將啟動強制升級。如果流程要進入啟動升級,那麼只要啟動AutoUpdater的資料夾下AutoUpdater.exe就可以了。要注意的是,啟動AutoUpdater.exe程序後,要退出當前的客戶端程序,否則,有些檔案會因為無法被覆蓋而導致更新失敗。程式碼大致如下所示:
if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort))
{
string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe";
System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath);
......//退出當前程序
}
三.相關下載
如果有任何建議或問題,請留言給我。
相關推薦
自動升級系統的設計與實現(原始碼)
對於PC桌面應用程式而言,自動升級功能往往是必不可少的。而自動升級可以作為一個獨立的C/S系統來開發,這樣,就可以在不同的桌面應用中進行復用。基於的檔案傳送功能,我實現了一個可直接複用的自動升級系統OAUS,現在將其分享給大家。這篇文章將著重介紹OAUS的相關背景、使用方法,至於詳細的實現細節,大家可
自動升級系統OAUS的設計與實現(續) (附最新原始碼)
private void button1_Click(object sender, EventArgs e) { int changedCount = 0; int addedCount = 0; List<FileUnit&g
模型類的設計與實現(四)
介紹 傳遞數據 規則 添加 play using ota 實體類 重要 實體類是現實實體在計算機中的表示。它貫穿於整個架構,負擔著在各層次及模塊間傳遞數據的職責。 一般來說,實體類可以分為“貧血實體類”和“充血實體類”,前者僅僅保存實體的屬性,而後者還包含一些實體間的關系與
Redis 設計與實現 (三)
check 就會 鍵值 鍵值對 是否 second 變化 write 次數 RDB 持久化 一、生成RDB cmd:SAVE --阻塞進程,執行完,才能有效接收客戶端命令。 cmd: BGSAVE --非阻塞,開啟子進程保存。 客
hadoop雲盤client的設計與實現(一)
white 下一跳 -c 文件 。。 edi track ++ ava 近期在hadoop雲盤client項目。在做這個項目曾經對hadoop是一點都不了解呀,在網
Redis 設計與實現 (五)--多機數據庫的實現
緩沖 所有 moved 啟動 tin 當前 body ica red 多機數據庫的實現 一、復制 slaveof 主服務器ip地址。形成主從關系。 1、同步 從向主服務器發送sync命令。 主服務器收到sync命令執行bgsav
Redis 設計與實現 (七)--事務
實現 標識 AC redis 服務 監視 不執行 get 狀態切換 事務 *ACID,指數據庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability) redis
Redis 設計與實現 (八)--排序、慢查詢日誌、監視器
監視 strong add 2.4 bsp log 格式 sadd 請求 一、排序 SORT <key> 對一個數字值的key進行排序 1、alpha 對字符串類型的鍵進行排序 2、asc / desc redis 默認升序排序asc
認證鑑權與API許可權控制在微服務架構中的設計與實現(四)
引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的完結篇,前面三篇已經將認證鑑權與API許可權控制的流程和主要細節講解完。本文比較長,對這個系列進行收尾,主要內容包括對授權和鑑權流程之外的endpoint以及Spring Security過濾器部分踩坑的經歷。歡迎閱讀本系列
認證鑑權與API許可權控制在微服務架構中的設計與實現(三)
引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第三篇,本文重點講解token以及API級別的鑑權。本文對涉及到的大部分程式碼進行了分析,歡迎訂閱本系列文章。 1. 前文回顧 在開始講解這一篇文章之前,先對之前兩篇文章進行回憶下。在第一篇 認證鑑權與AP
Linux核心設計與實現(1)--核心開發的特點
1. 核心程式設計時既不能訪問C庫也不能訪問標準的C標頭檔案 其中的原因有很多種。其一,C標準庫的很多函式實現都是基於核心實現的,這核心編譯的時候都還沒有核心,所以就不存在這些函式,這個就是先有雞還是先有蛋這個悖論。其二,其主主要的的
中小型園區網路的設計與實現 (二)
寫論文第二天 想要用心去寫一篇論文,首先要讀懂論文的要求 根據論文指導找出詳細的思路(論文的基本要求) 思路:①中小型區域網,500-1000臺計算機組成的一個網路。 ②網路型別是“園區網”,包括企業網、校園網等多種形式。園區網有一定的地理分佈範圍,不要簡單的一個辦
中小型園區網路的設計與實現 (一)
在職本科臨近畢業,論文是躲不掉的。 謹此來記錄畢業論文的完成過程。 論文大綱 部分雖然已經交上去很多日了。但是個人覺得有必要寫到第一篇裡,以示論文過程的完整。 先聊一下寫論文大綱的思路。 第一,首先論文是需要有專案背景的,就像做一件事情要有個目的。說仔細點就是某項工作需要交
lua設計與實現(二)資料型別
lua中的資料型別 //lua.h /* ** basic types */ #define LUA_TNONE (-1) #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERD
OpenStack設計與實現(四)訊息匯流排(AMQP)
在西方有一句諺語,叫做“Don’t Reinvent the Wheel!”。直譯過來就是不要在重新發明輪子了。也就是說我們應該避免做一些重複性的工作,如果一個東西別人已經做過了,那麼我們拿來直接用就行了,沒有必要重新制作,這一點在軟體開發裡尤為突出。所以在Op
OpenStack設計與實現(五)RESTful API和WSGI
在上一篇部落格中我們提到過,OpenStack每個專案內部的服務程序之間是通過訊息匯流排來通訊的,而在各個專案之間則是通過RESTful API來進行通訊的,在這一篇部落格中,我們就來詳細的討論一下OpenStack各個專案之間的通訊。 一、什麼是RESTfu
OpenStack設計與實現(一)虛擬化
雲端計算的一個核心思想就是在伺服器端提供集中的物理計算資源,這些計算資源可以被分解成更小的單位去獨立地服務於不同的使用者,也就是在共享物理資源的同時,為每個使用者提供隔離、安全、可信的虛擬工作環境,
快取伺服器設計與實現(六)
本文講快取中的內容管理–檔案的刪除。 基本原理 快取系統中的檔案,從無到有是被動產生的。初始狀態,快取系統中是空的,請求過來之後,快取會回源取,然後存在本地。而不像web伺服器,檔案是通過其他的手段(傳統的是通過ftp上傳)來建立的,這個建立檔案
MVC的設計與實現(改進)
MVC是web開發中常見的程式結構。簡單的mvc結構如下:view層:顯示層。control層:業務層,集合了各種action。model層:模型層,一般和資料打交道。簡單的sample:一個表對應一個model類。其中control層呼叫model層的方法,實現對資料的訪問
ssm許可權管理的設計與實現(一)
介紹: 畢業設計要做一個許可權管理系統,自己查了些資料,看了些不同的前臺框架,選單的同異步載入,資料庫設計也大不相同。蕩了兩個相關的專案,一直在讀程式碼。不知道怎麼下手,現在基本明白程式碼流程,自己前後臺略懂,這個模組又不大,說的不詳細的可以搜一下,很容