2010-09-05 12 views
5

así que tengo este cliente Socket (no XMLSocket, solo Socket). También tengo un script PHP personalizado en mi servidor, que escucha en el puerto X. Mi cliente intenta conectarse a él.Error de socket - a veces?

Todo funciona bien, la seguridad y la comunicación, la sincronización y todo lo demás. Pero, el Flash Player (en realidad, el tiempo de ejecución de AIR) genera un error al intentar conectarse, pero SÓLO cuando el servidor no se está ejecutando ... ¿Qué? Es realmente extraño: el error es realmente manejado por try catch (IOError), y aún más raro, la línea que se especifica en el resultado como la línea de error es la línea donde CREO el socket ...?

Hm ...

Salida:

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] 

Código:

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

Realmente no importa - el servidor se supone que sigue en línea, los errores no lo hará aparecer ... Pero ignorar un error no es bueno.

Una cosa más: cuando comento la línea donde realmente me conecto usando Sock.connect (...) - no arroja el error, pero obviamente no funciona ... Además, la parte de conexión es también en el bloque try catch (IOError) ...

¿Por qué Flash dice que el problema está en la línea 167 cuando obviamente está en otra parte? ¿Y cuál puede ser el problema?

Respuesta

9

Esto puede no parecer obvio si no había trabajado anteriormente con Flash, pero muchos errores en la API de red son asincrónicos. Es decir, no puede atraparlos con un bloque catch, porque el error no se produce cuando ejecuta el método connect, sino en un momento posterior.

De hecho, el mensaje de error dice que tiene un IOErrorEvent no capturado no un IOError.

Esto se explica aquí:

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

Básicamente, hay que añadir un controlador para el IOErrorEvent (añadiendo una para SecurityErrorEvent es una buena idea también). Algo como esto:

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, pensé en agregar ese controlador, pero luego pensé que ya era demasiado tarde. Puedo agregarlos solo después de inicializar ... Pero sí, el error lo comete el .connect(). Gracias de todos modos. –

0

Me encontré con un error similar. Se estaba produciendo porque había eliminado el manejador ioErrorHandler (removeEventListener) antes de emitir un sock.close(). sock.close() puede lanzar un IoErrorEvent.

Aunque ioErrorEvent fue lanzado por sock.close(), el depurador lo mostró como un error no controlado en la línea donde se llamó al constructor de socket.

Llamar a removeEventListener() después de que sock.close() resolvió el problema.

Espero que esto ayude.

0

Recibí el error en la misma situación con el asistente, y lo arreglé cambiando el orden de cierre y eliminé el detector de eventos.

Cuestiones relacionadas