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

本文配套源码

概述

在当今的网络时代,下载软件是使用最为频繁的软件之一。几年来,下载技术也在不停地发展。最原始的下载功能仅仅是个“下载”过程,即从WEB服务器上连续地读取文件。其最大的问题是,由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。

随后,“断点续传”的概念就出来了,顾名思义,就是如果下载中断,在重新建立连接后,跳过已经下载的部分,而只下载还没有下载的部分。

无论“多线程下载”技术是否洪以容先生的发明,洪以容使得这项技术得到前所未有的关注是不争的事实。在“网络蚂蚁”软件流行开后,许多下载软件也都纷纷效仿,是否具?quot;多线程下载"技术、甚至能支持多少个下载线程都成了人们评测下载软件的要素。"多线程下载"的基础是WEB服务器支持远程的随机读取,也即支持"断点续传"。这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。

现在,不要说编写专门的下载软件,在自己编写的软件中,加入下载功能有时也非常必要。如让自己的软件支持自动在线升级,或者在软件中自动下载新的数据进行数据更新,这都是很有用、而且很实用的功能。本文的主题即怎样编写一个支持"断点续传"和"多线程"的下载模块。当然,下载的过程非常复杂,在一篇文章中难以全部阐明,所以,与下载过程关系不直接的部分基本上都忽略了,如异常处理和网络错误处理等,敬请各位读者注意。我使用的开发环境是C++ Builder 5.0,使用其他开发环境或者编程语言的朋友请自行作适当修改。

HTTP协议简介

下载文件是电脑与WEB服务器交互的过程,它们交互的"语言"的专业名称是协议。传送文件的协议有多种,最常用的是HTTP(超文本传输协议)和FTP(文件传送协议),我采用的是HTTP。

HTTP协议最基本的命令只有三条:Get、Post和Head。Get从WEB服务器请求一个特定的对象,比如HTML页面或者一个文件,WEB服务器通过一个Socket连接发送此对象作为响应;Head命令使服务器给出此对象的基本描述,比如对象的类型、大小和更新时间。Post命令用于向WEB服务器发送数据,通常使把信息发送给一个单独的应用程序,经处理生成动态的结果返回给浏览器。下载即是通过Get命令实现。

基本的下载过程

编写下载程序,可以直接使用Socket函数,但是这要求开发人员理解、熟悉TCP/IP协议。为了简化Internet客户端软件的开发,Windows提供了一套WinInet API,对常用的网络协议进行了封装,把开发Internet软件的门槛大大降低了。我们需要使用的WinInet API函数如图1所示,调用顺序基本上是从上到下,其具体的函数原型请参考MSDN。


图1

在使用这些函数时,必须严格区分它们使用的句柄。这些句柄的类型是一样的,都是HINTERNET,但是作用不同,这一点非常让人迷惑。按照这些句柄的产生顺序和调用关系,可以分为三个级别,下一级的句柄由上一级的句柄得到。

InternetOpen是最先调用的函数,它返回的HINTERNET句柄级别最高,我习惯定义为hSession,即会话句柄。

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

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

HttpSendRequest、HttpQueryInfo、InternetSetFilePointer和InternetReadFile都使用HttpOpenRequest返回的句柄,即hRequest。

当这几个句柄不再使用是,应该用函数InternetCloseHandle把它关闭,以释放其占用的资源。

首先建立一个名为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; // 输出文件的句柄

时间: 2024-10-02 13:41:45

编写断点续传和多线程下载模块的相关文章

PC版与Android手机版带断点续传的多线程下载_Android

一.多线程下载         多线程下载就是抢占服务器资源         原理:服务器CPU 分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服务器资源.       1.设置开启线程数,发送http请求到下载地址,获取下载文件的总长度           然后创建一个长度一致的临时文件,避免下载到一半存储空间不够了,并计算每个线程下载多少数据              2.计算每个线程下载数据的开始和结束位置           再次发送

PC版与Android手机版带断点续传的多线程下载

一.多线程下载 多线程下载就是抢占服务器资源 原理:服务器CPU 分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服务器资源. 1.设置开启线程数,发送http请求到下载地址,获取下载文件的总长度           然后创建一个长度一致的临时文件,避免下载到一半存储空间不够了,并计算每个线程下载多少数据              2.计算每个线程下载数据的开始和结束位置           再次发送请求,用 Range 头请求开始位置和结束位

一个Android项目多线程下载模块开源库:AndroidFileDownloader

使用场景 apk应用内更新,其他中小文件的下载,断点续传下载等,先来看看效果图: 简单方便的调用接口 调用者只要设置好下载路径.文件后缀,丢一个url即可开始下载,并且可以根据需要监听进度,例如: FileDownloader mDownloader = FileDownloader.getInstance(getApplication()); mDownloader.setExtend(".apk"); mDownloader.setFilePath(Environment.getE

android多线程下载模块

<strong>使用场景</strong> apk应用内更新,其他中小文件的下载,断点续传下载等,先来看看效果图: <br/> <strong>简单方便的调用接口</strong> 调用者只要设置好下载路径.文件后缀,丢一个url即可开始下载,并且可以根据需要监听进度,例如:    FileDownloader mDownloader = FileDownloader.getInstance(getApplication()); mDownloa

python支持断点续传的多线程下载示例_python

复制代码 代码如下: #! /usr/bin/env python#coding=utf-8 from __future__ import unicode_literals from multiprocessing.dummy import Pool as ThreadPoolimport threading import osimport sysimport cPicklefrom collections import namedtupleimport urllib2from urlparse

java多线程下载和断点续传

  java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class DownloadFile { /

Android多线程下载

项目源码下载 https://github.com/Wang-Jun-Chao/AndroidProjects 多线程下载 原理:服务器CPU分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服务器资源 确定每条线程下载多少数据 发送http请求至下载地址 String path = URL url = new URL(path) HttpURLConnection conn = (HttpURLConnection) url() conn()

用VB编写异步多线程下载程序

程序|多线程|下载|异步 为了高效率地下载某站点的网页,我们可利用VB的Internet Transfer 控件编写自己的下载程序, Internet Transfer 控件支持超文本传输协议 (HTTP) 和文件传输协议 (FTP),使用 Internet Transfer 控件可以通过 OpenURL 或 Execute 方法连接到任何使用这两个协议的站点并检索文件.本程序使用多个Internet Transfer 控件,使其同时下载某站点.并可判断文件是否已下载过或下载过的文件是否比服务器

.Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)

client|web|多线程|客户端|下载 /* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient) * Reflector 了一下 System.Net.WebClient ,重载或增加了若干: * DownLoad.Upload 相关方法! * DownLoad 相关改动较大! * 增加了 DataReceive.ExceptionOccurrs 事件! * 了解服务器端与客户端交互的 HTTP 协议参阅: * 使文件