HTTP斷點(diǎn)續(xù)傳原理及Flex實(shí)現(xiàn)技術(shù)_第1頁(yè)
HTTP斷點(diǎn)續(xù)傳原理及Flex實(shí)現(xiàn)技術(shù)_第2頁(yè)
HTTP斷點(diǎn)續(xù)傳原理及Flex實(shí)現(xiàn)技術(shù)_第3頁(yè)
HTTP斷點(diǎn)續(xù)傳原理及Flex實(shí)現(xiàn)技術(shù)_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、HTTP斷點(diǎn)續(xù)傳原理及Flex實(shí)現(xiàn)技術(shù) 研發(fā)中心 王秀珍一、Http斷點(diǎn)續(xù)傳原理現(xiàn)在基本上任何一個(gè)下載工具都是支持?jǐn)帱c(diǎn)續(xù)傳的,拋開(kāi)P2P的成分不談,我們單說(shuō)通過(guò)HTTP服務(wù)器是如何實(shí)現(xiàn)斷點(diǎn)續(xù)傳的。關(guān)鍵在于你向HTTP服務(wù)器發(fā)起文件請(qǐng)求的時(shí)候,是否明確的告知,要下載文件的哪個(gè)區(qū)域,我們都知道HTTP請(qǐng)求是有一個(gè)Header的,實(shí)際上里面有個(gè)屬性是定義下載的區(qū)域的,這個(gè)屬性就是Range,它接收的值是一個(gè)區(qū)間范圍,比如:Range:bytes=0-10000這樣我們就可以按照一定的規(guī)則,將一個(gè)大文件拆分為若干很小的部分,然后分批次的下載,每個(gè)小塊下載完成之后,都合并到文件中,這樣即時(shí)中間中斷了下載

2、,我們重新開(kāi)始下載的時(shí)候,也可以通過(guò)文件的字節(jié)長(zhǎng)度來(lái)判斷下載的起始點(diǎn),然后重啟斷點(diǎn)續(xù)傳的過(guò)程,直到最后完成下載過(guò)程。1、 下面是非斷點(diǎn)續(xù)傳的Http剖析假設(shè)我們通過(guò)瀏覽器去下載一個(gè)名稱(chēng)為hello.zip的文件。那么瀏覽器發(fā)出的請(qǐng)求信息如下:GET /hello.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpointAccept-Language: zh-

3、cnAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)Connection: Keep-Alive服務(wù)器收到請(qǐng)求后,按要求尋找請(qǐng)求的文件,提取文件的信息,然后返回給瀏覽器,返回信息如下:200Content-Length=106786028Accept-Ranges=bytesDate=Mon, 30 Apr 2009 12:56:11 GMTETag=W/"02ca57e173c12:95b"Content-Type=applicatio

4、n/octet-streamLast-Modified=Mon, 30 Apr 2009 12:56:11 GMT2、下面是斷點(diǎn)續(xù)傳的http剖析如果自己編的一個(gè)客戶(hù)端程序來(lái)傳遞請(qǐng)求信息給Web服務(wù)器,要求從1000070字節(jié)開(kāi)始。GET /hello.zip HTTP/1.0推薦精選User-Agent: NetFoxRANGE: bytes=1000070-Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2仔細(xì)看一下就會(huì)發(fā)現(xiàn)多了一行RANGE: bytes=1000070-,這一行的意思就是告訴服務(wù)器hello.zip這

5、個(gè)文件從1000070字節(jié)開(kāi)始傳,前面的字節(jié)不用傳了。服務(wù)器收到這個(gè)請(qǐng)求以后,返回的信息如下:206Content-Length=106786028Content-Range=bytes 1000070-106786027/106786028Date=Mon, 30 Apr 2009 12:55:20 GMTETag=W/"02ca57e173c12:95b"Content-Type=application/octet-streamLast-Modified=Mon, 30 Apr 2009 12:55:20 GMT和前面服務(wù)器返回的信息比較一下,就會(huì)發(fā)現(xiàn)增加了Conten

6、t-Range一行,且返回的代碼也改為206了,而不再是200了。以上就是HTTP斷點(diǎn)續(xù)傳的原理,具體通過(guò)什么技術(shù)實(shí)現(xiàn),比如Java、C+、Flex等,都可以實(shí)現(xiàn)。二、Flex實(shí)現(xiàn)的文件下載斷點(diǎn)續(xù)傳下面是基于AS3+Flash Player+AIR,制作一個(gè)斷點(diǎn)續(xù)傳的小程序,大概實(shí)現(xiàn)思路如下:1、首先對(duì)文件發(fā)起請(qǐng)求,得到文件的尺寸(字節(jié)長(zhǎng)度),但并不下載2、然后將文件劃分為若干區(qū)域,對(duì)第一個(gè)區(qū)域的內(nèi)容發(fā)起請(qǐng)求(通過(guò)指定HTTP頭的Range)3、第一個(gè)區(qū)域的內(nèi)容很快下載完成,使用File保存到本地文件4、移動(dòng)指針,對(duì)第二個(gè)區(qū)域的內(nèi)容發(fā)起請(qǐng)求,下載完畢后與文件合并5、以此類(lèi)推,直到下載完成整個(gè)文

7、件以下是實(shí)現(xiàn)代碼:<?xml version="1.0" encoding="utf-8"?><mx:WindowedApplication xmlns:mx=" layout="absolute" title="夢(mèng)想下載" > <mx:Script> <!CDATA import .URLLoader; import .URLStream; import .URLRequest; import flash.utils.ByteArray; import mx.c

8、ontrols.Alert; private var contentLength:int = 0; private var file:File;推薦精選 private var startPoint:int = 0; private var endPoint:int = 0; private var rangeStream:URLStream; private var isInit:Boolean = false; private var range:int = 1024000; /每次下載的字節(jié)數(shù), private var currentData:ByteArray; private var

9、 progress:Number = 0; private function init():void var dotSplitLength:uint = videoURL.text.split("/").length;/這兩行代碼是為了獲取下載文件的名稱(chēng) var fileName:String = videoURL.text.split("/")dotSplitLength-1; file = new File("C:/DownLoadTemp/"+fileName);/創(chuàng)建一個(gè)和下載文件名稱(chēng)一致的文件,保存在D盤(pán)temp目錄下 is

10、Init = true; private function doDownload():void /先發(fā)送一個(gè)下載請(qǐng)求,可以得到文件的真實(shí)尺寸 var getContentLengthRequest:URLRequest = new URLRequest(videoURL.text); var getContentLengthLoader:URLLoader = new URLLoader(); getContentLengthLoader.addEventListener(ProgressEvent.PROGRESS ,function(e:ProgressEvent):void conten

11、tLength = getContentLengthLoader.bytesTotal;/得到文件的真實(shí)尺寸 getContentLengthLoader.close();/停止下載 downloadByRange();/按照斷點(diǎn)續(xù)傳的方式下載 ); getContentLengthLoader.load(getContentLengthRequest); private function downloadByRange():void /按照斷點(diǎn)續(xù)傳的方式下載 if(!isInit) init(); var fileStr:FileStream = new FileStream(); if(f

12、ile.exists) /如果文件是存在的,就說(shuō)明下載過(guò),需要計(jì)算從哪個(gè)點(diǎn)開(kāi)始下載 fileStr.open(file, FileMode.READ); startPoint = fileStr.bytesAvailable;/計(jì)算從哪個(gè)點(diǎn)開(kāi)始下載 fileStr.close();/關(guān)閉文件流 endPoint = startPoint+range>contentLength?contentLength:startPoint+range; if(startPoint=contentLength) 推薦精選 Alert.show("您已經(jīng)完成了下載"); return;

13、 var rangeRequest:URLRequest = new URLRequest(videoURL.text); var header:URLRequestHeader = new URLRequestHeader("Range", "bytes="+startPoint+"-"+endPoint);/注意這里很關(guān)鍵,我們?cè)谡?qǐng)求的Header里包含對(duì)Range的描述,這樣服務(wù)器會(huì)返回文件的某個(gè)部分 rangeRequest.requestHeaders.push(header);/將頭信息添加到請(qǐng)求里 rangeStream

14、 = new URLStream(); rangeStream.addEventListener(Event.COMPLETE ,function(e:Event):void var bytesLength:int = rangeStream.bytesAvailable; currentData = new ByteArray(); rangeStream.readBytes(currentData, 0, bytesLength); /得到下載的數(shù)據(jù) fileStr = new FileStream(); fileStr.open(file, FileMode.UPDATE); fileS

15、tr.position = fileStr.bytesAvailable;/將指針指向文件尾 fileStr.writeBytes(currentData, 0, currentData.length);/在文件中寫(xiě)入新下載的數(shù)據(jù) fileStr.close();/關(guān)閉文件流 progress = endPoint/contentLength * 100;/計(jì)算下載進(jìn)程 bar.setProgress(progress,100); bar.label= "Progress" + " " + progress + "%" if(endP

16、oint < contentLength) downloadByRange();/如果下載沒(méi)有完成,則執(zhí)行下一個(gè)斷點(diǎn)下載,直到下載完畢整個(gè)文件 ); rangeStream.load(rangeRequest);/發(fā)起請(qǐng)求 private function pause():void /暫停下載 if(rangeStream!=null&&rangeStream.connected) rangeStream.close(); > </mx:Script> <mx:Canvas width="494" height="28

17、4" horizontalCenter="0" verticalCenter="0"> <mx:Label x="21" y="87" text="下載地址" width="53" fontSize="12" /> <mx:TextInput x="82" y="87" width="399" id="videoURL" text="

18、31:8080/FlexChatServer/AContreCourant.avi"/> <mx:Button x="160" y="141" label="下載" id="btDownload" fontSize="12" click="doDownload();btDownload.enabled=false;btPause.enabled=true;btContinue.enabled=false"/>推薦精選 <mx:Button x="221" y="141" label="暫停" id="btPause" fontSize="12" enabled="false" click="pause();btPause.enabled=false;btContinue.enabled=true"/> <mx:Button x="281" y=&q

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論