天天看點

自動更新系統的設計與實作(續2) -- 增加斷點續傳功能 (附最新源碼)

一.緣起    

  之前已經寫了兩篇關于自動更新系統OAUS的設計與實作的文章(第一篇、第二篇),在為OAUS服務端增加自動檢測檔案變更的功能(這樣每次部署版本更新時,可以節省很多時間,而且可以避免手動修改帶來的錯誤)後,有部分使用者又提出了一個很好的建議:為OAUS增加斷點續傳功能。因為如果網絡狀态不是很好,就經常會在更新到一半的時候,由于OAUS用戶端掉線而導緻更新失敗,這個時候,就必須重新開始整個更新過程。即使更新中斷的時候,已經完成了99%,也必須重頭再來。是以,為OAUS增加斷點續傳功能是非常必要的。

  現在,最新版本的OAUS已經增加了這個重要特性,當更新因為掉線而中斷的時候,OAUS用戶端并不會退出,而是一直嘗試斷線重連,重連成功後,就會從上次中斷的地方繼續更新。如下圖所示:       

自動更新系統的設計與實作(續2) -- 增加斷點續傳功能 (附最新源碼)
自動更新系統的設計與實作(續2) -- 增加斷點續傳功能 (附最新源碼)

  在網絡狀态極差時,可能在一次更新的過程中,會出現多次斷線重連的情況,這都沒關系,OAUS用戶端會一直正常工作,直到整個更新過程完成為止。 

二.源碼實作

  下面簡單說明一下代碼實作的具體過程,OAUS斷點續傳功能是在用戶端實作的,服務端不需要做任何修改。

1.預定網絡連接配接斷開的事件,得到掉線通知。此時,需要記錄是在更新第幾個檔案的時候,更新中斷的。

2.預定重連成功時間,得到網絡連結恢複的通知。此時,開始重新下載下傳下一個需要更新的檔案。

自動更新系統的設計與實作(續2) -- 增加斷點續傳功能 (附最新源碼)
void rapidPassiveEngine_RelogonCompleted(LogonResponse res)
    {
        if (res.LogonResult == LogonResult.Succeed)
        {               
            this.DownloadNextFile();
            this.logger.LogWithTime("重連成功,開始續傳!");
            if (this.UpdateContinued != null)
            {
                this.UpdateContinued();
            }

            return;
        }        
    }      
自動更新系統的設計與實作(續2) -- 增加斷點續傳功能 (附最新源碼)
自動更新系統的設計與實作(續2) -- 增加斷點續傳功能 (附最新源碼)
private void DownloadNextFile()
    {
        if (this.haveUpgradeCount >= this.fileCount)
        {
            return;
        }

        DownloadFileContract downLoadFileContract = new DownloadFileContract();
        downLoadFileContract.FileName = this.downLoadFileRelativeList[this.haveUpgradeCount];
        //請求下載下傳下一個檔案
        this.rapidPassiveEngine.CustomizeOutter.Send(InformationTypes.DownloadFiles, CompactPropertySerializer.Default.Serialize(downLoadFileContract));               
    }      
自動更新系統的設計與實作(續2) -- 增加斷點續傳功能 (附最新源碼)

  加上以上的邏輯處理之後,OAUS就已經具備了斷點續傳的功能了。代碼看起來非常簡單,那是因為内部核心的檔案傳送功能、斷點續傳功能都由ESFramework封裝好了。在為OAUS增加斷點續傳功能時,就不需要再次實作與斷點續傳相關的繁瑣的業務邏輯了。

3. 如何使用OAUS更新機制的說明

  一般而言,如果最新用戶端程式與老版本相容,不更新也影響不大,則可以交由使用者決定是否更新;如果最新用戶端程式不相容老版本,或者是有重大更新,則将啟動強制更新。如果流程要進入啟動更新,那麼隻要啟動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);     
       ......//退出目前程序  
  }       

三.相關下載下傳

1.自動更新系統OAUS - 源碼

2.自動更新系統OAUS(可直接部署)

3.自動更新系統OAUS - 使用手冊

  如果有任何建議或問題,請留言給我。

繼續閱讀