编写断点续传和多线程下载模块

http://tech.ddvip.com   2006年07月13日    社区交流

本文详细介绍编写断点续传和多线程下载模块

  首先建立一个名为THttpGetThread、创建后自动挂起的线程模块,我希望线程在完成后自动销毁,所以在构造函数中设置:

  FreeOnTerminate = True; // 自动删除

  并增加以下成员变量:

  char Buffer[HTTPGET_BUFFER_MAX+4]; // 数据缓冲区
AnsiString FURL; // 下载对象的URL
AnsiString FOutFileName; // 保存的路径和名称
HINTERNET FhSession; // 会话句柄
HINTERNET FhConnect; // http连接句柄
HINTERNET FhRequest; // http请求句柄
bool FSuccess; // 下载是否成功
int iFileHandle; // 输出文件的句柄

  1、建⒘?lt;/p>

  按照功能划分,下载过程可以分为4部分,即建立连接、读取待下载文件的信息并分析、下载文件和释放占用的资源。建立连接的函数如下,其中ParseURL的作用是从下载URL地址中取得主机名称和下载的文件的WEB路径,DoOnStatusText用于输出当前的状态:

  //初始化下载环境
void THttpGetThread::StartHttpGet(void)
{
   AnsiString HostName,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.初始化下载请求
    const char *FAcceptTypes = "*/*";
    FhRequest = HttpOpenRequest(FhConnect,
       "GET", // 从服务器获取数据
       FileName.c_str(), // 想读取的文件的名称
       "HTTP/1.1", // 使用的协议
       NULL,
       &FAcceptTypes,
       INTERNET_FLAG_RELOAD,
       0);
    if( FhRequest==NULL)throw(Exception("Error:HttpOpenRequest"));
    DoOnStatusText("ok:HttpOpenRequest");
    // 4.发送下载请求
    HttpSendRequest(FhRequest, NULL, 0, NULL, 0);
    DoOnStatusText("ok:HttpSendRequest");
   }catch(Exception &exception)
   {
    EndHttpGet(); // 关闭连接,释放资源
    DoOnStatusText(exception.Message);
   }
}
// 从URL中提取主机名称和下载文件路径
void THttpGetThread::ParseURL(AnsiString &HostName,AnsiString &FileName)
{
   AnsiString URL=FURL;
   int i=URL.Pos("http://");
   if(i>0)
   {
    URL.Delete(1, 7);
   }
   i=URL.Pos("/");
   HostName = URL.SubString(1, i-1);
   FileName = URL.SubString(i, URL.Length());
}

责编:豆豆技术应用

正在加载评论...