• java CS结构软件自动升级的实现


    前段时间做了一个工具发布给公司的各部门使用后反馈了不少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>.in</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 esource</Path>
    22      <SubVer>1.0.0.0</SubVer> 
    23    </File> 
    24    <File> 
    25      <Name>eglrec.fix</Name>  
    26      <Path>.config esource</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 {
     8    FONT-SIZE: 12px;
     9    COLOR: #666666;
    10   FONT-FAMILY:  宋体;
    11   background-color: #ffffff; 
    12   line-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,将更新历史信息显示给用户查看。 

    这个实现是基于SOCKET实现的,当然通讯协议是自定义,也有朋友说采用http协议比较简单,当然这个也是一种方法,但要使用http协议,则服务端要有http服务这样会导致服务端过于庞大。


    本实现包括:
    1、AUPD.java  服务端和客户端之间的通讯协议

    2、AutoUpdateServer.java 服务端的监听进程
    3、AUpdSrvProc.java服务端的服务线程,用于处理客户端的自动升级请求
    4、ClientVerParser.java服务端服务线程用于解决客户端版本信息的类
    5、AutoUpdateClient.java客户端的自动升级请求进程
    6、Config.java用于服务端和客户端读取本地配制文件的类
    7、UpdFile.java用于文件传输的文件对像
    本实现用dom4j作为解释xml的引擎

    一、AUPD.java

    /** *//********************************************************************
       * 项目名称                :rochoc

    * 包名称 :com.rochoc.autoupdate

    * 文件名称 :AutoUpdProtocol.java

    * 编写者 :kfzx-luoc

    * 编写日期 :2008-12-22

    * 程序功能(类)描述 :

    * 定义自动升级客户端与服务端的通讯协议 * 程序变更日期 : * 变更作者 : * 变更说明 : ********************************************************************/ package com.rochoc.autoupdate; /** *//** * @author kfzx-luoc * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class AUPD { /** *//** * 无意义操作 */ public static final String NONE = "NONE "; /** *//** * 发送客户端版本信息 */ public static final String SEND_CLIENT_VERSION = "SENDCVER"; /** *//** * 接收客户端版本信息 */ public static final String RECEIVED_CLIENT_VERSION = "RECDCVER"; /** *//** * 发送文件全路径 */ public static final String SEND_FILE_ABSOULT = "SENDFILE"; /** *//** * 接收文件全路径 */ public static final String RECEIVED_FILE_ABSOULT = "RECDFILE"; /** *//** * 开始文件传输 */ public static final String START_TRANSMIT = "STARTTSM"; /** *//** * 结束文件传输 */ public static final String TERMINATE_TRANSMIT = "TERMTSMT"; /** *//** * 更新失败 */ public static final String UPDATED_FAILURE = "UPDEFAIL"; /** *//** * 更新成功 */ public static final String UPDATED_SUCCESSFUL = "UPDESUCC"; /** *//** * 无需更新 */ public static final String NOTNEED_UPDATED = "NNEEDUPD"; /** *//** * 已经准备好接收更新文件 */ public static final String READY_TO_UPDATE = "READYTUP"; /** *//** * 结束链接 */ public static final String BYE = "BYEBYEOK"; /** *//** * 数据区OFFSET */ public static final int DATA_OFFSET = 5; /** *//** * 文件数据块大小 */ public static final int DATA_SIZE = 1024; /** *//** * 发送缓冲区大小 */ public static final int BUFFER_SIZE = DATA_SIZE + 1 + 4; // [0]位是标志位,区分数据和命令 + 4位长度 /** *//** * 数据段标识 */ public static final int MARK_DATA_SECT = 0; /** *//** * 命令段标识 */ public static final int CMD_DATA_SECT = 1; /** *//** * 数据段结束标识 */ public static final int MARK_DATA_END = 127; } 其它源码(请下载
    运行服务端:
    java -cp .;.in;.libdom4j-1.6.1.jar;.libjaxen-1.1-beta-4.jar com.icbc.autoupdate.AutoUpdateServer
    运行客户端:
    java -cp ./bin;./lib/jaxen-1.1-beta-4.jar;./lib/dom4j-1.6.1.jar; com.icbc.autoupdate.AutoUpdateClient

  • 相关阅读:
    DB数据导出工具分享
    使用批处理脚本愉快的清理缓存
    git常用命令记录
    使用bat脚本部署hexo到coding和github
    初次尝试Linux并记录一二
    js实用方法记录-指不定哪天就会用到的js方法
    js实用方法记录-简单cookie操作
    js实用方法记录-js动态加载css、js脚本文件
    使用node自动生成html并调用cmd命令提交代码到仓库
    express使用记录
  • 原文地址:https://www.cnblogs.com/cnsanshao/p/5691307.html
Copyright © 2020-2023  润新知