C#實現http協議下載的斷點續傳

咱們寄但願於萬能的解決方案,可是現實的狀況老是很糟糕。在軟件編程的世界中,技術分散的狀況尤其嚴重,且不說各類語言擁有的優點不能融合,單就一 門語言而言,就擁有衆多的技術和相關技術須要學習。網絡編程就是這種狀況,tcp、udp、http和soap相關的協議(ftp不會玩),咱們不得不在 同一個應用中使用不一樣難以整合的技術。tcp講究精準,udp講究性能,http對於穿越外網有這自然的優點,soap對於講究編程模型的人來講是福音。html

    其實斷點續傳,衆多技術均可以實現,只是想難易程度而以。通過比較分析發現,http對於斷點下載比較容易實現,它最成功的地方在於,不須要服務端的實現,只需將須要下載的文件放置在iis服務器中便可。編程

下面我會根據下面一段代碼分析http協議的數組

         /// <summary>
        /// 下載方法
        /// </summary>
        /// <param name="uri">下載地址的URI</param>
        public void DownLoad(object obj)
        {服務器

            //好比uri=http://localhost/Rabom/1.rar;iis就須要本身配置了。
            string uri = obj.ToString();
            //截取文件名
            string fileName = uri.Substring(uri.LastIndexOf(@"/") + 1);網絡

            //構造文件徹底限定名,準備將網絡流下載爲本地文件
            string fileFullName = Application.StartupPath + @"\download\" + fileName;
            //構造文件的配置文件的徹底徹底限定名
            string fileCfgName = Application.StartupPath + @"\download\" + fileName+".cfg";tcp


            //本地構造文件流
            FileStream fs;
            //本地配置文件流
            FileStream fsCfg;性能

            if (File.Exists(fileFullName))
            {
                //若是存在配置文件,則繼續下載
                if (File.Exists(fileCfgName))
                {
                    fs = new FileStream(fileFullName, FileMode.Append, FileAccess.Write, FileShare.Write);
                    fsCfg = fs = new FileStream(fileFullName, FileMode.Append, FileAccess.Write, FileShare.Write);
                }
                else
                {
                    return;//暫且這樣
                }
            }
            else
            {
                fs = new FileStream(fileFullName, FileMode.Create);
                fsCfg = new FileStream(fileCfgName, FileMode.Create);
            }學習

            //開闢內存空間
            byte[] buffer = new byte[512];spa

            //請求地址
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
            //請求開始位置
            request.AddRange((int)fs.Length);htm

            //獲取網絡流
            Stream ns = request.GetResponse().GetResponseStream();

            //獲取文件實際長度
            long contentLength = request.GetResponse().ContentLength;
            //獲取文件讀取到的長度
            int length = ns.Read(buffer, 0, buffer.Length);

            while (length > 0)
            {   

                //將字節數組寫入流
                fs.Write(buffer, 0, buffer.Length);

                //繼續下載
                buffer = new byte[512];
                length = ns.Read(buffer, 0, buffer.Length);
            }

            ns.Close();
            fs.Close();
            fsCfg.Close();

     }

   在上面的代碼中,比較重要的就是類HttpWebRequest,這個類封裝了http協議訪問網絡資源的方法,與WebClient不一樣的是,HttpWebRequest容許咱們使用網絡流的方式進行下載,咱們經過URI建立一個網絡

流,咱們就能夠開始獲取咱們須要的數據了。在http協議的報文中,會進行詳細的描述,固然描述的內容

不少,HttpWebRequest都幫咱們作了,說點題外話,http協議會將咱們計算機環境寫進報文,其中包括計算機

名,計算機所在的ip地址。固然也包括咱們所講的斷點下載的關鍵報文Range,這個報文就是咱們須要開始下載文件的起始位置,這樣咱們就能夠根據本地文件已經下載了多少,爲斷點下載時所要求的起始位置提供依據。

本地文件剛建立的時候,fs.Lenght爲0因此咱們在iis服務器上請求的網絡流的遊標是在流的起始位置,

當咱們中止下載後,再度下載該資源的時候,網絡流的遊標位置會根據range的值設置到相應的位置,這樣咱們就能夠斷點下載了。

   若是你是網絡編程的新手,那麼本文的內容不適合你,由於文中涉及大量的網絡編程的概念,你須要去一一掌握而後才能理解本文;若是你是有網絡編程的經驗,並且不知道這種斷點下載的方式,那麼我相信你必定學到了!

文章來源:http://blog.sina.com.cn/s/blog_62b0d0ef0100mnmj.html

相關文章
相關標籤/搜索