Tengo problemas para conectar (a través de las clases Socket y XMLSocket) a un escucha TCP después de un tiempo de espera de conexión.Los sockets de ActionScript 3.0 no pueden volver a conectar
Tengo un applet de flash que necesita mantener una conexión TCP a un servidor. Implementé tiempos de espera usando temporizadores, un sistema ping-pong, etc. Sin embargo, hay un problema. Al llamar a Socket.connect(), el flash player (9.0.115 y muchos otros establos antes de eso) envía 3 solicitudes de conexión por medio de paquetes SYN, con algún tiempo entre ellos. Si ninguno de ellos se responde (por ejemplo, porque el servidor está inactivo), no puedo hacer que el applet intente conectarse al servidor. Nunca. Es decir, dentro de la vida útil del applet.
para aclarar y/o resumir:
Para cualquier puerto par huésped/dado a Socket.connect() o XMLSocket.connect(), si falla la llamada, cualquier subsiguiente Connect() llama a cualquier otro zócalo (o XMLSocket) instancias dentro de la vida útil de la aplicación flash al mismo par de host/puerto se ignoran. (Al menos hasta donde puedo decir usando un sniffer de paquetes.)
He intentado llamar a numerosos métodos Socket, destruyendo¹ y recreando los objetos, usando un grupo de Sockets, y varios otros métodos que no recuerdo ahora ; todo fue en vano.
Mi solución actual es notificar a la página principal a través de una llamada JavaScript y dejar que vuelva a cargar mi applet. No es una solución bonita, y no voy a implementar soluciones para los problemas que causa, simplemente porque Flash no puede manejar las conexiones de socket correctamente.
Me falta algo muy simple.
¿Alguna idea?
1: Sé que realmente no puedes destruir objetos; Simplemente borro todas las referencias a ellos y espero lo mejor. No he intentado invocar explícitamente el GC en este caso. (Aunque creo que lo hice trate de colocar el zócalo interior de una matriz y utilizando eliminar.)
sí, funciona como se espera si la conexión se realiza correctamente (incluso si la conexión se corta más adelante.)
El único evento que desencadena esto es el caso cuando el servidor no responde en absoluto; es como si Flash señala que la combinación de host/puerto está "fuera de línea" y no se molesta en enviar más paquetes durante la vida útil del applet.
Sospecho que un rechazo activo de la conexión (por ejemplo, el host está en línea pero no escucha el puerto) no causa esto.
No recibo ningún mensaje de error ni comentario de ningún otro tipo del Socket.
¿Alguna vez ha llamado a connect() más de una vez al mismo par de host/puerto, cuando falló la primera? ¿Cómo supiste que falló la primera conexión()? Y antes de las siguientes llamadas a connect(), ¿hizo algo para restablecer el socket?
¿La conexión se realiza correctamente si el servidor está disponible? Cuando falla después de las 3 veces, ¿recibe algún mensaje de error? He trabajado mucho con Sockets y nunca me he encontrado con este problema. –