UnityWebRequest下载网络或本地资源,支持断点续传、多文件同时下载
来源:互联网 发布:java api全部包类 编辑:程序博客网 时间:2024/06/15 22:35
今晚研究了下关于Unity中文件下载的断点续传功能,Unity已经封装了网络资源的下载API,当然也可以使用C#中的API进行资源下载。
首先说一下断点续传的大概思路:
1、下载一个文件时,向服务器发送下载请求,发送一个Range的报文,指定从文件数据的什么位置开始获取数据,把从服务器路径接收到的文件数据,用文件流操作按顺序写入到本地临时文件流,当中断下载时,保存已下载的临时文件数据,释放文件流操作和下载请求。
2、当再次进行下载时,用文件流读取本地已下载的临时文件,这时向服务器发送下载请求,把当前临时文件的大小作为Range报文的数据发送给服务器,此时就可以从上次下载的位置继续进行数据下载。这里注意的是,文件流的写入位置要设置为之前临时文件的最后,即Position等于临时文件的大小,这样才会将新的文件数据与之前的结合起来。
3、当文件的全部数据都下载完成时,将临时文件重命名为真正的文件。
然后说一下多文件同时下载的逻辑:多文件下载就是在单文件下载的基础上,每一个下载请求都是独立进行的,这就类似于多线程并发操作,需要注意的是多个下载连接会共同占用网络带宽,每个文件的下载速度都会降低。
使用C#源生的API下载网络资源,基本上要使用到多线程下载机制,而Unity5.3以后的版本中带了一个UnityWebRequest的API,发现这个API可以真牛逼,应该完全可以代替WWW的所有功能(自己吹的牛逼……)
这个UnityWebRequest可以下载资源、上传数据、获取下载进度、中止下载等等,而且是在Unity的主线程中进行的。
下面简单说明下载操作:
我也不多说了,直接给分享简单的下载框架,主要功能只有两个脚本,一看遍明白了
http://download.csdn.net/download/u010377179/10155918
首先说一下断点续传的大概思路:
1、下载一个文件时,向服务器发送下载请求,发送一个Range的报文,指定从文件数据的什么位置开始获取数据,把从服务器路径接收到的文件数据,用文件流操作按顺序写入到本地临时文件流,当中断下载时,保存已下载的临时文件数据,释放文件流操作和下载请求。
2、当再次进行下载时,用文件流读取本地已下载的临时文件,这时向服务器发送下载请求,把当前临时文件的大小作为Range报文的数据发送给服务器,此时就可以从上次下载的位置继续进行数据下载。这里注意的是,文件流的写入位置要设置为之前临时文件的最后,即Position等于临时文件的大小,这样才会将新的文件数据与之前的结合起来。
3、当文件的全部数据都下载完成时,将临时文件重命名为真正的文件。
然后说一下多文件同时下载的逻辑:多文件下载就是在单文件下载的基础上,每一个下载请求都是独立进行的,这就类似于多线程并发操作,需要注意的是多个下载连接会共同占用网络带宽,每个文件的下载速度都会降低。
使用C#源生的API下载网络资源,基本上要使用到多线程下载机制,而Unity5.3以后的版本中带了一个UnityWebRequest的API,发现这个API可以真牛逼,应该完全可以代替WWW的所有功能(自己吹的牛逼……)
这个UnityWebRequest可以下载资源、上传数据、获取下载进度、中止下载等等,而且是在Unity的主线程中进行的。
下面简单说明下载操作:
//下载的协程 public IEnumerator StartDownload(string url, string savePath) { _DownloadHandler loadHandler = new _DownloadHandler(savePath); UnityWebRequest request = UnityWebRequest.Get(url); request.chunkedTransfer = true; request.disposeDownloadHandlerOnDispose = true; request.SetRequestHeader("Range", "bytes = " + loadHandler.DownedLength + "-"); //断点续传设置读取文件数据流开始索引,成功会返回206 yield return request.Send(); //协程操作 }以上是下载资源的主要操作,而数据处理和回调使用的是UnityWebRequest的downloadHandler属性,这个属性类型是DownloadHandler,因此需要我们自定义一个类集成DownloadHandler,然后重写里面的虚方法。注意里面的虚方法大部分都是回调类型的,也就是说都是由UnityWebRequest在下载过程中主动调用的,例如virtual void CompleteContent()方法是完成下载时的触发的回调,virtual void ReceiveContentLength(int contentLength)是刚开始下载时接收到整个文件的大小的回调,virtual bool ReceiveData(byte[] data, int dataLength)是下载中不断接收到文件数据的回调,等等。
我也不多说了,直接给分享简单的下载框架,主要功能只有两个脚本,一看遍明白了
http://download.csdn.net/download/u010377179/10155918
阅读全文
0 0
- UnityWebRequest下载网络或本地资源,支持断点续传、多文件同时下载
- C#Http文件下载(支持断点续传) 提供资源下载
- Android下载服务器资源文件(支持断点续传)
- Aandroid 多线程断点续传同时下载多个大文件
- iOS 文件下载到本地、缓存 、断点续传
- 利用Winsock下载文件(支持断点续传)
- 让自定义文件下载支持断点续传
- 利用Winsock下载文件(支持断点续传)
- 支持断点续传的PHP文件下载类
- php下载远程文件(支持断点续传)
- C#实现文件下载,支持断点续传
- C#实现文件下载,支持断点续传
- php 支持断点续传的文件下载类
- 单线程支持断点续传文件下载
- php 支持断点续传的文件下载类
- php 支持断点续传的文件下载类
- php 支持断点续传的文件下载类
- php 支持断点续传的文件下载类
- hbase 快速入门之---HFILE数据格式
- 字符串倒序单词顺序不变保留空格
- 172.Spring Boot WebSocket:编码分析
- vb.net 教程 8-3 数据库操作7
- 数据显示:中国程序员是世界上最牛的程序员
- UnityWebRequest下载网络或本地资源,支持断点续传、多文件同时下载
- ubuntu14+qt5.9.1库安装
- 数组遍历filter,forEach,map,every,some,reduce
- Android监听通讯录修改,然后上传修改部分
- VB.NET之2017/12/12晚的疑问
- UVA 247 Calling Circles
- 兄弟连学python》》》》文件操作
- 简单的HTTP请求post,get,put,delete,head方法的实现
- 已知四边形的四个点,求一个点是否在四边形之内的解决方法