我在連接超時後無法連接(通過Socket和XMLSocket類)TCP偵聽器。ActionScript 3.0套接字無法重新連接
我有一個flash小程序需要維護到服務器的TCP連接。我已經使用定時器,乒乓系統等實現了超時。但是,有一個問題。在調用Socket.connect()之後,flash播放器(9.0.115和之前的其他許多stable)通過SYN數據包發送3個連接請求,其間有一段時間。如果沒有人回覆(例如,因爲服務器關閉),我無法讓小程序嘗試連接到服務器。永遠。也就是說,在applet的生命週期內。
爲了澄清和/或總結:
對於給定的對Socket.connect()或XMLSocket.connect()的任何主機/端口對,如果呼叫失敗,任何後續connect()調用到任何其他插槽(或XMLSocket)實例在Flash小程序到生命週期內的相同主機/端口對被忽略。 (至少據我所知可以使用數據包嗅探器。)
我曾嘗試調用多個Socket方法,銷燬¹並重新創建對象,使用套接字池以及其他各種方法,現在我都記不清了;一切都無濟於事。
我目前的解決方案是通過JavaScript調用通知父網頁,並讓它重新加載我的小程序。這不是一個漂亮的解決方案,我不打算實施問題it原因的解決方法,只是因爲Flash無法正確處理套接字連接。
我一定錯過了一件非常簡單的事情。
任何想法?
1:我知道你不能真的摧毀物體;我只是刪除所有對他們的引用,並希望最好的。在這種情況下,我沒有試圖明確調用GC。 (雖然我覺得我也嘗試把一個陣列內的插口,通過刪除)
是的,它的工作原理,如果連接成功預期(即使連接斷開以後。)
觸發此事的唯一事件是服務器根本沒有響應的情況;就好像Flash將主機/端口組合標記爲「脫機」一樣,並且不會在小程序的生命週期中向它發送更多數據包。
我懷疑主動拒絕連接(例如,主機在線但不監聽端口)不會導致此問題。
我沒有收到來自Socket的任何錯誤消息或任何其他類型的反饋。
當第一個失敗時,你曾經多次調用過connect()到同一個主機/端口對嗎? 你是怎麼知道第一個connect()失敗的?在繼續connect()調用之前,你是否做了任何事情來重置套接字?
如果服務器可用,連接是否正確成功? 3次後失敗,你是否收到錯誤信息?我已經做了很多與套接字的工作,並從未遇到過這個問題。 – 2008-08-14 15:19:35