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 阅读(6807) 评论(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.blogjava.net/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
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: