2010-09-05 15 views
5

così - Ho questo client Socket (non XMLSocket, solo Socket). Ho anche uno script PHP personalizzato sul mio server, che ascolta sulla porta X. Il mio client prova a connettersi ad esso.Errore socket - a volte?

Tutto funziona, sicurezza e comunicazione, sincronizzazione e quant'altro. Ma - il Flash Player (in realtà il runtime AIR) lancia un errore quando prova a connettersi, ma SOLO quando il server non è in esecuzione ... Cosa? È davvero strano - l'errore è in realtà gestito da try catch (IOError), e anche più strano, la linea che viene specificata nell'output come riga di errore è la linea in cui creo solo il socket ...?

Hm ...

uscita:

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] 

Codice:

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

Non importa - il server dovrebbe essere ancora online, gli errori non lo farà presentarsi ... Ma ignorare un errore non è buono.

Un'ultima cosa: quando commento la linea in cui mi connetto effettivamente usando Sock.connect (...) - non lancia l'errore, ma ovviamente non funziona ... Inoltre, la parte di connessione è anche nel blocco try catch (IOError) ...

PERCHÉ Flash dice che il problema è nella riga 167 quando è evidentemente altrove? E/o quale può essere il problema?

risposta

9

Questo potrebbe non sembrare ovvio se non si fosse lavorato con Flash in precedenza, ma molti errori nel net api sono asincroni. Ciò significa che non è possibile catturarli con un blocco catch, perché l'errore non viene generato quando si esegue il metodo connect, ma in un secondo momento.

In realtà, il messaggio di errore indica che si dispone di IOErrorEvent non occupato IOError.

Questa è coperto qui:

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

In sostanza, è necessario aggiungere un gestore per l'IOErrorEvent (aggiungendo uno per SecurityErrorEvent è una buona idea pure). Qualcosa del genere:

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

Oh, penso di aggiungere quel gestore, ma poi penso che sia troppo tardi - posso aggiungerli solo dopo l'inizializzazione ... Ma sì - l'errore è stato fatto da .connect(). Grazie comunque. –

0

Mi sono imbattuto in un errore simile. Stava accadendo perché avevo rimosso il gestore ioErrorHandler (removeEventListener) prima di emettere un sock.close(). sock.close() può lanciare un IoErrorEvent.

Anche se ioErrorEvent è stato lanciato da sock.close(), il debugger lo ha indicato come errore non gestito nella riga in cui è stato chiamato il costruttore socket.

Chiamare removeEventListener() dopo il sock.close() ha risolto il problema.

Spero che questo aiuti.

0

Ho riscontrato l'errore nella stessa situazione con procedura guidata e l'ho risolto modificando l'ordine di chiusura e rimozione del listener di eventi.

Problemi correlati