寫了一個自動更新服務網站和自動更新客戶端。基本功能測試完畢。記錄下git
項目地址:https://github.com/TeemoHQ/AutoUpdategithub
熱替換自我更新,自動集成,回退版本,守護進程,服務端操做,更新維度,腳本控制(bat)多個客戶端。算法
AutoUpdateServer採用Nancy WEB框架。數據庫
功能:1.提供上傳文件的接口框架
2.匹配文件而且創建多個不用客戶端的文件倉庫測試
3.打包,提供更新包,網站
AutoUpdateClient採用控制檯加密
功能:1.循環請求服務端,檢查當前客戶端是否須要更新3d
2.檢查客戶端是否空閒code
3.更新客戶端文件
4.腳本控制客戶端特殊文件
5.檢查客戶端進程是否關閉,若是關閉則打開(非更新狀態下)
客戶端
功能:提供當前是否空閒接口
1.Nancy.Forms authentication
2.Nancy CSRF防護
3.Nancy 靜態文件的使用
4.7ZIP 壓縮解壓
5.命名管道通信
6.自動更新算法邏輯
其餘:Nancy IIS部署的時候的權限釋放,CRC包的加密,log4net
核心的算法都在服務端(大部分時間差很少都花在這裏。改了四五次)
1.匹配文件。生成更新包。一開始是經過文件version屬性,但發現有些文件沒有version屬性,找到更好的方法。下面貼出方法。
private static bool isTheSame(FileInfo f1, FileInfo f2) { using (var md5 = MD5.Create()) { byte[] hash1, hash2; using (var stream = f1.OpenRead()) hash1 = md5.ComputeHash(stream); using (var stream = f2.OpenRead()) hash2 = md5.ComputeHash(stream); return hash1.SequenceEqual(hash2); } }
2.文件倉庫管理算法(代碼就不貼了。說下邏輯)
//1.第一次上傳的時候或者當前沒有出新文件的時候。和模板文件匹配.
BaseModel是基文件,由於每一個客戶端其實相似,部分DLL不一樣而已。因此第一次都先匹配這個
//2.第二次開始:
// A【修改】.上傳文件和本地文件都存在,對比不一樣,則把最新的文件複製到work目錄和倉庫目錄,而且設置上傳文件version爲最新version(存入數據庫時)
// B【不變】.上傳文件和本地文件都存在,對比相同,不復制文件,設置上傳文件version爲老版本文件的version(存入數據庫時)
// C【新增】.上傳文件存在,本地文件不存在,則把最新的文件複製到work目錄和倉庫目錄,而且設置上傳文件version爲最新version(存入數據庫時)
// D【刪除】.上傳文件不存在,本地文件存在。暫時不操做。
3.控制回滾 (代碼不貼)
邏輯:數據庫記錄每次上傳的文件版本信息。回滾時就想減,就拿到新的文件
效果圖: