rochoc

          關于java、cobol、zos

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            6 Posts :: 1 Stories :: 21 Comments :: 0 Trackbacks

          前段時間做了一個工具發布給公司的各部門使用后反饋了不少BUG,每次修改后均需要發郵件通知各用戶替換最新版本,很不方便,因此后來就寫了一個自動升級的功能,這樣每次發布新的版本時只需要將其部署到自動升級服務器上,工具使用用戶運行工具時就會連接到自動升級服務器,檢查是否有版本更新,如果有則完成更新后再運行最新版本,否則就運行當前工具版本。
               為了使這個自動升級模塊具有通用性,我將其做成可以單獨運行的程序,而并非集成到工具中,這樣則可以為各類軟件提供自動升級的功能。自動升級模塊采用SOCKET方式實現升級客戶端與服務端的交互,通過版本控制文件autoupdate.xml來控制版本的更新,完成自動更新后會將歷史清單history.htm也發送給客戶端,并自動打開該文件,使用戶可以對本次升級的具體內容一目了然。

          詳細實現:
          autoupdate.xml具體內容:

           1<?xml version="1.0" encoding="GBK"?>
           2<Info>
           3  <Version>1.0.3</Version>
           4  <UpdateServer>
           5    <Ip>122.2.14.212</Ip>
           6    <Port>2110</Port>
           7  </UpdateServer>
           8  <Files>     
           9    <File> 
          10      <Name>mftest.jar</Name>  
          11      <Path>.\bin</Path>
          12      <SubVer>1.0.0.3</SubVer> 
          13    </File>
          14    <File> 
          15      <Name>run.bat</Name>  
          16      <Path>.</Path>
          17      <SubVer>1.0.0.3</SubVer> 
          18    </File>
          19    <File> 
          20      <Name>eglreco.fix</Name>  
          21      <Path>.\config\resource</Path>
          22      <SubVer>1.0.0.0</SubVer> 
          23    </File> 
          24    <File> 
          25      <Name>eglrec.fix</Name>  
          26      <Path>.\config\resource</Path>
          27      <SubVer>1.0.0.0</SubVer> 
          28    </File>
          29    <File> 
          30      <Name>dom4j-1.6.1.jar</Name>  
          31      <Path>.\lib</Path>
          32      <SubVer>1.0.0.0</SubVer> 
          33    </File>
          34    <File> 
          35      <Name>jaxen-1.1-beta-4.jar</Name>  
          36      <Path>.\lib</Path>
          37      <SubVer>1.0.0.0</SubVer> 
          38    </File>
          39    <File> 
          40      <Name>jxl.jar</Name>  
          41      <Path>.\lib</Path>
          42      <SubVer>1.0.0.0</SubVer> 
          43    </File>    
          44  </Files> 
          45</Info>
               其中UpdateServer用戶描述服務端的IP和端口;Version為軟件的大版本號,Files為軟件涉及到的文件,其中的SubVer為具體文件的版本號,其他就顧名思義了。

          history.htm具體內容:
           1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
           2<html>
           3<head>
           4<title>XXX軟件更新歷史</title>
           5<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
           6<style type="text/css">
           7    BODY,TABLE {
           8FONT-SIZE: 12px;
           9COLOR: #666666;
          10FONT-FAMILY:  宋體;
          11background-color: #ffffff; 
          12line-height: 160%;}

          13    
          </style>
          14</head>
          15
          16<body>
          17<table width="600" border="1" align="center" cellpadding="2" cellspacing="0">
          18  <tr bgcolor="#ECECEC"> 
          19    <td align="center" width=50>版本</td>
          20    <td align="center" width=470>更新內容</td>
          21    <td align="center" width=80>日期</td>
          22  </tr>
          23  <tr> 
          24    <td  align="center" >1.0.3</td>
          25    <td ><p>1.實現自動升級功能<br>
          26              2.增加版本號顯示<br>              
          27              3.修正.<br>
          28          </p>
          29      </td>
          30    <td align="center" >2008-12-25</td>
          31  </tr>
          32  <tr> 
          33    <td  align="center" >1.0.2</td>
          34    <td ><p>1.修正了等字符而無法正確生成的錯誤<br>
          35              2.修正了無法生成的錯誤<br>
          36          </p>
          37      </td>
          38    <td align="center" >2008-12-20</td>
          39  </tr>
          40<tr> 
          41    <td  align="center" >1.0.1</td>
          42    <td ><p>1.增加通過<br>
          43              2.修正因為的錯誤<br>
          44          </p>
          45      </td>
          46    <td align="center" >2008-12-15</td>
          47  </tr>
          48<tr> 
          49    <td  align="center" >1.0.0</td>
          50    <td ><p>1.實現通過.功能<br>
          51         2.實現通過.功能<br>
          52          </p>
          53      </td>
          54    <td align="center" >2008-12-11</td>
          55  </tr>
          56</table>
          57</body>
          58</html>

          工作原理:
          自動升級客戶端首先會將本地的autoupdate.xml內容發送給服務端,服務端收到客戶端的版本信息后與服務端本地的版本信息(autoupdate.xml)進行比較,首先比較Version,如果一致則通知客戶端無需更新,如果不一致則檢查Files中各文件的SubVer,服務端將SubVer不一致的文件發送給客戶端,對于服務端有而客戶端沒有的文件也需要發送給客戶端,處理完所有File后,服務端將本地的history.htm與傳送給客戶端,并通知客戶端更新完畢;客戶端收到更新完畢后的應答后自動打開history.htm,將更新歷史信息顯示給用戶查看。
          posted on 2009-01-04 21:55 rochoc 閱讀(6837) 評論(18)  編輯  收藏

          Feedback

          # re: CS結構軟件自動升級實現(一) 2009-01-05 09:03 HiMagic!
          如果可使用http protocol會簡單些,使用request parameter可以省去傳文件,比文件  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-01-05 21:39 rochoc
          @HiMagic!
          但是使用http的話服務端要使用http服務器,這個弄起來比較麻煩,其實用socket根據自定義的協議來交互也是很爽的,響應快效率高:)   回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-01-10 09:32 日月雨林@gmail.com
          不錯!謝謝你,讓我學到了很多東西!  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一)[未登錄] 2009-01-10 10:08 Matthew Chen
          @ochoc
          但是用http的話放個xml文件和若干個程序文件在網站上,可以把更新的整個任務都拉到客戶端來做。socket更新通訊協議一改變意味著服務器和客戶端都要修改,而放在靜態網站上的xml內容可以相對固定地存在。

          最好提供在任何情況的更新失效之后提示手動下載,不僅是針對網絡失敗等的原因,更是為了應對暫時沒有考慮到會出現的問題。  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-01-11 09:04 HiMagic!
          @ochoc
          Matthew Chen的意見很正確,CS的弊病不是在于兩端都要改,因為BS往往也要兩端改,而是兩端要深度的改,就像這篇文章的后續一樣,太多的代碼了。JDK6已經帶有內嵌的HTTP Server了,對于這樣的需求足夠了,不用額外部署HTTP。  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-01-11 12:38 車夫
          感覺非常不錯,不過還有一個問題:
          怎么更新應用的主程序?
          是執行你當前應用的時候,來調用升級客戶端嗎?怎么觸發的升級?當主程序執行的時候,更新主程序肯定會更新失敗吧。

          我理解沒錯的話,可能就需要建立更新專用的臨時目錄,要更新的文件放在臨時目錄中,再用更新客戶端關閉主程序,更新客戶端再替換文件。


            回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-01-12 19:45 rochoc
          @車夫

          這個有兩種做法,一種是再增加一個殼程序,里面先執行更新,然后再調用要運行的程序;

          還有一種做法是寫一個bat或sh,選執行更新,然后再執行要運行的程序;

          我現在是采用后一種方法,如:
          java -cp ./bin/autoupdate.jar;./lib/jaxen-1.1-beta-4.jar;./lib/dom4j-1.6.1.jar; com.icbc.autoupdate.AutoUpdateClient
          javaw -cp ./bin/mftest.jar;./bin/autoupdate.jar;./lib/jaxen-1.1-beta-4.jar;./lib/dom4j-1.6.1.jar;./lib/jxl.jar; com.icbc.mf.ui.MainFrameUI >mftest.log&
            回復  更多評論
            

          # re: CS結構軟件自動升級實現(一)[未登錄] 2009-01-16 09:51 Matthew Chen
          @rochoc
          你在客戶端用的是純粹的java項目吧,我目前用的是eclipse RCP product,不包括ui的組件,可能6M多,更新方式是下載新的版本的jar,放在plugins目錄下,重啟它會自動使用更新版本的jar,然后清除舊的就可以了。

          哦,當然我用到是SWT.  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-01-18 19:35 rochoc
          @Matthew Chen
          對,我這個是純JAVA項目  回復  更多評論
            

          # 關于你代碼在LINUX下出現的錯誤 2009-03-03 18:50 lmlm3000
          非常感謝你提供的源碼,但我發現在LINUX下運行服務器端的時候,會出現Sring字符越界的情況,啥原因呢  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-03-05 20:08 rochoc
          能否提供一下報錯的詳細內容,謝謝!  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-03-05 20:08 rochoc
          @lmlm3000
          能否提供一下報錯的詳細內容,謝謝!   回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-03-06 08:59 lmlm3000
          出錯的情況只有在LINUX做服務器的情況下才出現,windows做服務器沒有問題出現。
          客戶端能接受文件全路徑(其中有個LINUX和Windows文件分割符問題沒處理好,我改了下),下面是客戶端的錯誤
          2009-03-06 08:51:01->>ty1.yonix.cn/123.175.89.169:讀取數據頭部失敗
          2009-03-06 08:51:01->>更新文件:D:\workspace\new_win1\.\easydo.jar失敗
          2009-03-06 08:51:01->>非期望標識位,48
          2009-03-06 08:51:01->>自動升級處理完畢
          在源碼出錯的部分是:
          //讀取數據長度
          if(flagb[0]==AUPD.MARK_DATA_SECT)
          {
          len = socketIn.read(lenb, 0, 4);
          if (len != 4)
          {
          Config.print(socket.getInetAddress() + ":讀取數據頭部失敗");
          break;
          }
          }
          其中len讀取變成了1或者3,而不是4;該錯誤只有在程序下載自己生成的可執行的jar包才出問題
          如果要詳細溝通的話加我qq93327938;我對這個問題出現也很感興趣  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-03-06 09:02 lmlm3000
          關注下HttpComponents,用該包的話,使用request,header非常方便  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-03-06 22:17 rochoc
          @ lmlm3000
          因為家里沒有LINUX系統,我周一去公司試一下,看能否解決  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-03-10 20:25 rochoc
          @ lmlm3000
          下面把我已經在Linux上測試通過的代碼放上來  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2009-03-10 21:16 rochoc
          http://www.aygfsteel.com/Files/rochoc/Linux.zip  回復  更多評論
            

          # re: CS結構軟件自動升級實現(一) 2010-03-29 16:23 qupdater
          http://www.qupdater.com

          QUpdater是一個免費的自動升級程序。
          -為您的軟件集成穩定/高效的自動升級功能,是我們的宗旨。
          -四步完成升級工作:檢查新版本,下載解壓到臨時目錄,檢查本地文件,拷貝到工作目錄。
          -無需特別的服務器,普通的Web服務即可,如IIS、Tomcat等。
          -QUpdater不關心您的軟件升級過程,無論用戶使用的是1.0/2,0什么的,直接對比分析用戶使用的版本和最新版。
          -服務器部署最新版的軟件文件(壓縮/不壓縮都均可),QUpdater對比分析服務器和客戶的軟件文件,不同就更新。
          -可以刪除不再使用的軟件文件。
          -可以更新運行中的dll/exe,先備份再更新。
          -您不用關心QUpdater自身的升級、他自己能做好這一切。
          -多線程下載,并校驗文件,不成功則多次嘗試。
          -自動升級核心程序qupdater.exe是用VC編寫的,不依賴任何類庫,穩定/高效。
          -提供有專門的批量文件壓縮工具,支持拖拽、導入剪切板中的文件。

          請把更多的精力放在您的業務上吧!自動升級,這么點小功能,自己做值嗎?自己做穩定嗎?
          -QUpdater可以免費使用,最超值的服務,也不過是中上端工程師半個月的工資,再優秀的工程師,做得這么專業,也得好幾個月吧。
          -有了自動升級,您的軟件,不再是斷線的風箏!
          -有了自動升級,您也可以牽著用戶的鼻子走!
          -有了自動升級,您將不再害怕盜版!
          -有了自動升級,您的用戶可以享受超值服務。
          -周宏偉說,小版本成就大軟件,是360安全衛士成功的秘籍,秘籍是什么?——自動升級。

          http://www.qupdater.com
            回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 山东省| 嘉定区| 余干县| 东乡县| 江陵县| 漳州市| 霍林郭勒市| 新巴尔虎左旗| 高邮市| 乌兰察布市| 黄平县| 高阳县| 永州市| 定安县| 息烽县| 秀山| 交城县| 黑龙江省| 木兰县| 左权县| 手游| 斗六市| 麻栗坡县| 曲周县| 雅江县| 酒泉市| 武冈市| 祁东县| 鄂托克前旗| 凌海市| 玛多县| 德清县| 临西县| 鹰潭市| 莫力| 饶阳县| 湖口县| 武陟县| 清涧县| 澜沧| 和林格尔县|