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 > .\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为具体文件的版本号,其他就顾名思义了。
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 >
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 >
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,将更新历史信息显示给用户查看。