在企業內部工具分發場景中,頻繁的版本迭代與手動通知更新極大地增加了維護成本。本文介紹一套基於 Socket 通訊、XML 版本控制的通用自動升級模組,支援多檔案差異更新、歷史記錄自動推送與瀏覽,可獨立於業務系統運行,為各類 C/S 架構軟體提供標準化升級能力。
早期採用郵件通知用戶手動替換 JAR 包的方式,不僅效率低下,且易導致版本不一致。為解決此問題,設計了一套獨立的自動升級程式,核心目標包括:
history.htm,讓用戶直觀查看變更內容。版本控制中樞採用 XML 格式,結構清晰,易於擴展與解析(使用 dom4j)。
<?xml version="1.0" encoding="GBK"?>
<Info>
<Version>1.0.3</Version> <!-- 軟體主版本號 -->
<UpdateServer>
<Ip>122.2.14.212</Ip> <!-- 升級伺服器 IP -->
<Port>2110</Port> <!-- 升級伺服器埠 -->
</UpdateServer>
<Files> <!-- 檔案清單與子版本 -->
<File>
<Name>mftest.jar</Name>
<Path>.\bin</Path>
<SubVer>1.0.0.3</SubVer>
</File>
<File>
<Name>run.bat</Name>
<Path>.</Path>
<SubVer>1.0.0.3</SubVer>
</File>
<File>
<Name>eglreco.fix</Name>
<Path>.\config\resource</Path>
<SubVer>1.0.0.0</SubVer>
</File>
<!-- 更多檔案節點... -->
</Files>
</Info>
關鍵欄位說明:
Version:軟體大版本號,優先比對,不一致即觸發全量檢查。UpdateServer:指定升級伺服器地址,客戶端讀取此處發起連線。Files/File:每個檔案獨立維護 SubVer,支援精細到單檔案的增量更新。採用簡易 HTML 表格呈現版本演進脈絡,樣式內嵌,無外部依賴,客戶端接收後直接以瀏覽器或 Desktop.getDesktop().browse() 開啟。
<table width="600" border="1" align="center" cellpadding="2" cellspacing="0">
<tr bgcolor="#ECECEC">
<td width="50" align="center">版本</td>
<td width="470" align="center">更新內容</td>
<td width="80" align="center">日期</td>
</tr>
<tr>
<td align="center">1.0.3</td>
<td><p>1.實現自動升級功能<br>2.增加版本號顯示<br>3.修正錯誤</p></td>
<td align="center">2008-12-25</td>
</tr>
<!-- 歷史版本列... -->
</table>
autoupdate.xml,建立 Socket 連線至伺服器。SENDCVER)。Version,一致則回覆 NNEEDUPD(無需更新)。Files/File,比對 SubVer,收集需更新檔案清單。SENDFILE)與二進制內容(STARTTSM ~ TERMTSMT),採 1KB 分塊傳輸。history.htm 並回覆 UPDESUCC。UPDESUCC,寫入檔案、更新本地 XML、自動開啟 history.htm 展示變更日誌,最後啟動主程式。此架構已在生產環境穩定運行,有效解決了多部門、多客戶端的版本同步難題。後續文章將深入原始碼層面,解析協議類 AUPD、伺服器監聽執行緒 AutoUpdateServer 及服務處理邏輯 AUpdSrvProc 的實作細節。