C#实现http断点下载
我們寄希望于萬能的解決方案,但是現(xiàn)實的情況總是很糟糕。在軟件編程的世界中,技術(shù)分散的情況尤為嚴(yán)重,且不說各種語言擁有的優(yōu)勢不能融合,單就一門語言而言,就擁有眾多的技術(shù)和相關(guān)技術(shù)需要學(xué)習(xí)。網(wǎng)絡(luò)編程就是這種情況,tcp、udp、http和soap相關(guān)的協(xié)議(ftp不會玩),我們不得不在同一個應(yīng)用中使用不同難以整合的技術(shù)。tcp講究精準(zhǔn),udp講究性能,http對于穿越外網(wǎng)有這天然的優(yōu)勢,soap對于講究編程模型的人來說是福音。
????其實斷點續(xù)傳,眾多技術(shù)都可以實現(xiàn),只是想難易程度而以。經(jīng)過比較分析發(fā)現(xiàn),http對于斷點下載比較容易實現(xiàn),它最成功的地方在于,不需要服務(wù)端的實現(xiàn),只需將需要下載的文件放置在iis服務(wù)器中即可。
下面我會根據(jù)下面一段代碼分析http協(xié)議的
?????????///?<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);
????????????//構(gòu)造文件完全限定名,準(zhǔn)備將網(wǎng)絡(luò)流下載為本地文件
????????????string?fileFullName =?Application.StartupPath?+?@"\download\" + fileName;
????????????//構(gòu)造文件的配置文件的完全完全限定名
????????????string?fileCfgName =?Application.StartupPath?+?@"\download\" + fileName+".cfg";
????????????//本地構(gòu)造文件流
????????????FileStream?fs;
????????????//本地配置文件流
????????????FileStream?fsCfg;
????????????if?(File.Exists(fileFullName))
????????????{
????????????????//如果存在配置文件,則繼續(xù)下載
????????????????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);
????????????}
????????????//開辟內(nèi)存空間
????????????byte[] buffer = new?byte[512];
????????????//請求地址
????????????HttpWebRequest?request = (HttpWebRequest)HttpWebRequest.Create(uri);
????????????//請求開始位置
????????????request.AddRange((int)fs.Length);
????????????//獲取網(wǎng)絡(luò)流
????????????Stream?ns = request.GetResponse().GetResponseStream();
????????????//獲取文件實際長度
????????????long?contentLength = request.GetResponse().ContentLength;
????????????//獲取文件讀取到的長度
????????????int?length = ns.Read(buffer, 0, buffer.Length);
????????????while?(length > 0)
????????????{???
????????????????//將字節(jié)數(shù)組寫入流
????????????????fs.Write(buffer, 0, buffer.Length);
????????????????//繼續(xù)下載
????????????????buffer = new?byte[512];
????????????????length = ns.Read(buffer, 0, buffer.Length);
????????????}
????????????ns.Close();
????????????fs.Close();
????????????fsCfg.Close();
?????}
???在上面的代碼中,比較重要的就是類HttpWebRequest,這個類封裝了http協(xié)議訪問網(wǎng)絡(luò)資源的方法,與WebClient不同的是,HttpWebRequest允許我們使用網(wǎng)絡(luò)流的方式進(jìn)行下載,我們通過URI創(chuàng)建一個網(wǎng)絡(luò)
流,我們就可以開始獲取我們需要的數(shù)據(jù)了。在http協(xié)議的報文中,會進(jìn)行詳細(xì)的描述,當(dāng)然描述的內(nèi)容
很多,HttpWebRequest都幫我們做了,說點題外話,http協(xié)議會將我們計算機環(huán)境寫進(jìn)報文,其中包括計算機
名,計算機所在的ip地址。當(dāng)然也包括我們所講的斷點下載的關(guān)鍵報文Range,這個報文就是我們需要開始下載文件的起始位置,這樣我們就可以根據(jù)本地文件已經(jīng)下載了多少,為斷點下載時所要求的起始位置提供依據(jù)。
本地文件剛創(chuàng)建的時候,fs.Lenght為0所以我們在iis服務(wù)器上請求的網(wǎng)絡(luò)流的游標(biāo)是在流的起始位置,
當(dāng)我們停止下載后,再度下載該資源的時候,網(wǎng)絡(luò)流的游標(biāo)位置會根據(jù)range的值設(shè)置到相應(yīng)的位置,這樣我們就可以斷點下載了。
???如果你是網(wǎng)絡(luò)編程的新手,那么本文的內(nèi)容不適合你,因為文中涉及大量的網(wǎng)絡(luò)編程的概念,你需要去一一掌握然后才能理解本文;如果你是有網(wǎng)絡(luò)編程的經(jīng)驗,而且不知道這種斷點下載的方式,那么我相信你一定學(xué)到了!
轉(zhuǎn)載于:https://www.cnblogs.com/dogxuefeng/p/4527396.html
總結(jié)
以上是生活随笔為你收集整理的C#实现http断点下载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言第二课作业2.1
- 下一篇: CString、std::string格