2010-09-05 23 views
5

所以 - 我有這個Socket(不是XMLSocket,只是Socket)的客戶端。我的服務器上也有一個自定義PHP腳本,它監聽端口X.我的客戶端嘗試連接到它。套接字錯誤 - 有時候?

一切工作正常,安全和溝通,同步和其他任何。但是 - 嘗試連接時,Flash Player(實際上是AIR運行時)會發出錯誤,但只有在服務器未運行時纔會發生錯誤...什麼?這真的很奇怪 - 錯誤實際上是由try catch(IOError)處理的,甚至是weirder,輸出中指定的行作爲錯誤行,我只是在CREATE Socket ...行中?

唔...

輸出:

Error #2044: Unhandled IOErrorEvent:. text=Error #2031: Socket Error. 
    at ---.server::Client()[---/server/Client.as:167] 
    at Function/<anonymous>()[---_fla.MainTimeline::frame1:430] 
    at Function/<anonymous>() 
    at Function/<anonymous>()[---_fla.MainTimeline::frame1:375] 

代碼:

try { 
    Sock = new Socket(); // THIS is line 167 
} catch (e:IOError){ 
    log("Could not connect!"); 
    status = "disconnected"; 
} 

它並不真正的問題 - 服務器應該是還在網上,這些錯誤將不會出現...但忽略錯誤並不好。

還有一件事:當我使用Sock.connect(...)註釋掉實際連接的行時 - 它不會拋出錯誤,但它顯然不起作用...另外,連接部分是也試圖捕捉(IOError)塊...

爲什麼Flash會說這個問題在第167行?和/或可能是什麼問題?

回答

9

如果您之前沒有使用過Flash,這可能看起來並不明顯,但net api中的許多錯誤是異步的。意思是,你不能用catch塊捕捉它們,因爲當你執行連接方法時不會拋出錯誤,但是在稍後的時間點。

實際上,錯誤消息表示您有一個未捕獲的IOErrorEvent而不是IOError

這是這裏介紹:

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/Socket.html#connect()

基本上,你必須添加一個處理程序IOErrorEvent(添加一個用於SecurityErrorEvent是一個好主意爲好)。就像這樣:

private function connect():void { 
    socket = new Socket(host,port); 
    // handle asynchronous errors in these handlers 
    socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
    socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
    try { 
     socket.connect(); 
    } catch(ioError:IOError) { 
    // handle synchronous errors here 
    } catch(secError:SecurityError) { 
    // and here 
    } 
} 

private function ioErrorHandler(event:IOErrorEvent):void { 
    trace("ioErrorHandler: " + event); 
} 

private function securityErrorHandler(event:SecurityErrorEvent):void { 
    trace("securityErrorHandler: " + event); 
} 
+0

噢 - 我雖然要添加該處理程序,但後來我儘管已經太遲了 - 我只能在初始化之後添加它們...但是 - 錯誤是由.connect()創建的。不管怎麼說,多謝拉。 – 2010-09-05 18:14:11

0

我遇到了類似的錯誤。這是因爲我在發出sock.close()之前刪除了處理程序ioErrorHandler(removeEventListener)。 sock.close()可以拋出一個IoErrorEvent。

儘管sock.close()引發了ioErrorEvent,但調試器在調用套接字構造函數的行中將其顯示爲未處理的錯誤。

在sock.close()之後調用removeEventListener()解決了問題。

希望這會有所幫助。

0

我在嚮導的相同情況下得到了錯誤,並通過更改關閉和移除事件偵聽器的順序來修復它。