基于 HTTP协议的自动更新软件设计
阮宁君
长江大学电信学院,湖北荆州(434020)
摘 要:本文介绍一种基于 HTTP协议的自动更新软件的设计原理与实现。该软件具有可以
自动定时检测软件是否有新版本、自动更新软件、可自动更新自动更新软件本身、检测服务
器是否工作正常、独立性好、使用方便等诸多优点,可广泛应用于各种大型应用软件和游戏
软件。
关键词:HTTP,自动更新,套接字
由于现在信息更新速度日新月异,用户的要求也在不段提高,因此对与应用软件来说,
必须要有自动更新软件来支持软件的不断更新以满足用户的需要。本文将讨论一个基于
HTTP 协议的自动更新软件的设计原理及功能的实现。
1. 基于 HTTP 自动更新软件的功能概述
HTTP 协议简介
HTTP(HyperTextTransferProtocol)是超文本传输协议[1]的缩写,它用于传送 WWW 方
式的数据,关于 HTTP 协议的详细内容请参考 RFC2616。HTTP 协议采用了请求/响应模型。
客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修
饰符、客户信息和内容的类似于 MIME 的消息结构。服务器以一个状态行作为响应,相应
的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能
的实体内容。
通常 HTTP 消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两
种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体
组成。HTTP 的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,
冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,
头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
套接字(Socket)简介
Socket(套接字)是一种网络编程接口[2],Socket 提供了很多灵活的函数,Socket 分为
BSD UNIX 和 windows 两个版本。在 win32 平台上的 Winsock 编程都要经过下列基本步骤:
定义变量——获得 Winsock 版本——加载 Winsock 库——初始化——创建套接字——设置
套接字——关闭套接字——卸载 Winsock 库
使用 winsock2 API 编程,必须包含头文件 (链接环境 ),头
文件 ()是为了兼容 winsock1 程序时使用的,另外
()是微软的扩展类,用于开发高性能的 winsock 程序。
Socket 通信分为面向连接的通信(TCP)和面向无连接的通信(UDP),本文使用的是
面向连接的通讯,Socket 通信流程如图 1:
1
图 1 Socket 通信流程
自动更新软件的功能
基于 HTTP 的自动更新软件是一款功能齐全的自动更新软件,不断能更新其父软件,也
可以更新自动更新软件本身,其主要功能如下:
(1) 可根根据要随时检测其父软件是否有新版本发布。也可以配合父软件完成更新工作,
即由父软件定时检测该软件是否有新版本发布,有则启动自动更新软件,关闭父软
件,待更新父软件成功后自动关闭自动更新软件并重新启动更新后的父软件。
(2) 下载之前会先通过检测服务器 IIS 返回消息来判断服务器是否工作正常,如果连接
出现问题会弹出消息提示用户。
服务端 客户端
Socket()建立流式套接字,返
回套接字号 s
bind(),套接字 s 与本地地址相连
Listen(),通知 TCP 服务器准备好接收
连接
Accept(),接收连接,等待客户端连接
建立连接,Accept()返回,得到新的
套接字,如 ns
recv()/send(),在套接字 ns 上读/写数
据,直到完成交换数据
Closesocket(),关闭套接字 ns
Closesocket()关闭最初套接
字 s,服务结束
Socket()建立流式套接字,返
回套接字号 s
Connect(),将套接字 s 与远程
服务端连接
recv()/send(),在套接字 ns 上读/写数
据,直到完成交换数据
Closesocket(),关闭套接字 s,
结束 TCP 对话
2
(3) 更新使用先全部下载到临时文件夹,后更新的策略。从而防止了更新期间由于网络
故障或服务器故障而使更新失败而导致父软件使用出现问题的问题。
(4) 更新时所下载的待更新软件名称及下载是否成功会在自动更新软件上显示出来,直
观的显示整个更新过程。
(5) 如果自动更新软件本身出现小 BUG 或者需要改进,也可以随时更新自动更新软件本
身。
2. 各功能的设计与实现
本软件的设计流程图
基于 HTTP 的自动更新软件的总体设计流程图如图 2:
3
-2-
开始
初始化升级软件对话框
判断文件
是否存在
删除该文件
Y
初始化套接字
N
向服务器发送请求头与服务器建立连接
判断服务器是否开启
判断是否有新版本
Y
获取待更新文件列表
判断待更新文件是否存在
开始下载待更新文件
Y
Y
判断文件是否全部下载成功
判断待更新文件是否包含
Y
重命名现有 为
开始移动下载的新文件覆盖旧文件
Y
结束
N
N
N
N
N
图 2 流程图
4
图 2 流程图
自动检测是否有新版本功能的实现
首先在启动自动更新软件时获取父窗口的当前版本号,然后连接到更新服务器获取服
务器上该软件的最新版本号,将二者作比较,如果不相等则为有新版本,提示用户发现新版
本,询问用户是否需要更新。
如果检测软件是否有新版本及询问用户是否需要更新功能是由父软件完成,则在用户
点击”是”的时候将关闭父软件并启动自动更新软件。
检测服务器是否工作正常功能的实现
此功能是在下载待更新文件前的必要准备工作,首先由套接字建立与服务器的连接,
然后发送 HTTP 请求头[1],并回去服务器的返回头,然后分析返回头的消息便可以知道服务
器是否工作正常,如果正常则继续往下执行,如果出现异常则弹出提示消息告诉用户服务器
出现故障,暂时不能更新软件,请稍后再更新。
下在待更新文件及覆盖旧文件功能的实现
当检测到服务器工作正常后开始获取需要更新文件的信息,并开始使用套接字的
Receive 函数从服务器下载文件到指定文件夹或者新建的临时文件夹[3]。在下载过程中将正
在下载的文件信息及成功与否显示在自动更新软件界面的一个 LIST 控件上,让用户可以知
道自动更新软件的工作状态。如果下载文件全部成功,则开始使用 CFile 类的 Move 函数来
移动文件到指定位置进行更新。如果下载中间出现意外导致下载失败,也在 LIST 文件上显
示下载失败的文件信息,但不进行移动。
自动更新软件的自更新更能的实现
在获取待更新软件时如果发现 文件(即和自动更新软件同名),则说明需要
更新自动更新软件本身。则在所有待更新文件都下载成功,开始分别移动文件到对应位置完
成更新的时候,如果发现所移动的文件名为 则先使用 Rename 函数[3]更改当前正
在执行的 为 ,然后把新下载的 移动到该位置。并在下
次启动自动更新软件时先查找该目录下是否有 文件,如果有则使用 DeleteFile
函数删除该文件,已免其占用存储空间。
3. HTTP 服务端设计
在服务器上建一个自动更新网站,将软件的最新版本信息、待更新文件信息—包括文
件应放置的位置放在该网站上即可。
参考文献
[1][美] Stephen C. Dewhurst 著 ,《Visual C++ 2005 入门经典》 ,人民邮电出版社.
[2](美)埃克尔 等著,刁成嘉 等译 ,《C++编程思想(第 2 卷)实用编程技术》——计算机科学丛书 ,
机械工业出版社.
[3]郑莉 等编著 ,《C++语言程序设计案例教程》 ,清华大学出版社.
5
A Automatic Updates software design Based on the HTTP
protocol
Ruan Ningjun
Department of Electronic&information,Yangtze University,Jingzhou,Hubei(434020)
Abstract
This paper Introduced a automatically update software based on the HTTP protocol’s design principles
and implementation. The software is automatically detected regularly whether there is a new version of
software、Automatic software update、Can automatically update itself、Check whether the work of
normal server、Good independence、Easy to use, and many other advantages, can be widely used in
various software applications and games.
Keywords:HTTP,Automatic Updates,Socket
6
Text2: