C#實現http斷點下載

來源:互聯網
上載者:User

標籤:

我們寄希望於萬能的解決方案,但是現實的情況總是很糟糕。在軟體編程的世界中,技術分散的情況尤為嚴重,且不說各種語言擁有的優勢不能融合,單就一門語言而言,就擁有眾多的技術和相關技術需要學習。網路編程就是這種情況,tcp、udp、http和soap相關的協議(ftp不會玩),我們不得不在同一個應用中使用不同難以整合的技術。tcp講究精準,udp講究效能,http對於穿越外網有這天然的優勢,soap對於講究編程模型的人來說是福音。

    其實斷點續傳,眾多技術都可以實現,只是想難易程度而以。經過比較分析發現,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";


            //本地構造檔案流
            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];

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

            //擷取網路流
            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的值設定到相應的位置,這樣我們就可以斷點下載了。

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

C#實現http斷點下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.