C++实现客户端升级流程

     对于一个客户端软件,升级程序是很常见的,当客户端有新增需求或者bug修复时,后台发布升级版本,前端进行版本比较并进行升级,以实现客户端迭代更新的效果,因此学会如何设计一个简单的客户端升级流程是我们必须要掌握的能力。

一,需求分析

     程序升级最常见的架构就是C/S架构了,包括主程序客户端,升级程序客户端,服务端程序。客户端每次启动向服务端发送请求,获取到最新版本号,与本地版本号进行对比。如果版本一致,那么不需要更新;如果客户端版本号小于服务端版本号,那么就弹出交互界面,询问用户是否需要升级,如果不升级,本次版本检测升级流程结束;如果升级,则让用户选择是“立即升级”和是“静默升级”。这两者区别如下:
1,“立即升级”指的是结束主程序进程,弹出升级界面,升级完成后,覆盖原有文件,并重新启动主程序,一般选择记住用户的账号名和密码,给用户减少操作步骤。
2,“静默升级”指的是升级程序客户端隐藏界面或缩小界面,在后台静默下载需要更新的文件,当下载完成后,既可以再次弹出交互界面,让用户确认是不是立即升级,还是等当次主程序退出后再升级;也可以一直隐藏在后台,等主程序退出后,自动替换更新后的文件,当用户下一次启动时,已经是最新版本。
流程图

二,主程序实现

     主程序启动后,直接调用服务端接口获取到版本号信息,或者下载服务端的版本信息文件,再从文件中解析出版本号,然后与本地的版本号进行对比,如果版本不一致,提示用户升级。如果是“静默升级”,升级程序下载完升级文件后,挂在后台,主程序退出前通知升级程序替换文件;如果是“立即升级”,则主程序退出,并且通过SheelExcuteEx调起升级客户端,升级程序下载完升级文件,立刻替换原有文件。

三,升级程序实现

     升级程序也是一个win32界面程序,因为需要显示更新进度,以及与用户之间的交互。升级程序一般是由主程序拉起来的,但是也存在用户单独启动它,那么这时候升级程序也需要加入服务端版本文件获取,以及本地版本比较等一系列的操作。有两种解决方案:
1,升级程序中也加上版本获取和版本比较的流程,根据它启动的参数来判断,对于控制台程序,int main(int argc, char** argv),argv就是参数;对于界面程序,int _stdcall WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
),lpCmdLine就是启动参数。
2,可以直接去掉主程序中的版本获取和版本比较的流程,将它只放在升级程序中来实现,各种升级交互都是由升级程序来进行的,升级程序可以一直挂在后台进程中。
     个人更倾向于第二种方式。

四,服务端程序实现

     服务端的实现有多种,比如用原生socket实现来进行客户端和服务端的通信,也可以吧服务端做成http服务端。当然更方便的是利用操作系统的特性来达到客户端和服务端的通信以及文件传输功能,因为我本人对windows操作系统熟一点,所以我们的服务端部署在windows server 2008上面,使用的是windows自带的ftp服务器。如何在windows上开启ftp服务功能,请参考我的另一篇博客,不再重复。
ftp服务端目录主要分为一个文件和一个文件夹:
1,版本信息文件
     本文件中主要包含了当前服务端的版本信息,以及升级更新的内容(本次升级主要更新了一下内容:1,…2,…),可以使用ini配置文件和xml文件,具体选择哪一种看个人使用习惯。

2,升级文件夹
     升级文件夹(UploadFile)里存放的是升级需要更新的文件,升级程序判断要升级后首先需要获取到服务端的ftp路径目录,对UploadFile中的每一个文件进行下载操作,保存到升级程序本地。
     这里我之前考虑到的是在版本信息文件里加上需要升级的文件名(路径),由升级程序根据这个配置项去一个个的下载,但是又要考虑到服务端的易操作特点(升级文件的替换可能是由其他人来做),所以还是没有使用这个方法,而是由升级程序自己来遍历目录。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
原创2010年android文档的整理打包的pdf档(含目录) 文档内容不能复制, 介意者请慎下. 大部分内容可在http://blog.csdn.net/xieyan0811上看到 文档目录如下 1 系统配置 1 1.1 建立SDK开发环境 2 1.2 Android源码的编译 6 1.3 编译在G1上运行的android 2.1(eclair)代码 9 1.4 编译在G1上运行的android 2.2(froyo)代码_旧方法 12 1.5 编译在G1上运行的android 2.2(froyo)代码_新方法 15 1.6 编译在N1上运行的android 2.3(GingerBread)代码 18 1.7 系统结构 21 1.8 模拟器调试与真机调试 22 1.9 安装和卸载应用程序(apk包) 23 1.10 系统升级 26 1.11 android系统支持app2sd(修改boot.img) 27 2 基本概念 30 2.1 Android组件 31 2.1.1 基本组件 31 2.1.2 组件间的通讯 32 2.1.3 intent使用方法 33 2.2 界面开发 35 2.2.1 界面元素 35 2.2.2 布局的实现 36 2.2.3 事件响应 37 2.2.4 应用软件代码结构 38 2.2.5 国际化的支持(多语言) 39 2.2.6 常见问题及解决方法 40 2.2.7 android是重要的包 41 2.3 界面元素分析 42 2.4 修改公共控件 43 2.5 源码中常用于参考的代码 44 3 程序开发 45 3.1 相关工具介绍 46 3.1.1 从c++到java(一) 46 3.1.2 从c++到java(二) 47 3.2 常用技术 49 3.2.1 如何新建和使用控件 49 3.2.2 使用定时器Timer及消息处理 51 3.2.3 操作调试数据库与ContentProvider详解 53 3.2.4 电源管理 56 3.2.5 开发桌面小程序AppWidget 58 3.2.6 代码中运行二进制程序或脚本 60 3.2.7 Android自带的md5校验 61 3.2.8 将数据打进apk包 63 3.2.9 如何改变窗口的标题栏的布局 66 3.2.10 动态改变控件大小 67 3.2.11 缩放drawable 68 3.2.12 解析apk包内容 69 3.3 Java对C库的调用 70 3.3.1 android中使用JNI 70 3.3.2 安装使用NDK 72 3.3.3 在源码中将库打进apk 73 3.3.4 简单的C库调试方法 75 3.4 典型应用 76 3.4.1 语音合成 76 3.4.2 语音识别简介 79 3.4.3 语音识别方法一:使用intent调用语音识别程序 80 3.4.4 语音识别方法二:应用程序自己调用语音识别库 82 3.4.5 语音识别方法三:使用Service调用语音识别程序 84 3.4.6 人脸识别 87 3.4.7 图像识别 89 3.4.8 文字识别 90 3.4.9 卫星定位 91 3.4.10 多媒体播放 95 3.4.11 访问网络 97 3.4.12 博客客户端实现 99 3.5 调试技术 102 3.5.1 JDWP调试 102 3.5.2 运行dalvik测试程序 103 3.5.3 测试小程序 104 3.5.4 dalvik提供的调试工具集 107 3.5.5 c++程序的调试 110 3.5.6 测试工具CTS 113 3.5.7 解决eclipse无法识别API的问题 115 3.5.8 调试方法补充 116 3.6 换肤(theme) 118 3.6.1 当前的换肤方法(theme) 118 3.6.2 制作换肤包 120 4 android架构层分析 122 4.1 启动过程 123 4.1.1 开机流程 123 4.1.2 开机动画 125 4.1.3 android应用的启动过程 127 4.2 服务的原理与使用 128 4.3 键盘事件处理 130 4.4 包管理 131 4.5 传感器 132 4.6 浅析dalvik虚拟机JIT技术的实现 133 4.7 应用程序的签名(Signature) 135 4.8 应用的权限 138 4.9 屏幕密度Density 140 4.10 Prelink实现的源码分析 142 4.11 适配硬件平台 145 4.12 其他介绍 147 4.12.1 手机保护Keyguard 147 4.12.2 空中升级Fota 148 4.12.3 Flash分区 149

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simple Simple

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值