2011-04-01 71 views
1

首先:這不是關於如何加載策略文件的另一個問題。從策略文件加載失敗中平穩恢復

我有一個應用程序在開發中,連接到套接字服務器,獲取策略文件,並且工作只是丹迪。但是,當套接字服務器由於某種原因關閉時,我需要優雅地回退到從服務器獲取消息的另一種方法(基本上是輪詢)。

這不是一個問題,除了一兩件事:

Error: Request for resource at xmlsocket://[ip]:4770 by requestor from http://[ip]/cooking/Client.swf has failed because the server cannot be reached. 

似乎沒有要搭上這一種方式。我有這些事件偵聽器在我的插座:

addEventListener(Event.CLOSE, closeHandler); 
addEventListener(Event.CONNECT, connectHandler); 
addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 

SecurityErrorEvent是什麼,你可能會認爲火災,但事實並非如此。文檔說它由於以下原因而引發:

  1. 本地不受信任的SWF文件可能無法與Internet通信。您可以通過將文件重新分類爲本地連網或可信任來解決此限制。
  2. 不能指定的套接字端口 高於65535
  3. 在HTML頁面中包含 SWF內容,對象的allowNetworking 參數和嵌入 標籤設置爲「無」。

所以這些都不適用。看來我真正想要捕獲的是策略文件加載失敗,但即使執行明確的Security.loadPolicyFile()也無濟於事,因爲該加載被推遲到第一個套接字請求並且不會觸發任何事件。

爲了完整起見,我還用try {} catch(e:*){}包圍了connect()的調用,但沒有結果。

有一種方法來排序。有任何想法嗎?我只需要一種方法來告訴連接何時因網絡問題而失敗並嘗試替代路徑。

編輯:儘管我以前的測試和文檔,它似乎SecurityErrorEvent不會觸發 - 只有它加載失敗後約20秒,所以它並不明顯。我想這就像我要從Flash獲得的一樣。

回答

0

不要忘記重試連接:)

private function onIOError(e:IOErrorEvent):void { 
    e.stopPropagation(); 
    ++this.retryCount; 
    if(this.retryCount >= 12){ 
    this.connectTimer.stop(); 
    this.dispatchEvent(new Event('TIMIEDOUT')); 
    }else{ 
    this.err = 'IO-ERROR-EVENT - ' + e.text + '\r\nAttempting to reconnect'; 
    } 
}