*这节我只给大家介绍想要学会多线程下载必须掌握的相关原理!
无论是多线程下载,还是断点续传等复杂的功能,都需要先了解原理,遇到的问题。下面上图介绍一下。
逐个介绍一下。
http相关字段 :
1、Transfer-Encoding:chunked: 这个字段很重要,从字面意义上讲这是客户端接收传输的编码方式。这种编码方式的意思是,我们前段在展示一个比较大的内容的时候,服务器不是一次性把数据传过来的(一次性比较耗时),而是一块一块的传过来,这时候采用的就是“Transfer-Encoding:chunked”编码方式,而这样会有一个问题,就是在http响应头里面就会拿不到这个文件的总长度。“content-length”返回值是 -1。后面我会贴上代码,和解决方法。
2、content-length : 作用在响应头中的数据。它可以拿到这个文件的总长度,这个就可以多线程分配每个线程下载多少。 这个字段很重要。 而如果此时数据是“Transfer-Encoding:chunked:” 那么会拿不到文件的总长度,返回值是 -1。 一般静态的文本文件、图片等都是可以拿到的,最终能不能拿到取决于服务器
3、Range : 它可以访问服务器中某一个数据制定长度的内容。比如我们在多线程下载的时候,已经下载了一部分保存到本地了,然后我们第二次打开重新下载的时候,我们就可以通过Range指定可以从多少个字节接着下载。
多线程工作原理:
需要解决的问题:
下面给大家介绍了解一下多线程下载必须得到参数”文件的总长度 content-length“。
1、访问服务器,获取不到 ”文件的总长度 content-length“ 案例
访问www.qq.com ,它就是Transfer-Encoding:chunked 编码方式,一块一块传输的,不能文件总长度,代码如下,看一下。
public static void main(String args[]) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://www.qq.com").
build();
try {
Respon