如何实现软件在线升级

时间: 2008-02-06 / 分类: 未分类 / 浏览次数: / 0个评论 发表评论

  一、实现原理
         一般来说Update分为客户端和服务器端两个组成部分,客户端接收服务器上的更新信息,并下载更新文件,然后完成一系列注册、配置等更新工作,全部自动化,不用人工操作。
  根据笔者的经验,Update程序最好独立于主程序之外,也就是说有一个单独的Update.exe程序来执行更新操作,这样既可以直接更新主程序,也便于完成Update的“自身更新”。
  首先,我们遇到的第一个问题是选择合适的开发工具。一般来说Update的功能并不复杂,只是完成下载更新的功能,所以本文就用VB语言编写代码。另外也可以选用一些成熟的Update组件,例如用.NET框架开发的应用程序更新组件AppUpdater等,都可以很方便地帮助我们而只需要编写极少的代码。
  由于各种Update程序的种类繁多,本文主要介绍通用的一些特性以及适合个人编程、小型公司的Update经济方案,执行流程如下:
  1.下载网站某个页面,根据页面内容获得最新版本号;
  2.如果最新版本高于当前版本,则下载升级文件(一般为压缩包);
  3.释放文件,并用最新文件替换旧文件完成升级。
  按照这个最简化的方案,当开发者需要更新升级软件的时候,只用FTP上传更新文件即可。好处是可以不必开发服务器端,更不用购买或租用昂贵的升级服务器。
  OK,我们现在开始详细剖析Update的具体执行过程,软件界面如图。
二、穿透防火墙
  首先,Update要对网络是否已经连通进行判断。笔者在这个问题上反复使用过多种方法:Ping某个IP地址、获取注册表键值、网卡连通判断等等,最终都不理想。原因在于IP地址可能变化、甚至有时候即使物理连通了,也不一定能够确保文件的下载更新。
  笔者使用的方法是利用Microsoft Internet Con trols控件访问开发者的官方首页来判断网络是否已经连通。代码如下:
  Dim Network As Long
  Private Sub Form_Load()
  WebBrowser1.Navigate "http://www.boobsoft.com"
  End sub
  Private Sub WebBrowser1_DownloadComplete() ‘当Web页面载入完毕此事件激活
  If Network = 0 Then
  Label1.Caption = "正在升级,请稍后…"
  Update ‘调用升级过程
  End If
  End Sub
  Private Sub WebBrowser1_NavigateError(ByVal pDisp As Object, URL As Variant, Frame As Variant, StatusCode As Variant, Cancel As Boolean) ‘当Web页面浏览失败的时候此事件激活
  Network = -1’必需此语句,在Update过程中要判断网络是否持续通畅
  MsgBox "网络没有连通,或升级服务器临时关闭,请稍后再试。"
  End Sub
  小经验:Internet Controls控件的好处不仅是代码简单,它是微软官方控件,更重要的是可以直接穿透防火墙,节省了我们很多时间。
三、检查更新
  接下来我们要“检查更新”——根据版本号判断是否需要Update。
  关键技术:从 HTML 文档中提取 TEXT 文本。
  方法很简单,我们仍然利用Internet Controls控件,先建立一个ver.html文件,里面只写一个简单的版本号2.01即可(当然,还可以在ver.html文件里面写入一个更新文件的列表,或者是一个压缩好的升级包文件名),然后传送到http://www.boobsoft.com/ver.html位置上。以后每次更新只要修改ver.html文件然后用FTP上传即可。最稳妥安全的方法就是将Update升级包完整的上传好之后再修改ver.html文件里面的新版本号,方可万无一失。
  接下来我们就可以编写获取这个ver.html文件的代码了(由于代码比较长,笔者已经将它们封装成DLL组件, ,这是个JPG文件,老办法,将后缀名改为zip后解压缩即可。)压缩包内的Download.dll组件可以用来下载任意文件。
 
四、断点续传,下载更新
  最后,仍然利用由笔者提供的Download.dll组件,下载更新文件就可以了。如果更新文件比较大,还可以进一步增加断点续传功能。
  调用WINRAR自动解压缩包也是非常实用的。为了方便地调用WINRAR的功能,可使用下列封装好的函数:
  Function GetWINRARPath() As String
  Dim myReg As New Registry, KeyFound As Boolean
  KeyFound = myReg.GetKeyValue(HKEY_LO CAL_MACHINE, "SoftwareMicrosoftWindowsCur rentVersionApp Pathswinrar.EXE", "Path", GetWINRARPath)
  If KeyFound = False Then MsgBox "系统未安装WINRAR.EXE!": GetWINRARPath = ""
  If KeyFound = True Then GetWINRARPath = GetWINRARPath & "WINRAR"
  End Function
  Sub compress(ByVal SOURCE As String, ByVal TARGET As String, Optional Mu As String)
  If Not GetWINRARPath = "" And Dir(SOURCE) > "" Then Shell GetWINRARPath & " -ibck -p9910 a " & Mu & " " & TARGET & " " & SOURCE, vbHide
  End Sub
  Sub decompress(ByVal SOURCE As String, ByVal TARGET As String)
  If Not GetWINRARPath = "" And Dir(SOURCE) > "" Then Shell GetWINRARPath & " x " & SOURCE & " " & TARGET, vbHide
  End Sub
  调用举例:
  compress "C:1.jpg", "c:5.rar" ‘ 将"C:1.jpg"压缩为"c:5.rar" 。
  decompress "C:1.rar", "c:test" ‘ 将"C:1.rar"解压缩到"c:test"目录
  compress "C:TEST", "c:3.rar", "-r" ‘目录(含子目录)压缩
  如果下载量非常大,我们还可以采用BT等进阶的下载方式。
五、安全性
  Update自动升级应用程序的能力具备很多好处,但使用它存在着一些潜在的隐患,这也是我们不得不考虑的问题:第一种危险是欺骗,有人会把自己的Web服务器用来部署更新的Web服务器。他们可能会利用那台Web服务器在你的应用程序路径安装一个病毒程序。阻止欺骗或防止通过网络进行的不正当干预的最简单的方法是使用HTTPS。第二种危险是黑客,他们既可能从内部也可能从外部来攻击你的服务器。一旦攻击成功,则意味着成百上千的客户端也可能通过自动更新遭受连累,这种情况将是灾难性的。
  为解决这个问题,我们可以对更新文件内容(上文中的ver.html)进行加密,然后再对升级包设置密码。笔者推荐用WINRAR进行压缩并加密码,一则可以缩小升级包的大小,二则WINRAR的密码安全性也是有口皆碑的。
  总结:Update自动升级技术涵盖了多种的网络技术,其应用领域也是广阔的,譬如用来进行用户在线调查、软件使用频率测定、自动搜集用户信息、传送错误信息、软件测试等方面。“Update”具有使自身不断“进化”的重要功能。本文篇幅有限,就只能在此止笔了。Update带来的交互性,确实值得我们应用的。

您阅读此文共耗时

暂无评论

  1. 剑侠王明发
    2008/02/06 08:34:15

    一帆风顺,二龙腾飞,三羊开泰,四季平安,五福临门,六六大顺,七星高照,八方来财,九九同心,十全十美。春节快乐,万事如意!

  2. 挨踢小胖
    2008/02/06 12:44:51

    谢谢,你也新年快乐啊

发表评论

你必须 登录后 才能留言!