在请求头里设置Range,可以拿到不同的部分,前提还需要web server支持。
/**
* 开始下载
* @throws Exception
*/
public void startDown() throws Exception{
HttpClient httpClient = new DefaultHttpClient()
try {
//获取下载文件信息
getDownloadFileInfo(httpClient)
startDownloadThread()
//开始监视下载数据
monitor()
} catch (Exception e) {
throw e
} finally {
httpClient.getConnectionManager().shutdown()
}
}
/**
* 获取下载文件信息
*/
private void getDownloadFileInfo(HttpClient httpClient) throws IOException,
ClientProtocolException, Exception {
HttpHead httpHead = new HttpHead(url)
HttpResponse response = httpClient.execute(httpHead)
//获取HTTP状态码
int statusCode = response.getStatusLine().getStatusCode()
if(statusCode != 200) throw new Exception("资源不存在!")
if(getDebug()){
for(Header header : response.getAllHeaders()){
System.out.println(header.getName()+":"+header.getValue())
}
}
//Content-Length
Header[] headers = response.getHeaders("Content-Length")
if(headers.length > 0)
contentLength = Long.valueOf(headers[0].getValue())
httpHead.abort()
httpHead = new HttpHead(url)
httpHead.addHeader("Range", "bytes=0-"+(contentLength-1))
response = httpClient.execute(httpHead)
if(response.getStatusLine().getStatusCode() == 206){
acceptRanges = true
}
httpHead.abort()
}
/**
* 启动多个下载线程
* @throws IOException
* @throws FileNotFoundException
*/
private void startDownloadThread() throws IOException,
FileNotFoundException {
//创建下载文件
File file = new File(localPath)
file.createNewFile()
RandomAccessFile raf = new RandomAccessFile(file, "rw")
raf.setLength(contentLength)
raf.close()
//定义下载线程事件实现类
DownloadThreadListener listener = new DownloadThreadListener() {
public void afterPerDown(DownloadThreadEvent event) {
//下载完一个片段后追加已下载字节数
synchronized (object) {
DownloadTask.this.receivedCount += event.getCount()
}
}
public void downCompleted(DownloadThreadEvent event) {
//下载线程执行完毕后从主任务中移除
threads.remove(event.getTarget())
if(getDebug()){
System.out.println("剩余线程数:"+threads.size())
}
}
}
//不支持多线程下载时
if (!acceptRanges) {
if(getDebug()){
System.out.println("该地址不支持多线程下载")
}
//定义普通下载
DownloadThread thread = new DownloadThread(url, 0, contentLength, file, false)
thread.addDownloadListener(listener)
thread.start()
threads.add(thread)
return
}
//每个请求的大小
long perThreadLength = contentLength / threadCount + 1
long startPosition = 0
long endPosition = perThreadLength
//循环创建多个下载线程
do{
if(endPosition >= contentLength)
endPosition = contentLength - 1
DownloadThread thread = new DownloadThread(url, startPosition, endPosition, file)
thread.addDownloadListener(listener)
thread.start()
threads.add(thread)
startPosition = endPosition + 1//此处加 1,从结束位置的下一个地方开始请求
endPosition += perThreadLength
} while (startPosition < contentLength)
}
vc6使用httpclient需要相关的库。根据查询相关公开信息,VC6使用HTTPClient需要相关的库,可以从网上下载相应的lib文件,放到VC6的库文件夹中,然后使用#include"htttpclient.h"来包含httpclient库。具体的使用方法详见官方文档或可以参考相关的链接。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)