1、如何利用http協議實現文件下載的斷點續傳?
http協議中 header裡面有個欄位叫做range,以及與range相關的一些header
Range: 只請求實體的一部分,指定范圍 例如Range: bytes=500-999
所以斷點續專傳,屬你懂的,斷了之後你再請求剩下的部分,最後拼起來就行
2、Http下載問題.斷點續傳問題
http下載是不太穩定的,建議選擇在網路不忙的時候再下載,也可能是鏈接上面有問題。
另外可以版檢查一下是權不是裡面有病毒,有的時候殺毒軟體或者防火牆的實時監控可能會導致那個「重置」問題。
如果你監視網路狀態的時候出現了超時,有可能是網路設備不太穩定導致的,即暫時性的網路中斷。
目標網無法訪問和重置的問題也有可能是你下載的伺服器設置只允許一個線程連接,當使用了第二個線程的時候就會出現這種情況。
總之,建議檢查一下網路連接的穩定性,還有相關的軟體影響。另外是否打開了瀏覽器的多線程下載功能也要檢查。ie8是支持多線程下載的。
不過個人認為你還是網路的穩定性有關系。當然,有空的話把C盤里的IE緩存清一下也可能會有幫助。
3、CHttpFile怎麼實現斷點續傳?
其實斷點續傳的原理很簡單,就是在Http的請求上和一般的下載有所不同而已。 打個比方,瀏覽器請求伺服器上的一個文時,所發出的請求如下: 假設伺服器域名為w www.sjtu.e.cn,文件名為down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- excel, application/msword, application/vnd.ms-powerpoint, */* Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Connection: Keep-Alive 伺服器收到請求後,按要求尋找請求的文件,提取文件的信息,然後返回給瀏覽器,返回信息如下: 200 Content-Length=106786028 Accept-Ranges=bytes Date=Mon, 30 Apr 2001 12:56:11 GMT ETag=W/"02ca57e173c11:95b" Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT 所謂斷點續傳,也就是要從文件已經下載的地方開始繼續下載。所以在客戶端瀏覽器傳給 Web伺服器的時候要多加一條信息--從哪裡開始。 下面是用自己編的一個"瀏覽器"來傳遞請求信息給Web伺服器,要求從2000070位元組開始。 GET /down.zip HTTP/1.0 User-Agent: NetFox RANGE: bytes=2000070- Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 仔細看一下就會發現多了一行RANGE: bytes=2000070- 這一行的意思就是告訴伺服器down.zip這個文件從2000070位元組開始傳,前面的位元組不用傳了。 伺服器收到這個請求以後,返回的信息如下: 206 Content-Length=106786028 Content-Range=bytes 2000070-106786027/106786028 Date=Mon, 30 Apr 2001 12:55:20 GMT ETag=W/"02ca57e173c11:95b" Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT 和前面伺服器返回的信息比較一下,就會發現增加了一行: Content-Range=bytes 2000070-106786027/106786028 返回的代碼也改為206了,而不再是200了。 知道了以上原理,就可以進行斷點續傳的編程了。
4、支持斷點續傳的http伺服器一定會送Accept-Ranges頭嗎
支持斷點續傳時,客戶端每次提交下載請求時,服務端都要添加Accept-Ranges、ETag這兩個響應專頭,以保證客戶端和服務屬端將此下載識別為可以斷點續傳的下載:
Accept-Ranges:告知下載客戶端這是一個可以恢復續傳的下載,存放本次下載的開始位元組位置、文件的位元組大小;
ETag:保存文件的唯一標識(我在用的文件名+文件最後修改時間,以便續傳請求時對文件進行驗證);
Last-Modified:可選響應頭,存放服務端文件的最後修改時間,用於驗證
5、HTTP1.1本身支持斷點續傳嗎
你要長連接 那就得用Socket
支持不支持是要靠你代碼實現的。。。
給你一個思路回:下載一個文件答 你一開始是可以得到文件的位元組數組形式的,而下載的那個位元組流,你取了多少,也就是說每次取1024個位元組,取了100次,也就是0到102400個位元組被你下載下來了,那你應該有100次記錄了下載的進度,也就是這次獲取到哪個數據下標了,那麼100次後斷了重新下載,你就可以直接從你記錄好的第100+1次開始下載,之前的就可以無視掉了~~~
http協議一個特點就是 客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求後,就自動釋放連接。
6、CHttpFile怎麼實現斷點續傳?
void CUpdateDlg::OnButtonDoupdate()
{
// 讀取升級文件
CFileStatus rStatus;
CString szIniData;
CString inFile;
CString tmp;
inFile=m_szPath+"\\update.ini";
CFile UpdateFile;
UpdateFile.Open( inFile, CFile::modeRead);
UpdateFile.GetStatus(inFile,rStatus);
UpdateFile.Read(szIniData.GetBuffer(rStatus.m_size),rStatus.m_size);
UpdateFile.Close();
CStringArray arType;
CStringArray arVersion;
for(int i=1;i<=27;i+=2){
AfxExtractSubString(tmp,szIniData,i,'\n');
tmp.TrimRight();
tmp.TrimRight();
arType.Add(tmp);
}
for(int j=2;j<=28;j+=2){
AfxExtractSubString(tmp,szIniData,j,'\n');
tmp.TrimRight();
tmp.TrimRight();
arVersion.Add(tmp);
}
GetDlgItem(IDC_BUTTON_DOUPDATE)->EnableWindow(FALSE);
CProgressCtrl* pBar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS_UPDATE);
pBar->SetPos(5);
m_szEditMessage = "\r\n取得網路升級地址\r\n"+ServerUrl;
UpdateData(FALSE);
CInternetSession mySession(NULL,0);
CHttpFile* myHttpFile=NULL;
BOOL bIsNewer = FALSE;
CString myData;
CString myUrl;
CString m_SiteRec;
myUrl = ServerUrl+"?pro=update";
myHttpFile=(CHttpFile*)mySession.OpenURL(myUrl);
while(myHttpFile->ReadString(myData)){m_SiteRec = myData;}
myHttpFile->Close();
mySession.Close();
if(m_SiteRec=="ok"){
pBar->SetPos(10);
m_szEditMessage = "\r\n已經連通......\r\n"+m_szEditMessage;
UpdateData(FALSE);
for(int k=0;k<14;k++){
CInternetSession mySession(NULL,0);
CHttpFile* myHttpFile=NULL;
m_SiteRec.Empty();
myUrl = ServerUrl+"?pro=update&mole="+arType[k]+"&version="+arVersion[k];
myHttpFile=(CHttpFile*)mySession.OpenURL(myUrl);
while(myHttpFile->ReadString(myData)){m_SiteRec += myData;}
if(m_SiteRec != "ok"){
CString
inFile;
inFile=m_szPath+"\\data\\"+arType[k];
CFile NetFile;
NetFile.Open( inFile, CFile::modeCreate | CFile::modeWrite);
NetFile.Write( m_SiteRec, m_SiteRec.GetLength());
NetFile.Close();
bIsNewer = TRUE;
}
pBar->SetPos((k+1)*(100-10)+10);
m_szEditMessage = "\r\n檢查"+arType[k]+"文件...
成功!\r\n"+m_szEditMessage;
UpdateData(FALSE);
myHttpFile->Close();
mySession.Close();
}
if(bIsNewer){
::MessageBox(NULL,"文件已經更新成功!",NULL,MB_ICONASTERISK);
}else{
::MessageBox(NULL,"您的數據文件已經是最新版本了!",NULL,MB_ICONASTERISK);
}
}else{
::MessageBox(NULL,"沒有連接網路或者找不到升級伺服器,請檢查",NULL,MB_ICONASTERISK);
pBar->SetPos(100);
}
// 下面是完成了.
GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
GetDlgItem(IDOK)->ShowWindow(SW_SHOW);
GetDlgItem(IDOK)->SetFocus();
}
7、VB通過API函數如何實現HTTP斷點續傳下載?
獲得 http 標頭信息,就可以得到文件的大小
發送標頭信息 可以設置 斷點續傳的內 起點
具體容的 我忘了 很久以前 弄過! 下載 小於2G的文件 速度 很快,不過超過 2G的文件 vb 處理起來需要 位元組轉換,很麻煩切很容易內存崩潰!
斷點續傳 最好使用 Winsock 控制項 或者直接使用 Winsock 模塊(個人感覺使用 模塊要好一些,比較穩定)
舉個例子:
發送請求下載信息
strTmp="GET 文件網路地址 HTTP/1.1" 回車
StrTmp=strTmp + "Accept: */*" 回車
StrTmp=StrTmp + "Host:主機地址"回測
StrTmp=StrTmp +"Range bytes=續傳的起始點-" 回車 如果不加這句話 伺服器回返迴文件大小
簡單的就是這樣 不過 這是我印象中的,不過這個定義比較嚴格 你可以去網上在搜搜!
8、HttpClient支持斷點續傳嗎
支持,在header中定義一個RANGE,標識已上傳的位置。
httpget.addHeader("Range", "bytes=500-");
註:伺服器端支持斷點續傳,則返回響應的碼版不再是權200,而是206。
9、如何實現基於http協議的斷點續傳的上傳功能
於HTTP 協議的多線程下載和斷點續傳的實現 學 生:葉升路 指導教師:覃 穎 (三峽大學 電氣信息學院) 摘 要:本文介紹了網路下載軟體中的最新技術——多線程下載和斷點續傳技術,同時 也介紹了HTTP 協議的發展、特點以及WinSock 編程技術。最後在這些技術的基礎上成 功設計並實現了基於HTTP 協議的具有多線程下載和斷點續傳功能的下載軟體。本軟體 的實現代碼未使用任何WinInet API 函數如InternetOpen , InternetConnect 等,而是直接 使用WinSock 編程,逐步解析HTTP 協議來完成會話和文件下載等功能。經測試,下載 速度有所提高。 關鍵詞:下載;多線程;斷點續傳;HTTP;WinSock; Abstract:This paper introces the latest downloading technology called multi-threaded downloading and resume in network downloading software. But also descripes the development of HTTP protocol, characteristics and WinSock programming. Finally, based on these technologies successfully designed and implemented a downloading tool based on the HTTP protocol with multi-threaded and resume features. The realization of the software code does not use any WinInet API functions such as InternetOpen, InternetConnect, etc., but directly use WinSock to programming, and complete the functions of conversation and file downloads and others by parse HTTP protocol steply. After tested, the speed of downloading has increased. Keywords: Downloading;Multi-thread;Resume;HTTP;WinSock; 前言 最近幾年,隨著計算機網路的飛速發展,網際網路(Internet)已經逐漸成為人們生活、 工作、學習必不可缺的一部分。網際網路上存儲了大量豐富的信息資源,我們可以使用下載 工具,把需要的信息資源下載到本地。但是由於受到各種因素的限制,例如伺服器性能、 網路帶寬、下載的信息量以及下載工具等等,下載速度受到不同程度的影響。因此人們不 斷地提高伺服器性能,擴展網路帶寬,開發效率更高的下載工具以達到最大化提高下載 速度的目的。 在限制下載速度的眾多因素中,研究新的網路下載技術開發出更高效的下載工具無 疑是其中最節約,環保以及方便的方式。網路下載技術,也可以稱為網路文件共享技術, 10 1 它一直是網路發展的重要推動力之一。早期人們共享資源的普遍方法是將資源文件上傳 至伺服器上,然後其他用戶可以通過HTTP 或FTP 等協議將其下載到本地電腦。這種模 式稱為客戶機/伺服器模式即C/S 模式,它對伺服器的依賴性很大,當下載用戶很少時, 比如說一個,他將獨享伺服器的帶寬,很顯然其下載速度會非常快。然而當下載的人數 較多而伺服器帶寬有限時,比如伺服器帶寬為3MB/S,而下載人數為100 人,則眾多下 載用戶不得不共享一個帶寬(3MB/S)最終結果是下載速度均分(30KB/S),普遍不高。 P2P 技術的出現使得人們終於擺脫了伺服器的枷鎖。它的主要特點是資源分散、負 載均衡、和非中心化,它將共享的文件存儲在各個客戶機節點上,用戶之間可以直接共 享和傳輸文件而不需要通過伺服器。客戶機不再只利用伺服器帶寬進行下載,它同時也 可以利用其他客戶機節點的帶寬,這樣大大提高了下載速度。 縱觀網路下載技術發展的歷史,可以將其劃分為四個階段:單線程下載階段、多線 程下載及斷點續傳階段、P2P階段、P2SP階段。 一、單線下載時代:應對有限時間流量的辦法 早在上個世紀90年代,當時互聯網並不普及,很多人使用Modem撥號,通過Telnet 軟體連接到撥接式BBS上獲取資訊並與別人交流(收發郵件等),由於伺服器的電話線 路數量有限,因此都會限制連接時間,一般新注冊用戶只有10分鍾左右。這點時間用來 看帖回帖顯然不夠的,因此有人就開發了軟體,進入BBS後,能夠將整個BBS上所有內 容都下載回來,然後可以斷線慢慢看慢慢回,最後再次撥入BBS上傳回復。 二、斷點續傳與多線程下載時代:大幅度提高速度 進入Windows與WWW(World Wide Web,互聯網)時代之後,IE,Netscape等瀏覽 器都可以通過點擊左鍵下載,那個時候網路速度最快不過5KB/s,下載一首5MB的MP3 歌曲要15分鍾以上!中途萬一斷線就前功盡棄,於是有人開發了支持斷點續傳的下載軟 件。 世界上第一款支持斷點續傳的下載軟體應該是GetRight。它可讓你用瀏覽器下載文 件時有續傳功能,可設定時間來下載文件或是中斷Modem撥接,下載完畢時自動中斷 Modem撥接或關機。 為了更好的利用帶寬,在斷點續傳的基礎上,多線程下載軟體逐漸發展了起來。最 早出現的多線程下載軟體是中國人開發的NetAnts(網路螞蟻)。網路螞蟻其實也是一 個斷點續傳軟體,但它對斷點續傳功能進行了擴展:可進行多點續傳,即利用斷點續傳 的原理同時建立多個連接下載同一個軟體並最終將其合並為一個完整的軟體。
10、wininet 判斷是否支持HTTP斷點續傳
在網上找到的:
DWORD dwByteToRead = 0;
DWORD dwSizeOfRq = 4;
HttpQueryInfo(hOpenRequest, HTTP_QUERY_FLAG_NUMBER| HTTP_QUERY_STATUS_CODE ,(LPVOID)&dwByteToRead, &dwSizeOfRq, NULL);
// printf("%d\n",dwByteToRead);
// DWORD dwFileSize1 = (DWORD)_wtol(dwByteToRead); //get the length of received file
// printf("%d\n",dwFileSize1);
////狀態碼查詢!---------注:參數要改成HTTP_QUERY_FLAG_NUMBER| HTTP_QUERY_STATUS_CODE
if (200 == dwByteToRead)
{
printf("支持200 OK響應!\n");
}
else if(206 ==dwByteToRead)
{
printf("支持206 OK響應!\n");
}
請看:
http://hi.baidu.com/vc_net/blog/item/02e795ca050d6f96c81768aa.html