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

  • 一,需求分析
  • 二,主程序实现
  • 三,升级程序实现
  • 四,服务端程序实现


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

一,需求分析

     程序升级最常见的架构就是C/S架构了,包括主程序客户端,升级程序客户端,服务端程序。客户端每次启动向服务端发送请求,获取到最新版本号,与本地版本号进行对比。如果版本一致,那么不需要更新;如果客户端版本号小于服务端版本号,那么就弹出交互界面,询问用户是否需要升级,如果不升级,本次版本检测升级流程结束;如果升级,则让用户选择是“立即升级”和是“静默升级”。这两者区别如下:

1,“立即升级”指的是结束主程序进程,弹出升级界面,升级完成后,覆盖原有文件,并重新启动主程序,一般选择记住用户的账号名和密码,给用户减少操作步骤。

2,“静默升级”指的是升级程序客户端隐藏界面或缩小界面,在后台静默下载需要更新的文件,当下载完成后,既可以再次弹出交互界面,让用户确认是不是立即升级,还是等当次主程序退出后再升级;也可以一直隐藏在后台,等主程序退出后,自动替换更新后的文件,当用户下一次启动时,已经是最新版本。

升级最新redis 升级最新客户端_服务端

二,主程序实现

     主程序启动后,直接调用服务端接口获取到版本号信息,或者下载服务端的版本信息文件,再从文件中解析出版本号,然后与本地的版本号进行对比,如果版本不一致,提示用户升级。如果是“静默升级”,升级程序下载完升级文件后,挂在后台,主程序退出前通知升级程序替换文件;如果是“立即升级”,则主程序退出,并且通过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中的每一个文件进行下载操作,保存到升级程序本地。
     这里我之前考虑到的是在版本信息文件里加上需要升级的文件名(路径),由升级程序根据这个配置项去一个个的下载,但是又要考虑到服务端的易操作特点(升级文件的替换可能是由其他人来做),所以还是没有使用这个方法,而是由升级程序自己来遍历目录。