2024年3月14日发(作者:)

断点续传技术浅谈《豆丁

断点续传,顾名思义就是在文件传输过程中由于网络中断或者其他原因造成传输中断,这时文

件只传输了一部分,在下次传输时能够接着前面的传输进度继续进行,而没有必要重头开始上

传下载。“断点续传”的概念就出来了,它可以节省时间,提高速度。

下载文件就是电脑与WEB服务器交互的过程,它们交互的“语言”的专业名称是协议。传送文

件的协议有多种,最常用的是HTTP(超文本传输协议)和FTP(文件传送协议),我现在介绍的是

采用HTTP。

HTTP协议最基本的命令只有三条:Get、Post和Head。

Get

从WEB服务器请求一个特定的对象,比如HTML页面或者一个文件,WEB服务器通过一个Socket

连接发送此对象作为响应。下载即是通过Get命令实现。

Post

Post命令用于向WEB服务器发送数据,通常使把信息发送给一个单独的应用程序,经处理生成

动态的结果返回给浏览器。

Head

Head命令使服务器给出此对象的基本描述,比如对象的类型、大小和更新时间。

编写下载程序,可以直接使用Socket函数,Windows提供了一套WinInetAPI,对常用的网络协

议进行了封装。我们需要使用的WinInetAPI函数如下图所示:

图1

在使用这些函数时,必须严格区分它们使用的句柄。这些句柄的类型是一样的,都是

HINTERNET。

函数名

作用

返回句柄

InternetOpen

建立会话

最先调用的函数,它返回的HINTERNET句柄级别最高hSession,即会话句柄。

InternetConnect

建立http连接

使用hSession句柄,返回的是http连接句柄,定义为hConnect。

HttpOpenRequest

建立http请求

使用hConnect句柄,返回的句柄是http请求句柄,定义为hRequest。

HttpSendRequest

发送http请求

都使用HttpOpenRequest返回的句柄,即hRequest。

HttpQueryInfo

取得文件信息

HttpQueryInfo

移动文件指针

InternetReadFile

读文件

InternetCloseHandle

关闭Internet句柄

当这几个句柄不再使用时,释放占用的资源。

首先建立一个名为THttpGetThread、创建后自动挂起的线程模块,在构造函数中添加

FreeOnTerminate=Tru完成后自动销毁。

并增加以下成员变量:

charBuffer[HTTPGET_BUFFER_MAX4];//数据缓冲区

AnsiStringFURL;//下载对象的URL

AnsiStringFOutFileName;//保存的路径和名称

HINTERNETFhSession;//会话句柄

HINTERNETFhConnect;//http连接句柄

HINTERNETFhRequest;//http请求句柄

boolFSuccess;//下载是否成功

intiFileHandle;//输出文件的句柄

下载过程可以分为4部分:

建立连接;

读取待下载文件的信息并分析;

下载文件;

释放占用的资源。

1、建立连接

建立连接的函数如下,其中ParseURL的作用是从下载URL地址中取得主机名称和下载的文件

的WEB路径,DoOnStatusText用于输出当前的状态:

//初始化下载环境

voidTHttpGetThread::StartHttpGet(void)

{

AnsiStringHostName,FileName;

ParseURL(HostName,FileName);

try

{

//1.建立会话

FhSession=InternetOpen(http-get-demo,

INTERNET_OPEN_TYPE_PRECONFIG,

NULL,NULL,

0);//同步方式

if(FhSession==NULL)throw(Exception(Error:InterOpen));

DoOnStatusText(ok:InterOpen);

//2.建立连接

FhConnect=InternetConnect(FhSession,

HostName.c_str(),

INTERNET_DEFAULT_HTTP_PORT,

NULL,NULL,

INTERNET_SERVICE_HTTP,0,0);

if(FhConnect==NULL)throw(Exception(Error:InternetConnect));

DoOnStatusText(ok:InternetConnect);

//3.初始化下载请求

constchar*FAcceptTypes=*/*;

FhRequest=HttpOpenRequest(FhConnect,

GET,//从服务器获取数据

FileName.c_str(),//想读取的文件的名称

HTTP/1.1,//使用的协议

NULL,