Android通过HTTP协议实现多线程下载

标签: android http 协议 | 发表时间:2017-02-20 09:58 | 作者:jishudaren
出处:http://www.iteye.com

import java.io.File;  

import java.io.InputStream;  

import java.io.RandomAccessFile;  

import java.net.HttpURLConnection;  

import java.net.URL;  

  

public class MulThreadDownload {  

  

    /** 

     * @param args 

     */  

    public static void main(String[] args) {  

        String path = "http://net.itcast.cn/QQWubiSetup.exe";  

        try {  

            new MulThreadDownload().download(path, 3);  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

    }  

    /** 

     * 从路径中获取文件名称 

     * @param path 下载路径 

     * @return 

     */  

    public static String getFilename(String path){  

        return path.substring(path.lastIndexOf('/')+1);  

    }  

    /** 

     * 下载文件 

     * @param path 下载路径 

     * @param threadsize 线程数 

     */  

    public void download(String path, int threadsize) throws Exception{  

        URL url = new URL(path);  

        HttpURLConnection conn = (HttpURLConnection)url.openConnection();  

        conn.setRequestMethod("GET");  

        conn.setConnectTimeout(5 * 1000);  

        int filelength = conn.getContentLength();//获取要下载的文件的长度  

        String filename = getFilename(path);//从路径中获取文件名称  

        File saveFile = new File(filename);  

        RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");  

        accessFile.setLength(filelength);//设置本地文件的长度和下载文件相同  

        accessFile.close();  

        //计算每条线程下载的数据长度  

        int block = filelength%threadsize==0? filelength/threadsize : filelength/threadsize+1;  

        for(int threadid=0 ; threadid < threadsize ; threadid++){  

            new DownloadThread(url, saveFile, block, threadid).start();  

        }  

    }  

      

    private final class DownloadThread extends Thread{  

        private URL url;  

        private File saveFile;  

        private int block;//每条线程下载的数据长度  

        private int threadid;//线程id  

  

        public DownloadThread(URL url, File saveFile, int block, int threadid) {  

            this.url = url;  

            this.saveFile = saveFile;  

            this.block = block;  

            this.threadid = threadid;  

        }  

  

        @Override  

        public void run() {  

            //计算开始位置公式:线程id*每条线程下载的数据长度= ?  

            //计算结束位置公式:(线程id +1)*每条线程下载的数据长度-1 =?  

            int startposition = threadid * block;  

            int endposition = (threadid + 1 ) * block - 1;  

            try {  

                RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");  

                accessFile.seek(startposition);//设置从什么位置开始写入数据  

                HttpURLConnection conn = (HttpURLConnection)url.openConnection();  

                conn.setRequestMethod("GET");  

                conn.setConnectTimeout(5 * 1000);  

                conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);  

                InputStream inStream = conn.getInputStream();  

                byte[] buffer = new byte[1024];  

                int len = 0;  

                while( (len=inStream.read(buffer)) != -1 ){  

                    accessFile.write(buffer, 0, len);  

                }  

                inStream.close();  

                accessFile.close();  

                System.out.println("线程id:"+ threadid+ "下载完成");  

            } catch (Exception e) {  

                e.printStackTrace();  

            }  

        }         

    }  

  

}



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [android http 协议] 推荐:

Android通过HTTP协议实现多线程下载

- - 移动开发 - ITeye博客
     * 从路径中获取文件名称 .      * @param path 下载路径 .      * 下载文件 .      * @param path 下载路径 .      * @param threadsize 线程数 .         int filelength = conn.getContentLength();//获取要下载的文件的长度  .

Http协议详解

- - 浏览器 - 互联网 - ITeye博客
什么是HTTP协议 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器 目前我们使用的是HTTP/1.1 版本 Web服务器,浏览器,代理服务器 当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页.

http协议知识点

- - 互联网 - ITeye博客
媒体类型:http服务器会给在http中传送的http资源对象附加一个MIME类型,接收http资源对象的客户端会根据这个类型来判断是否能够进行处理,例如浏览器就能够处理上百种mime类型的http资源对象. MIME类型是一种文本标记,表示一种主要对象类型和一种特定的子类型,中间用一条斜杠来分隔,例如text/html、imge/gif.

HTTP 协议中的 Transfer-Encoding

- - JerryQu 的小站
本文作为我的博客「 HTTP 相关」专题新的一篇,主要讨论 HTTP 协议中的 Transfer-Encoding. 这个专题我会根据自己的理解,以尽量通俗的讲述,结合代码示例和实际场景来说明问题,欢迎大家关注和留言交流. Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.

Android中HTTP相关的API

- - 技术小黑屋
Android中大多数应用都会发送和接受HTTP请求,在Android API中主要由两个HTTP请求的相关类,一个是HttpURLConnection,另一个是Apache HTTP Client. 这两个类实现的HTTP请求都支持HTTPS协议,基于流的上传和下载,可配置超时时间,IPv6和连接池.

http协议:Web前端-HTTP Cache-control/浏览器缓存(转)

- - 互联网 - ITeye博客
HTTP协议分别在 1.0 / 1.1 两个时代推出了 Expires / Cache-control 两种cache策略,这里我们无需了解全部的细节,无需记住整个RFC内容,但是当我们需要使用HTTP cache策略时,我们需要注意以下细节:. Expires 是HTTP 1.0 那个时代的东西了,目前来看,可以不使用了,因为HTTP 1.0 的user agent占有率在 0.1% 以下(我们主要面向的web浏览器均默认使用HTTP 1.1),Cache-control 是 HTTP 1.1 的新特性,也是我们主要做文章使用cache策略的工具.

[转][转]深入理解HTTP协议

- - heiyeluren的Blog
来源: http://www.blogjava.net/zjusuyong/articles/304788.html.   HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写. 它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本.

http协议详解(超详细)转

- - 行业应用 - ITeye博客
http 协议学习系列       HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.   HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写. 它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本.

浅析http协议与缓存

- - 博客园_Ruby's Louvre
最近几天在复习http协议中headers,缓存等相关知识,发现些新知识点. 这篇文章注重结合PHP去理解这些内容,也就是比较注重实践部分. 一、http headers. NO1:对于web应用,用户群在客户端 (各种浏览器)点击任何一个连接向服务器发送http请求,这过程肯定需要3次握手,建立连接,服务器响应返回数据.

探索HTTP/2: HPACK协议简述(原)

- - BlogJava-首页技术区
探索HTTP/2: HPACK协议简述. 在本系列的第一篇文章中已经介绍了HTTP 2协议,本文则将简述用于HTTP/2头部压缩的 HPACK协议. (2016.09.24最后更新).     HPACK头部压缩的基本原理就是使用索引表和 Huffman编码. 在压缩(编码)与解压(解码)过程,可将指定的头部字段(包含字段名与字段值)存储在索引表中.