2013-01-14 94 views
0

我們可以使用URLLoader從服務器發送HTTP請求和偵聽事件。我的問題是URLLoader在哪裏以及如何分派完整的,進度,ioError事件?由於在服務器端,我們不調用dispatchEvent。閃存中的URLLoader事件

類似的代碼如下:

var loader:URLLoader = new URLLoader(); 
loader.addEventListener(Event.COMPLETE, completeHandler); 
loader.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
loader.load(new URLRequest("http://example/lookup")); 

哪個對象分派上述事件,並在它派遣?

回答

0

它們是由虛擬機觸發的,並且最初發生在我的瀏覽器實現NPAPI(例如Gecko API reference)或鉻合金中的PPAPI的某處(我想我不確定這一點)。

+0

@ fsbmain所以XMLHTTPRequest的onreadystatechange也這樣工作? – jason

+1

我不確定XMLHTTPRequest,但它是瀏覽器JS引擎的一部分,因此很難使用插件API,更可能的選擇是NPAPI和JS引擎都使用相同的瀏覽器低級別方法(可由瀏覽器開發人員工具或其他擴展) – fsbmain

0

URLLoader通過HTTP頭來完成。我不是太熟悉HTTP頭,但我知道下面的(從經驗加上從閱讀LiveDocs中):

  • ProgressEvent.PROGRESS每隔一定的時間(閃存SDK中預定義)被分派只要進步已經下載。它不會在每一個下載的字節上發送,也不會有任何押韻或原因,除了似乎是一個固定的時間間隔
  • ProgressEvent.PROGRESS事件的bytesTotal屬性取自Content-Length標題。如果您在請求中發送Range標頭,它應該否定響應中的Content-Length標頭,並獲得0 bytesTotal。您可以通過偵聽HTTPStatusEvent.HTTP_STATUS_RESPONSE來解決此問題,循環瀏覽標題並查找Content-Range標題。您可以使用RegEx從該對象獲取長度。
  • ProgressEvent.PROGRESS事件的bytesLoaded屬性在內部處理。 URLLoader保存每個字節下載到一個ByteArray和bytesLoaded只是ByteArray的length屬性
  • 我不確定如何Event.COMPLETE激發,但我相信它發生在連接被切斷時。
  • IOErrorEvent.IO_ERROR根據Flash SDK內部預定義的情況進行調度。最常見的情況是,它會在出現404錯誤時發送。除此之外,我不確定。

除了在每個請求中發送有效的HTTP Headers以使這些事件正常啓動之外,您不應該在服務器端執行任何操作。一切,大部分都是在內部處理的。我建議你閱讀LiveDocs。他們是非常詳細的,仍然寫在一個非常有用的和豐富的方式,這是非常罕見的編碼文檔