现在的位置: 首页 > 综合 > 正文

Http多线程下载

2017年12月07日 ⁄ 综合 ⁄ 共 1954字 ⁄ 字号 评论关闭

    这里使用的服务器是Appach服务器。支持HTTP协议,同时,HTTP协议支持下载,所以在HTTP的基础上实现多线程下载,非常的简单。通过HTTP的特定命令,可以获取目标文件的大小,还可以设定开始下载的位置。代码如下:非常简单,不做多解释。

public void downLoader() throws Exception{
		URL url = new URL(this.path);
		HttpURLConnection  httpURLConnection = (HttpURLConnection) url.openConnection();  //简历一个http连接
		httpURLConnection.setRequestMethod("GET");  //设置请求头
		httpURLConnection.setReadTimeout(5*1000);  //设置连接超时时间
  		/*获取文件大小*/
 		this.fileLength = httpURLConnection.getContentLength();
 		/*获取文件名称*/
 		this.fileName = this.getFileName(path);   //就是获取path最后的一段作为名字
 		saveFileGlobal = new File(fileName);
 		System.out.println("saveFileGlobal="+saveFileGlobal);
 		RandomAccessFile randomAccessFile = new RandomAccessFile(saveFileGlobal, "rwd");  //创建一个RandomAccessFile进行保存,因为RandomAccessFile有一个特点就是可以被多个线程打开,同时可以移动写入点的位置。
 		randomAccessFile.setLength(fileLength);
 		randomAccessFile.close();
		 /*开始创建线程进行下载*/
		 for(int threadId=0;threadId<threadSize;threadId++){
			 new DownLoaderThread(threadId, url, saveFileGlobal, fileLength*threadId/threadSize,
					 fileLength*(threadId+1)/threadSize-1).start();
		 }
		
	}

上面代码的主要工作,只是完成了对服务器文件的属性的获取,包括文件名,文件大小。已经开启多个线程进行下载。建议线程数在10左右,不要太多。下面则是每个线程具体的工作,完成自己需要下载的内容,然后写入同一个文件

public class DownLoaderThread extends Thread{

     .........................................
        @Override
        public void run(){
            
            try {
                HttpURLConnection conn = (HttpURLConnection) this.url.openConnection();
                conn.setRequestMethod("GET");   //设置请求头
                conn.setReadTimeout(5*1000);   //设置超时时间
                conn.setRequestProperty("Range", "bytes="+startPostion+"-"+endPostion);  /<span style="color:#FF0000;">/这句话很重要,告诉服务器,我们需要需要服务器返回请求文件的哪一段数据</span>
                RandomAccessFile randomFile = new RandomAccessFile(saveFile, "rwd");  //创建文件
                randomFile.seek(startPostion);    //移动文件写入地址
                InputStream inStream = conn.getInputStream();   //写入
                byte[] buffer = new byte[1024*1024];
                int length;
                while((length = inStream.read(buffer)) != -1){
                    randomFile.write(buffer, 0, length);
                }
                inStream.close();
                randomFile.close();
                Log.v("Debug", "线程"+threadId+"完成下载");
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        }

HTTP多线程下载,就这么简单,建议在WIFI下进行。主要是HTTP协议已经对下载有很好的支持。

抱歉!评论已关闭.