2010-09-05 16 views
5

तो - मेरे पास यह सॉकेट है (XMLSocket नहीं, बस सॉकेट) क्लाइंट। मेरे पास मेरे सर्वर पर एक कस्टम PHP स्क्रिप्ट भी है, जो पोर्ट एक्स पर सुनती है। मेरा क्लाइंट उससे कनेक्ट करने का प्रयास करता है।सॉकेट त्रुटि - कभी-कभी?

सब ठीक काम करता है, सुरक्षा और संचार, सिंक और जो कुछ भी। लेकिन - फ़्लैश प्लेयर (एआईआर रनटाइम वास्तव में) कनेक्ट करने का प्रयास करते समय एक त्रुटि को गोली मारता है, लेकिन केवल जब सर्वर नहीं चल रहा है ... क्या? यह वास्तव में अजीब है - त्रुटि वास्तव में कोशिश पकड़ने (IOError), और यहां तक ​​कि weirder द्वारा संचालित है, आउटपुट में निर्दिष्ट लाइन त्रुटि रेखा के रूप में लाइन है जहां मैं बस सॉकेट बनाते हैं ...?

हम्म ...

आउटपुट:

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"; 
} 

यह नहीं वास्तव में फर्क पड़ता है - सर्वर ऑनलाइन अभी भी माना जाता है, त्रुटियों नहीं होगा दिखाओ ... लेकिन एक त्रुटि को अनदेखा करना अच्छा नहीं है।

एक और बात: जब मैं उस पंक्ति को टिप्पणी करता हूं जहां मैं वास्तव में सॉक.कनेक्ट (...) का उपयोग करके कनेक्ट करता हूं - यह त्रुटि नहीं फेंकता है, लेकिन यह स्पष्ट रूप से काम नहीं करता है ... इसके अलावा, कनेक्ट हिस्सा है कोशिश करने के लिए भी प्रयास करें (IOError) ब्लॉक ...

फ्लैश का कहना है कि समस्या 167 लाइन पर क्यों है जब यह स्पष्ट रूप से कहीं और है? और/या समस्या क्या हो सकती है?

उत्तर

9

यह स्पष्ट नहीं हो सकता है कि आपने पहले फ़्लैश के साथ काम नहीं किया था, लेकिन नेट एपीआई में कई त्रुटियां असीमित हैं। मतलब, आप उन्हें पकड़ने वाले ब्लॉक से नहीं पकड़ सकते हैं, क्योंकि जब आप कनेक्ट विधि निष्पादित करते हैं, लेकिन बाद के बिंदु पर त्रुटि फेंक नहीं जाती है।

असल में, त्रुटि संदेश कहता है कि आपके पास 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() द्वारा बनाई गई है। फिर भी धन्यवाद। –

0

मुझे एक समान त्रुटि मिली। ऐसा इसलिए हो रहा था क्योंकि मैंने सॉक.क्लोज़() को जारी करने से पहले हैंडलर ioErrorHandler (removeEventListener) को हटा दिया था। sock.close() एक IoErrorEvent फेंक सकता है।

भले ही ioErrorEvent को sock.close() द्वारा फेंक दिया गया था, फिर भी डिबगर ने इसे उस लाइन पर अनचाहे त्रुटि के रूप में दिखाया जहां सॉकेट कन्स्ट्रक्टर को बुलाया गया था।

sock.close() के बाद removeEventListener() को कॉल करने से समस्या हल हो गई।

उम्मीद है कि इससे मदद मिलती है।

0

मुझे विज़ार्ड के साथ एक ही स्थिति में त्रुटि मिली है, और इसे बंद करने के क्रम को बदलने और ईवेंट श्रोता को हटाकर इसे ठीक किया गया है।

संबंधित मुद्दे