轻松实现软件在线升级(Update)·编程技巧  作者:杨伟宁 发表于2006年4月3日《电脑报》有删节,本文为全文 前 言
软件在设计过程中,常常会遇到这样的情况:在原始构思阶段,根据一些基本的构想来 开发一个软件的原型。在这个过程中必然会产生一些新的构思,补充新的功能。由此又可能会导致产生一些更新的构思,补充更新的功能。如此循环下去,软件难以完成。结果,竞争者抢先推出产品占领市场,或者市场已经过时,不再需要此软件,于是“泡汤”了。 这就是软件开发中最容易患上的“汤综合症”。——汤什么时候能好?饿了的时候!没有指定晚餐的时间,汤就一直地烧着。开发软件没有特定时间框架,应用程序将不断的得到修改,功能越来越多,微调越来越多。——好象掉尽了无底的黑洞,软件产品永远无法真正完成。(软件行业内夭折的产品很多和这个问题有关,血淋淋的代价值得我们反思)解决这个问题的方法是:必须指定软件的里程碑和临时版本的发行日期,然后通过不断的“Update”使软件逐步完善起来。 IBM的前成员佛雷德·布鲁客斯早在1987年关于软件开发的著名文章中提出了一种概念叫做:“‘培育’而不是设计软件”。 众所周知,一套新的软件首次发行就获得巨大成功几乎是不可能的,也是不现实的。 软件通常都要经过不断的版本升级,才可能真正的发育成熟进而占领市场。 微软公司一直抱着一个原则:不是在开发出的产品已经具有相当完美性能时才推出。而是尽可能快的推出一系列的产品,包括大量的测试版本。由此及时得到大量的用户反馈信息,从而不断改进其产品。——请顾客参与设计、参与讨论、参与实验! 这样做的结果是,尽管微软的产品性能往往不是最优的,但它可以最快推出产品,抢先占领市场。从而得到及时广泛的市场反馈,再次推出更为适应市场的产品,稳固市场地位。( 需求分析->设计->编码->测试(反馈)->再需求分析…… ) 《速度就是生命》的作者告诉我们:更快要比更慢好,更早要比更晚好。永无例外。“在这个技术驱动的世界中,未来就是现在。” 我们可以发现,在竞争中获胜的产品几乎没有最好的,而且它从来也不是最好的。如果你坚持等到产品完美再推出到市场,那么可能一切都晚了,所以不要奢望一次就可以铸造出完美的软件系统。(当然我们也不能仅仅强调速度和忽略质量,另一则警告是:“超速导致死亡”) “为了竞争的需要,速度和质量之间的平衡关系至关重要。两者都不允许以牺牲对方为代价来使自己占据支配地位。”如果:实现90%的功能需要一个月,而实现100%的功能需要10个月。这个时候你就不能苛求完美了。 我们都知道一个口号--“质量是首要的工作”,但是只要你不混淆质量与完美,这就是一个伟大的口号。
    “Update ”实质上就是一个软件能够使自身不断“进化”的重要功能特征,现在我们已经充分了解到它的重要性,那么现在就来实现它吧! 第一章 Update在线升级的实现原理  
   一般来说Update分为客户端和服务器端两个组成部分,客户端接收服务器上的更新信息,并下载更新文件,然后完成一系列注册、配置等更新工作,全部自动化,不需人工操作,在最大程度上方便用户。 根据笔者的经验,Update程序最好独立于主程序,也就是说有一个单独的Update.exe程序来执行更新操作,这样一可以直接更新主程序,二也可方便完成Update的“自身更新”。    首先,我们遇到的第一个问题是选择合适的开发工具。一般来说Update的功能并不复杂,只是完成下载更新的功能,所以本文就用VB语言编写代码,可以很方便的移植到其它语言环境,另外也可以选用一些成型的Update组件,例如用.NET框架开发的应用程序更新组件AppUpdater等,都可以很方便的帮助我们而只需要编写极少的代码(毕竟重新发明“轮子”,并不是一件荣耀的事)。     由于各种Update程序的种类繁多,本问主要介绍通用的一些特性.以及适合个人编程、小型公司的Update经济方案,执行流程如下——1.下载网站某个页面,根据页面内容获得最新版本号->2.如果最新版本高于当前版本,则下载升级文件(一般为压缩包)3.释放文件,并用最新文件替换旧文件完成升级。 按照这个最简化的方案,当开发者需要更新升级软件的时候,只用FTP上传更新文件即可。(这样可以不必开发服务器端,更不用购买或租用昂贵的升级服务器) OK,我们现在开始详细刨析Update的具体执行过程:   (图1  笔者开发的Update程序界面) 第二章  透防火墙       首先,Update要进行网络是否已经连通的判断,笔者在这个问题上反复使用过多种方法:Ping某个IP地址、获取注册表建值、网卡连通判断、等等,最终都不理想。原因在于IP地址可能变化、甚至有时候即使物理连通了,也不一定能够确保文件的下载更新。 笔者使用的方法是利用Microsoft Internet Controls控件访问开发者的官方首页来判断网络是否已经连通。代码如下: 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位置上。以后每次更新只要修改这个文件然后FTP上传即可。在实际应用中,也可以直接检测一个文件的最后的修改日期,来判断是否升级。但是,这种方法的问题在于会出现潜在的失败可能。比如文件日期被意外修改或不正确,也可能遇到管理员正在更新Web服务器上的应用程序版本,同时有个客户正在下载更新之前的版本,那么这个客户的计算机上就会既存在更新之前的一些文件,也存在更新之后新版本的一些文件。基于上述原因,对于重要的应用程序不提倡使用直接文件检查来更新。综上所述,最稳妥安全的方法就是将Update升级包完整的上传好之后再修改ver.html文件里面的新版本号,方可万无一失。 接下来我们就可以编写获取这个ver.html文件的代码了(由于代码比较长,笔者已经将它们封装成DLL组件,下载地址为http://www.boobsoft.com/update.rar)压缩包内的Download.dll组件可以用来下载任意文件。 第四章  断点续传·下载更新   最后,仍然利用由笔者提供的Download.dll组件,下载更新文件就可以了。如果更新文件比较多,还可以进一步增加断点续传功能,调用RAR自动解压缩包也是非常实用的。 为了方便的调用RAR的功能,可使用下列封装好的函数 Function GetWINRARPath() As String Dim myReg As New Registry, KeyFound As Boolean KeyFound = myReg.GetKeyValue(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\App Paths\winrar.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)进行加密,然后再对升级包设置密码,笔者推荐用RAR进行压缩并加密码,一则可以缩小升级包的大小,二则 RAR的密码安全性也是有口皆碑的。 (下列为原文:) 总结:Update自动升级技术含盖了多种的网络技术,其应用领域也是广阔的,譬如用来进行用户在线调查、软件使用频率测定、自动搜集用户信息、传送错误信息、软件测试等等方面。本文篇幅有限就只能就此止笔了,但Update带来的交互性确实值得我们进一步思索的。 (下列为电脑报选用部分)     总结:Update自动升级技术含盖了多种的网络技术,其应用领域也是广阔的,譬如用来进行用户在线调查、软件使用频率测定、自动搜集用户信息、传送错误信息、软件测试等 方面。“Update ”实质上就是一个软件能够使自身不断“进化”的重要功能特征
本文篇幅有限就只能就此止笔了,但Update带来的交互性确实值得我们进一步思索的。 作者:杨伟宁 联系电话:029-86693008  E-mail:boobsoft@boobsoft.com QQ:20837182 地址:西安市高新区团结南路二号,高科新花园7#楼1单元19层199室 邮政编码:710075
|