flex flash sockets sandbox

flex - ¿Por qué Flash Player lanza un error de zona de pruebas en este caso?



sockets sandbox (9)

Obtengo un error de recinto de seguridad Flex 3 # 2048 después de conectarme a un Socket en un servidor Java (1.5). El código del servidor es todo mío, es decir, no se ejecuta bajo Apache. Flash Player 10.0 r32.

La secuencia es la siguiente ...

1 El servidor Java se inicia, escucha en el puerto 843 la solicitud de archivo de política y en el puerto 45455 para mis otras solicitudes.

2 Cliente de Flex servido por Apache (aunque obtengo el mismo resultado si lo ejecuto desde el sistema de archivos), conexión de socket realizada en el host: 45455.

3 Flash Player solicita el archivo de política desde el puerto 843. Este es el comportamiento estándar con las nuevas configuraciones de seguridad que buscan un archivo maestro. Sucede independientemente de si se ha especificado un archivo de política diferente.

4 Sirvo el siguiente XML desde Java a través del puerto 843:

<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <site-control permitted-cross-domain-policies="all"/> <allow-access-from domain="*" to-ports="*" secure="false"/> </cross-domain-policy>

5 El jugador escribe lo siguiente en el registro de política de depuración ...

OK: Root-level SWF loaded: http://localhost/bst/BasicSocketTest.swf OK: Searching for <allow-access-from> in policy files to authorize data loading from resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf OK: Policy file accepted: xmlsocket://192.168.2.3:843 OK: Request for resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf is permitted due to policy file at xmlsocket://192.168.2.3:843

6 Envié un mensaje de texto desde el cliente al servidor en el puerto 45455 usando writeUTFBytes() y flush() (este es mi propio protocolo de mensaje hecho en casa, y se procesa correctamente en cada extremo)

REG/REGISTER;simon;Si

7 La escucha del hilo del servidor Java en el puerto 45455 responde con

REG:0/REGISTER:SUCCESS;simon;Si

8 El cliente de Flex recibe un ProgressEvent y se llama al detector de eventos que até al socket. Proceso el mensaje (escríbalo en un cuadro de texto en la pantalla)

9 ¡El reproductor Flash arroja un error de zona de pruebas 2048 y el socket está desconectado! Esto es después de que el mensaje se recibe y procesa con éxito. De hecho, es aproximadamente 12 segundos después. Nada más funciona a través del socket.

He intentado cargar explícitamente un archivo de política con una llamada a Security.loadPolicyFile() en el cliente Flex, pero la realidad de la seguridad del nuevo reproductor es que básicamente se ignora. Los pasos son que la solicitud de política no se enviará hasta que se produzca una operación de E / S de socket. En ese punto, el jugador siempre va al puerto 843 buscando primero un archivo maestro de políticas. Si encuentra uno, y es permisivo, no va más allá.

He intentado una variedad de formas alternativas de terminar el archivo de política y el contenido del archivo de política, incluidos los errores deliberados solo para ver si Flash Player está activo.

No veo ninguna razón por la cual me arrojarían un 2048. Presto con precisión un archivo de política de socket en el puerto de seguridad maestro designado, que el propio usuario registra como correcto. El socket luego envía y recibe con éxito un mensaje del servidor cuyo contenido está disponible para mi código.

¿Alguien tiene alguna pista de por qué esto puede estar pasando? ¿Error de Flash Player?

PD Por favor , no me digan que use BlazeDS o LCDS o Granite, o alguna otra cosa como servidor, estoy buscando una solución a este problema, no un rediseño. Y por favor no me pidas que use un XMLSocket en su lugar, lo intenté y obtuve exactamente el mismo resultado. He elegido mi arquitectura cuidadosa y deliberadamente y quiero una toma binaria.

EDITAR En respuesta a la petición de James Ward en su comentario, aquí está el mensaje de error completo:

Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.

Tengo un cliente de prueba simplificado que tiene un controlador para cada evento de socket y muestra un mensaje en la pantalla. Esto es lo que muestra:

RequestPolicy: 192.168.2.3:843 Create Socket: 192.168.2.3:45455 Connect: [Event type="connect" bubbles=false cancelable=false eventPhase=2] Sending: REG/REGISTER;[email protected];Si Receiving: REG:0/REGISTER:SUCCESS;[email protected];Si/ Close: [Event type="close" bubbles=false cancelable=false eventPhase=2] Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.

El evento de cierre se dispara inmediatamente después de recibir con éxito una respuesta del servidor, sin embargo, el Error # 2048 no aparece hasta unos 20 segundos más tarde. Si intento enviar otro mensaje después de cerrarlo, pero antes del error, Flash Player arroja una excepción de socket no válida.

He registrado un error en Adobe sobre esto.

Puedo proporcionar el código fuente completo de ambos, cliente y servidor, si alguien está interesado.


Un problema similar aquí indica que localhost no se resolvió a 127.0.0.1.

Puede intentar cambiar a la dirección IP y ver si eso ayuda.


Puede intentar algunas cosas más en el código con la clase Security además de yoru crossdomain.xml

Tratar:

Security.allowDomain("*") Security.allowInsecureDomain("*")

O si está cargando desde servidores externos fuera del host autorizado aporoved:

Security.allowDomain(loader.contentLoaderInfo.url)

Luego, vuelva a encenderlo lentamente hasta que llegue al error.

Asegúrese de poder acceder al archivo de política directamente y no hay ningún bloque u otra aplicación ejecutándose en ese puerto. Normalmente, cuando ejecuto sockets, voy más allá de 5000 solo para asegurarme de que nada esté usando el puerto. O pruebe algunos puertos diferentes.

También como una simple comprobación, asegúrese de llamarlo crossdomain.xml y todo está en minúsculas. He tenido programadores jalando sus cabellos y esta resultó ser la causa.


¿Has intentado agregar el elemento allow-http-request-headers-from?

<allow-http-request-headers-from domain="*" headers="*" />

¿O especificando los puertos reales en lugar de * para el elemento allow-access-from?

<allow-access-from domain="*" to-ports="843,45455" />


trate de poner un espacio en blanco antes de la etiqueta de cierre xml "/>", tal como en las sugerencias dan_nl, por ejemplo:

<allow-access-from domain = "*" />

No te rías, acabo de resolver un problema muy similar al tuyo como este (y realmente parece un error de análisis en mi humilde opinión)


Por casualidad ... ¿esto está ocurriendo en Windows Vista? ¿La dirección IP está especificada como nombre de host? Si es así, mira esto .

¿O tal vez está ocurriendo mientras el generador de perfiles está activo? Si es así, mira esto .


Al enviar el archivo de política, el servidor siempre debe enviar un byte cero después de la política xml. No está claro en la descripción anterior si se envía el byte cero, y esto puede confundir al reproductor Flash eventualmente.


Esto puede o no ayudarlo, pero estábamos teniendo problemas similares. Estábamos obteniendo el error de seguridad pero era inconsistente. Construí la interfaz y trabajé con un desarrollador que estaba tratando con el Socket escrito en PHP. El problema parecía ser que efectivamente había una condición de carrera en la que Flash intentaría conectarse al socket antes de recibir el archivo de política. Así que en la parte delantera creé una nueva prueba en el controlador de error de seguridad que se ejecutaría un número determinado de veces antes de darme por vencido, también establecí el tiempo de espera de los 20 segundos predeterminados a 6 u 8. Por lo general, alcanzaría el segundo prueba y esto ayudó, pero hubo momentos en los que tomaría entre 8 y 10 segundos para conectarse, no una solución óptima.

Encontré algunos enlaces en mis búsquedas y este dijo algo acerca de configurar un retraso en el servidor, séptimo puesto abajo: http://projectdarkstar.com/forum/?action=printpage;topic=1134.0

Al final, descargamos y usamos el servidor de archivos de políticas de Python de este artículo de Adobe y ha funcionado perfectamente, no puedo explicar por qué, no soy un tipo servidor, pero podría valer la pena intentarlo:

ok, solo puedo publicar 1 hipervínculo ya que soy un nuevo usuario, extraño. Busque ''Configuración de un servidor de archivos de políticas de socket'' y debería aparecer, hay archivos de ejemplo en ese artículo en el sitio de Adobe.


He estado probando esto localmente y todo parece funcionar bien hasta que se cierra el socket. ¿No debería cerrarse el zócalo? Después de que el mensaje se envía al cliente de Flex, el código de Java hace:

_in.close(); _out.close(); _socket.close();

Luego, el cliente Flex obtiene la violación de la zona de pruebas la próxima vez que intente comunicarse con el socket. Si creo una nueva conexión de socket de nuevo, enviar y recibir funciona bien, seguido de un cierre. Pero después de un minuto más o menos tengo otra violación de sandbox. Me pregunto si Flash está intentando hacer ping al socket y, dado que está cerrado, arroja la violación de sandbox.


Creo que James Ward tiene razón: ahora estoy trabajando con Sockets y me encontré con este problema el otro día. Encontré una publicación que sugería que si el cliente Flash no cierra el Socket cuando se despacha el evento COMPLETE, esto puede dar como resultado el error que estás viendo. Agregué el código para cerrar el socket del cliente en COMPLETO, y todo está funcionando bien hasta el momento.