断点续传和多线程下载(二)

Unity开发(二) 多线程断点续传文件下载管理器(下) 接上一篇文章 上一篇文章重点阐述了文件下载管理器的多线程管理部分的内容,这篇文章解决单个文件下载断点续传的实现。 断点续传下载文件 文件下载流程 针对文件下载,要保证准确性和高效,设计了如下的流程 开始获取文件长度下载文件MD5校验下载完成解压文件 本文并不涉及解压文件,只是抛砖引玉,有需求读者自行修改 网络选型 TIP:为什么选HttpWebRequest? Unity提供了WWW和Unity... 阅读详情

接着第一篇的后面,上次是实现了断点续传的功能,下载的时候能够暂停,程序退出的时候,会记录下载的断点位置,下次再进行下载的时候会接着上次没有下载完成的地方下载。

这一篇在原来断点续传的基础上加入多线程下载的功能。多线程下载,就是把一个下载任务原先是一个子线程完成下载的。现在把这个下载任务分配给多个子线程来下载,已达到占用较多的带宽来下载资源的目的。

1、首先得到下载的文件的大小,然后根据下载的子线程数来分配每个线程负责下载的部分

2、将每个子线程的负责下载的位置,即startPos和endPos都分配好之后,保存到数据库中

3、从容器中把每个线程拿出来,然后创建下载任务,开始下载

4、下载的时候,HttpURLConnection的setRequestProperty()方法注意请求得到的文件长度为该线程之前分配好的文件长度

5、下载中,同断点续传一样,一边下载时,一边将每个线程的下载进度保存到数据库中


部分代码:

	@Override
	protected List<DownloadInfo> doInBackground(String... args) {
		String urlStr = args[0];
		infos = DownloadDao.getInstance(context).getDownloadInfos(urlStr);
		if (infos == null || infos.isEmpty()) {
			try {
				URL url = new URL(args[0]);
				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();
				conn.setReadTimeout(5000);
				conn.setRequestMethod("GET");
				fileSize = conn.getContentLength();

			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			int range = fileSize / threadCount;
			for (int i = 0; i < threadCount - 1; i++) {
				DownloadInfo info = new DownloadInfo(fileSize, 0, urlStr, i
						* range, (i + 1) * range - 1, i);
				infos.add(info);
			}
			DownloadInfo info = new DownloadInfo(fileSize, 0, urlStr, fileSize
					- range, fileSize, threadCount - 1);
			infos.add(info);

			DownloadDao.getInstance(context).saveDownloadInfos(infos);

			return infos;
		}
		return infos;
	}

	@Override
	protected void onPostExecute(List<DownloadInfo> infos) {
		super.onPostExecute(infos);
		if (infos == null && infos.isEmpty()) {
			return;
		}
		int progress = getProgress(infos);
		getFileSize(infos);
		callback.setProgress(progress,fileSize);
		DownloadTask task = new DownloadTask(context, handler,fileSize);
		task.STATE = DownloadTask.DOWNLOADING;
		task.download(infos);
	}

DownloadTask:

package com.shulf.downloadtest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.List;

import android.content.Context;
import android.os.Handler;
import android.os.Message;

/**
 * 下载线程类,得到下载实体中的信息,开启线程进行下载
 * 
 * @author Administrator
 * 
 */
public class DownloadTask{

	private Handler handler;
	
	private Context context;
	
	/*
	 * 下载的文件大小
	 */
	private int fileSize;
	
	/*
	 * 整个文件下载的完成度
	 */
	private int mComplete = 0;
	
	/*
	 * 下载状态
	 */
	public static int DOWNLOADING = 1;
	
	/*
	 * 暂停状态
	 */
	public static int PAUSE = 2;
	
	public static int STATE = DOWNLOADING;// 1表示未下载状态,2表示暂停状态

	public DownloadTask(Context context, Handler handler,int fileSize) {
		this.fileSize = fileSize;
		this.context = context;
		this.handler = handler;
	}
	
	/**
	 * 得到下载的所有下载实体(所有线程)
	 * @param infos
	 */
	public void download(List<DownloadInfo> infos) {
		for (int i = 0; i < infos.size(); i++) {
			DownloadInfo info = infos.get(i);
			new DownloadThread(info).start();
		}
	}
	
	/**
	 * 开启线程正式下载
	 * @author Administrator
	 *
	 */
	private class DownloadThread extends Thread {
		private DownloadInfo info;

		public DownloadThread(DownloadInfo info) {
			this.info = info;
		}

		@Override
		public void run() {
			HttpURLConnection conn = null;
			InputStream in = null;
			RandomAccessFile randomAccessFile = null;
			File saveFile = new File("/mnt/sdcard/", "test.apk");
			int completeSize = info.completeSize;
			try {
				URL url = new URL(info.url);
				conn = (HttpURLConnection) url.openConnection();
				conn.setConnectTimeout(5000);
				conn.setRequestMethod("GET");
				/** 设置请求头的属性,从断点处开始到文件的长度 */
				conn.setRequestProperty("Range", "bytes="
						+ (info.startPos + completeSize) + "-" + info.endPos);

				randomAccessFile = new RandomAccessFile(saveFile, "rwd");
				randomAccessFile.seek(info.startPos + completeSize);

				in = conn.getInputStream();
				byte[] buffer = new byte[4096];
				int length = -1;
				while ((length = in.read(buffer)) != -1) {
					randomAccessFile.write(buffer, 0, length);
					completeSize += length;
					DownloadDao.getInstance(context).updateComplete(
							info.threadId, info.url, completeSize);
					Message msg = Message.obtain();
					msg.what = 1;
					msg.arg1 = length;
					msg.arg2 =fileSize;
					handler.sendMessage(msg);
					if (STATE == PAUSE) {
						return;
					}
				}
			} catch (ProtocolException e) {
				e.printStackTrace();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (in != null) {
						in.close();
					}
					if (randomAccessFile != null) {
						randomAccessFile.close();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		}
	}

}



仿迅雷实现下载工具,支持断点续传和多线程下载以及简单界面展示 这篇博客介绍一下在公司实习时选做的一个项目,虽然实习期间没有全部完成,但觉得这个项目做好的话挺有意思的,就在之后几天赶着完善了这个项目。 博客最后给出代码地址 这个项目是仿照迅雷,实现一个下载工具。 (开发平台: Ubuntu 16) 功能:能由一个基于HTTP协议的网络资源链接,把该链接对应的资源下载到本地,并且显示下载时的状态(进度条、下载百分比、已下载时间、当前下载速度、自己又在后面... 阅读详情

相关推荐

Java代码实现多线程下载和断点续传

- 多线程下载原理 客户端要下载一个文件, 首先请求服务器,服务器将这个文件传送给客户端,客户端保存到本地, 完成了一个下载的过程. 多线程下载的思想是客户端开启多个线程同时下载,每个线程只负责下载文件的一部分, 当所有线程下载完成的时候,文件下载完毕. 并不是线程越多下载越快, 与网络环境有很大的关系 在同等的网络环境下,多线程下载速度要高于单线程. 多线程下载占用资源比单线程多,相当于用资源换

喜洋洋 1万+

多线成下载断点续传

多线成下载断点续传1.了解一下多线程下载的思路    思路:开启多个线程下载同一个文件,这样可以使我们的下载文件的速度加快。如果我们使用单一的线程去下载。下载速度慢。断点续传1.断点续传需要在下载过程中记录每条线程的下载进度 2.每次下载开始之前先读取数据库,查询是否有未完成的记录,有就继续下载,没有则创建新记录插入数据库3.在每次向文件中写入数据之后,在数据库中更新下载进度4.下载完成之后删除数据

拼搏的少年的博客 511

C#用HTTP协议实现多线程文件下载和断点续传

(1) 多线程文件下载的总体思路是:把一个下载任务分配给多个线程,首先获取文件的长度,平分给多个线程,每个线程负责指定的文件块,待全部线程完成后,再把各个线程下载的临时文件合并。

q626779313的专栏 5696

带断点续传的多线程下载

多线程下载 原理:服务器CPU分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服务器资源,所以使用多线程下载的话,速度会更快。 JavaSE实现带断点续传的多线程下载步骤: 1、发送http请求至下载地址,获取要下载的资源文件的大小 2、根据资源文件的大小,创建一个长度一样的临时文件,用来抢占磁盘空间 3、计算每个线程要下载的数据大小和开始位置、...

chenyuanshengboke的博客 341

多线程下载与断点续传

1. 为什么要使用断点续传 在进行数据上传的时候可能是多线程操作,很多图像数据同时做上传或者单一的图像,如果图像比较多或者单一图像数据比较大,自然不希望失败一次或者暂停一次之后完全重传,有断点续传功能可以节省网络流量和节省用户时间,体验自然比你一次次的重传好很多。 2. 什么是断点续传 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。HTTP/1.1 开始就支持了。一般断点下载时才用到 Range 和 Content-Range 实体头。 2.1什么是Range? 当用户在听一首歌的时候,

ForgetSky的博客 1250

网络编程——断点续传和多线程下载模式

概述    在当今的网络时代,下载软件是使用最为频繁的软件之一。几年来,下载技术也在不停地发展。最原始的下载功能仅仅是个“下载”过程,即从WEB服务器上连续地读取文件。其最大的问题是,由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。    随后,“断点续传”的概念就出来了,顾名思义,就是如果下载中断,在重新建立连接后,跳过已经下载的部分,而只下载还没有下载的

phphot 3400

多线程断点续传下载实践

各位同学,大家好,时隔半年我又回来了。这半年发生了很多事情… 感受颇为深刻,沾染上了赌博,输了十多W,很是后悔 但还能怎么样,接着撸代码吧 17年把输的钱好好敲代码赚回来。 大家如果有什么 项目呀都可以找我做。 有项目可以找我做。 有项目可以找我做。 有项目可以找我做。开始撸吧 ,大家可以下看下 大概实现的功能以及最终效果;需要达成的目标实现的功能 文件可分为多段线程下载

温利东 的博客 805

Android多线程断点续传下载原理及实现

这段时间看了看工作室的工具库的下载组件,发现其存在一些问题: 1.下载核心逻辑有 bug,在暂停下载或下载失败等情况时有概率无法顺利完成下载。 2.虽然原来的设计是采用多线程断点续传的设计,但打了一下日志发现其实下载任务都是在同一个线程下串行执行,并没有起到加快下载速度的作用。 考虑到原来的代码并不复杂,因此对这部分下载组件进行了重写。这里记录一下里面的多线程断点续传功能的实现。 更多完整项...

Android_SE的博客 957

多线程断点续传

多线程下载涉及到的知识点: 1、Service的使用:我们在Service中去下载文件; 2、Thread的使用:Service本身不支持耗时操作,所以我们要去开启线程; 3、Sqlite的使用:使用数据库来存储每个线程下载的文件的进度,和文件的下载情况; 4、权限:涉及到文件的读写就要用到权限; 5、BroadCastReceiver的使用:通过广播来更新下载进度; 6、线程池使用:...

hello_1s的博客 3173

Android 中实现多线程下载和断点续传的原理和代码

在上一章,用Java代码实现了 多线程下载和断点续传, 现在我们将它移植到 Android 上面.下面这个类能帮助我们实现多线程下载和断点续传功能. 介绍一下这个类的使用方法.快速下载 1. 该类的构造方法需要提供三个参数. 2. public MuchThreadDown(String path, String targetFilePath, int threadCount)

喜洋洋 2486

多线程下载支持断点续传

使用HttpURLConnection写的一个多线程下载工具,支持断点续传

重游java系列一 线程二(多线程下载和断点续传)

本篇文章以你文件下载中的多线程下载以及断点续传为问题出发点,主要回顾一下多线程在实际开发中的应用和具体实现。 多线程下载的关键点在于对一个下载任务进行切分,即计算每个任务线程对应的实际文件中的起始点和终止点。在每个线程中采用数据流方式对远程文件进行连接,这里有个知识点,即http头Rander参数,详见[url]http://guoba6688-sina-com.iteye.c...

ilikeyoudo的专栏 172

Edge浏览器IE模式失效?最新142版本隐藏按钮的3种解决方案

本文针对Edge浏览器142版本中IE模式按钮消失的问题,提供了3种实用解决方案,包括注册表修改、手动添加网站到IE模式列表和企业策略部署方案,帮助用户解决兼容性问题,确保老旧系统正常访问。

weixin_28308325的博客 503

okhttp java_基于OkHttp实现Java多线程下载方案分析与实现

说明这篇文章主要是为了演示OkHttp和多线程的简单运用,利用多线程和HTTP断点续传的特性实现多线程下载。总体分为三种实现发难,并且实现了这三种方案。这里先说明,这只是一个Demo程序,为了快速实现功能,所以没有太多设计思想在里面,很多异常情况也没有考虑。所以,不喜勿喷,你如果觉得应该怎样,而不是我这样,那你自己去实现好了。当然,如果对我的方案,或实现上面有更好的想法,欢迎讨论。多线程下载方案分...

weixin_34254848的博客 1101

用nTopology五分钟生成三维Voronoi泡沫:节点式建模从原理到实操

多孔结构在增材制造与轻量化设计中应用广泛,其中Voronoi泡沫因其优异的缓冲吸能和比刚度表现备受关注。传统CAD建模需处理复杂布尔运算和网格修复,而隐式建模通过数学场描述几何体,将空间距离与密度分布转化为可视化节点,大幅降低操作门槛。nTopology基于场驱动与参数化逻辑,无需编写命令,即可实时调节胞元尺寸、壁厚及随机种子,快速生成可打印的泡沫实体。这种工作流适用于缓冲垫、医疗植入体、航空支架等场景,也为梯度密度结构与力学仿真验证提供了高效路径。本文围绕三维Voronoi泡沫的生成原理与节点操作流程,详

weixin_26767391的博客 153

STM32H743 ADC校准失败排查:HAL_ADCEx_Calibration_Start()的正确调用时机

本文深入剖析了STM32H743 ADC校准失败的核心原因,即错误地在ADC使能状态下调用HAL_ADCEx_Calibration_Start()函数,导致读数漂移。文章详细解释了校准必须在ADC禁用状态下进行的硬件原理,列举了典型错误场景,并提供了上电初始化与周期性重校准的正确代码实践,帮助开发者彻底解决ADC精度问题。

ik678901的博客 1177

Android 多线程下载以及断点续传

在日常开发中,我们不可避免的会接到类似这样的需求,下载一个比较大的素材文件或者安装包文件,以此实现APP的自动更新,APP内的素材替换等。这里其实我们可以记录每一次写入文件的进度,当下载任务被暂停的时候,我们就将对应的任务记录下载,记录相应的url,存储文件,当前下载的进度等基本信息,当用户再次出发的时候我们就可以从这些信息恢复进度,继续下载。获取到对应的内容,那么我们就要在文件的指定区域去写入,由于我们是多线程下载,因此文件并不是每次都是从前往后一个个字节写入的,随时可能在文件的任何一个地方写入数据。

涛的博客 3628

Centos7.9使用kubeadm部署K8S集群

使用kubeadm部署一个k8s集群,单master+2worker节点。

lldhsds的专栏 1302

java多线程下载和断点续传

<br /><br />package reflect;<br /> <br />import java.io.FileNotFoundException;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.io.RandomAccessFile;<br />import java.net.HttpURLConnection;<br />import java.net.MalformedURL

guo624587253的专栏 7970

画个板子玩一玩STM32F030F4P6,也许是最便宜的32bit MCU

前言,什么是STM32F030F4P6 STM32目前最便宜的芯片之一应该就是这一块,STM32F030F4P6,这一个芯片没有USB,但是其他都有,引脚少,价格低廉,如果找不到原厂,可以买替代的国产芯片,性能也一样。 不管怎么样也是Cortex-M0,比8bit和16bit的性能都强,总的来说就是低价,引脚少,体积小的同时,还容易开发,有很多模拟输入可玩,还有SPI,硬件I2C等等 所以,这一款MCU真的是从理论来说又便宜又好用,非常适合把玩。 画个板,最小系统 STM32F030其..

arenascat的博客 2万+

立创开源:基于STM32F407的大疆M30T无人机PSDK机载开发板硬件设计与飞行控制实现

本文详细介绍了基于STM32F407微控制器为大疆M30T无人机设计PSDK机载开发板的完整流程。从关键的E-Port接口电路设计、电源保护,到STM32最小系统搭建,再到通过PSDK实现与无人机的通信及基础飞行控制,提供了从硬件到软件的全栈实战指南,助力开发者快速入门无人机负载开发。

weixin_35649491的博客 401

撸了个多线程断点续传下载器

感谢看客老爷点进来了,周末闲来无事,想起同事强哥的那句话:“你有没有玩过断点续传?” 当时转念一想,断点续传下载用的确实不少,具体细节嘛,真的没有去思考过啊。这不,思考过后有了这篇文章。感谢强哥,让我有了一篇可以水的文章,下面会用纯 Java 无依赖实现一个简单的多线程断点续传下载器。 这篇水文章到底有什么内容呢?先简单列举一下,顺便思考几个问题。 断点续传的原理。 重启续传文件时,怎么保证文件的一致性? 同一个文件多线程下载如何实现? 网速带宽固定,为什么多线程下载可以提速? 多线程断点续传会用到哪些知识

Q526859236的博客 4万+

基于STM32设计的校园智慧路灯系统(华为云IOT)(212)

当前设计并研发了基于STM32的智慧路灯系统,本系统的目的是打造一个高效节能、智能化管理的校园照明环境。通过集成STM32F103RCT6高性能微控制器为核心,结合多种传感器模块如BH1750光敏传感器、热释电人体感应模块以及中科微电子GPS模块等,实现了对校园路灯的精准控制与实时监控。

5137

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

概述    在当今的网络时代,下载软件是使用最为频繁的软件之一。几年来,下载技术也在不停地发展。最原始的下载功能仅仅是个“下载”过程,即从WEB服务器上连续地读取文件。其最大的问题是,由于网络的不稳定性,一旦连接断开使得下载过程中断,就不得不全部从头再来一次。    随后,“断点续传”的概念就出来了,顾名思义,就是如果下载中断,在重新建立连接后,跳过已经下载的部分,而只下载还没有下载的部分

sany0的专揽 1239

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: JAR文件转可执行的exe文件
下一篇: Android中的Handler消息处理机制
Alone_SLFly
博客等级 码龄12年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值