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

本文介绍了一种基于SOCKET实现的自动升级工具设计方案,通过服务端与客户端交互完成软件版本更新,支持独立运行并具备通用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间做了一个工具发布给公司的各部门使用后反馈了不少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 >  
1 0       < 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

转载于:https://www.cnblogs.com/88999660/articles/1581880.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值