unity3d 关于断点下载和整个下载(用于更新)——有坑版



Unity 3D 这个先转载一下,备忘一下,但是这个版本是有问题的,可惜我修复的文件不知道覆盖去哪了,年代久远,有需要的时候再来改吧。

反正这个版本简单好用。可测试。有问题再说。

另外还有就是重试机制要按这样来

代码块

连接不成功的操作:

       //打开网络连接
        System.Uri u = new System.Uri(url);
        HttpWebRequest mRequest = (HttpWebRequest)WebRequest.Create(u);
        mRequest.Method = "GET";
        mRequest.ContentType = "application/x-www-form-urlencoded";
        mRequest.Timeout = 5000;
        bool connect_success = false;

        HttpWebResponse wr = null;
        try
        {
            wr = (HttpWebResponse)mRequest.GetResponse();
            connect_success = true;
        }
        catch (WebException ex)
        {
            Debug.LogError("网络错误:" + ex.Message);
            mRequest.Abort();
            mRequest = (HttpWebRequest)WebRequest.Create(u);
            mRequest.Method = "GET";
            mRequest.ContentType = "application/x-www-form-urlencoded";
            mRequest.Timeout = 5000;
            connect_success = false;
        }


下载操作:

using UnityEngine;
using System.Collections;
using System.IO;
using System.Net;
using Math= System.Math;
using Uri = System.Uri;
using Convert= System.Convert;
public class DownloadTest : MonoBehaviour
{

    public UILabel label1;
    public UILabel label2;
    // Use this for initialization
    void Start ()
    {

    }

    // Update is called once per frame
    void Update ()
    {

    }


    void OnGUI ()
    {
        if (GUI.Button (new Rect (0, 0, 100, 20), "Download")) {
            StartCoroutine (downfile ("http://localhost:8888/test.zip", Application.streamingAssetsPath + "/test.zip", label1));
        }
        if (GUI.Button (new Rect (0, 20, 100, 20), "StopDownload")) {
            StopAllCoroutines ();
        }
        if (GUI.Button (new Rect (0, 40, 100, 20), "ResumDownload")) {
            StartCoroutine (FPointDown ("http://localhost:8888/test.zip", Application.streamingAssetsPath + "/test.zip", label2));
        }
    }

    string t = "";
    //整体下载
    IEnumerator downfile (string url, string LocalPath, UILabel DesLable)
    {
        Uri u = new Uri (url);
        HttpWebRequest mRequest = (HttpWebRequest)WebRequest.Create (u);
        mRequest.Method = "GET";
        mRequest.ContentType = "application/x-www-form-urlencoded";

        HttpWebResponse wr = (HttpWebResponse)mRequest.GetResponse ();

        Stream sIn = wr.GetResponseStream ();
        FileStream fs = new FileStream (LocalPath, FileMode.Create, FileAccess.Write);

        long length = wr.ContentLength;
        long i = 0;
        decimal j = 0;

        while (i<length) {
            byte[] buffer = new byte[1024];
            i += sIn.Read (buffer, 0, buffer.Length);
            fs.Write (buffer, 0, buffer.Length);

            if ((i % 1024) == 0) {
                j = Math.Round (Convert.ToDecimal ((Convert.ToDouble (i) / Convert.ToDouble (length)) * 100), 4);
                t = "当前下载文件大小:" + length.ToString () + "字节当前下载大小:" + i + "字节下载进度" + j.ToString () + "%";
                DesLable.text = t.ToString ();
            } else {
                t = "当前下载文件大小:" + length.ToString () + "字节当前下载大小:" + i + "字节";
                DesLable.text = t.ToString ();
            }

            yield return false;


        }

        sIn.Close ();
        wr.Close ();
        fs.Close ();

    }
    string downloadString = "已经下载";
    //断点下载
    IEnumerator FPointDown (string uri, string saveFile, UILabel DesLable)
    {
        //打开网络连接
        HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create (uri);
        HttpWebRequest requestGetCount = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create (uri);
        long countLength = requestGetCount.GetResponse ().ContentLength;

        //打开上次下载的文件或新建文件
        long lStartPos = 0;
        System.IO.FileStream fs;
        if (System.IO.File.Exists (saveFile)) {
            fs = System.IO.File.OpenWrite (saveFile);
            lStartPos = fs.Length;
            if (countLength - lStartPos <= 0) {
                fs.Close ();
                t = "已经";
                DesLable.text = t.ToString ();
                yield break;
            }
            fs.Seek (lStartPos, System.IO.SeekOrigin.Current);//移动文件流中的当前指针
        } else {
            fs = new FileStream (saveFile, FileMode.Create);
        }


        if (lStartPos > 0) {
            request.AddRange ((int)lStartPos);//设置Range值
            print (lStartPos);
        }

        //向服务器请求,获得服务器回应数据流
        Stream ns = request.GetResponse ().GetResponseStream ();
        int len = 1024 * 8;

        byte[] nbytes = new byte[len];
        int nReadSize = 0;
        nReadSize = ns.Read (nbytes, 0, len);
        while (nReadSize>0) {
            fs.Write (nbytes, 0, nReadSize);
            nReadSize = ns.Read (nbytes, 0, len);
            t = downloadString + ":" + fs.Length / 1024 + "kb/" + countLength / 1024 + "kb" + "----" + ((double)fs.Length / countLength).ToString () + "%";

            DesLable.text=t;
            yield return false;
        }
        ns.Close ();
        fs.Close ();
        //这里放更新安装代码,或者可以测试这个下载的包有没有出错,验证sha和md5

    } 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值