前段时间做了一个工具发布给公司的各部门使用后反馈了不少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 {
 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 .;.\bin;.\lib\dom4j-1.6.1.jar;.\lib\jaxen-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

java CS结构软件自动升级的实现的更多相关文章

  1. 在C#中实现软件自动升级

    在C#中实现软件自动升级 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的 ...

  2. HTML5进阶(三)HBuilder实现软件自动升级(优化篇)

    HBuilder实现软件自动升级(优化篇) 前言 受前篇博客<HTML5进阶(二)HBuilder实现软件自动升级>(点击查看详情)的影响,测试过程中发现APP自动更新还是存在问题,第一次 ...

  3. HTML5进阶(二)HBuilder实现软件自动升级

    HBuilder实现软件自动升级 前言 移动APP开发好后需要实现软件自动升级功能,经过一番搜索,发现HBuilder具有"App资源在线升级更新"的功能,遂研究之. 经过一番测试 ...

  4. 在WinForm中使用Web Service来实现软件自动升级

    来源:互联网 winform程序相对web程序而言,功能更强大编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术 ...

  5. 在WinForm中使用Web Services 来实现 软件自动升级( Auto Update ) (C#)

    winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了 ...

  6. 在WinForm中使用Web Services 来实现 软件 自动升级( Auto Update ) (C#)

    winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了 ...

  7. c# 基于FTP协议的简易软件自动升级程序

    最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要. 在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜 ...

  8. C/S软件的自动升级部署

    升级的原理有好几个,首先无非是将现有版本与最新版本作比较,发现最新的则提示用户是否升级.当然也有人用其它属性比较的,例如:文件大小,或者更新日期.而实现的方法呢? 在.Net时代,我们就有了更多的选择 ...

  9. NSIS:应用软件自动升级功能的探索与实践

    原文 NSIS:应用软件自动升级功能的探索与实践 记得以前轻狂曾分享过使用第三方软件实现应用软件自动升级功能 (详细http://www.flighty.cn/html/soft/20110106_1 ...

随机推荐

  1. hdu3473 线段树 划分树

    //Accepted 28904 KB 781 ms //划分树 //所求x即为l,r区间排序后的中位数t //然后求出小于t的数的和sum1,这个可以用划分树做 //求出整个区间的和sum,可以用O ...

  2. swift简介

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  3. UIkit框架之UIalert(iOS 9之后就不用这个了)

    IOS中UIAlertView(警告框)常用方法总结 一.初始化方法 - (instancetype)initWithTitle:(NSString *)title message:(NSString ...

  4. 算法题----称硬币: 2n(并不要求n是2的幂次方)个硬币,有两个硬币重量为m+1, m-1, 其余都是m 分治 O(lgn)找出假币

    Description: 有2n个硬币和一个天平,其中有一个质量是m+1, 另一个硬币质量为m-1, 其余的硬币质量都是m. 要求:O(lgn)时间找出两枚假币 注意: n不一定是2的幂次方 算法1: ...

  5. 一个比较完整的Inno Setup 安装脚本

    一个比较完整的Inno Setup 安装脚本,增加了对ini文件设置的功能,一个安装包常用的功能都具备了. [Setup] ; 注: AppId的值为单独标识该应用程序. ; 不要为其他安装程序使用相 ...

  6. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  7. magento添加多个产品到购物车(Add multiple products to cart )

    Step  1app\design\frontend\base\default\template\catalog\product\list.phtml<?php    $_productColl ...

  8. 图像和滚动 、 编程规范和Xcode(一)

    1 在界面上以各种模式显示图片 1.1 问题 在ios开发中经常需要展示图片以满足需求和美化界面,本案例将学习如何以代码的方式使用UIImageView视图控件来展示图片,如图-1所示: 图-1 1. ...

  9. 用正则表达式获取所有img标签

    public static string ReplaceOrAddImageTitle(string content, string title) { Regex reg = new Regex(@& ...

  10. JS的强大

    JS很强大,对于网页设计者来说,会用JS真的很重要. 学好我的linux,和数据结构.