flash networking actionscript

flash - URLLoader se atasca al sondear



networking actionscript (5)

Actualización: de alguna manera esto funciona cuando se ejecuta flash en el navegador, pero no funciona si se ejecuta desde IDE. Es posible que desee intentar ejecutar en el navegador si tiene el mismo problema.

Estoy haciendo una aplicación de chat que lee repetidamente un archivo de texto de mi servidor usando Flash & Actionscript 3.0. Estoy abriendo el archivo con URLLoader, y funciona bien al principio. Sin embargo, después de alrededor de 10 llamadas, el URLLoader se atasca.

No da un evento de finalización, no da un error de seguridad, no da un evento de estado y no lanza una excepción. Simplemente nunca dispara ningún evento en absoluto. Incluso agregué un valor aleatorio a la URL para asegurarme de que no se trate de un problema de almacenamiento en caché. Puedo detectar cuando se bloquea, por supuesto, pero no parece haber ninguna forma de despegarlo. Incluso si llamo a close () en el URLLoader y luego lo configuro como nulo y creo otro, no se reanudará el sondeo.

A continuación se muestra la función que sondea el servidor y recibe una llamada cada dos segundos.

private function check_server() { var url:String = "http://coworkthailand.com/say/snd/index.php?"+Math.random(); if (loader != null) { trace("was already checking "+loader.bytesLoaded+" / "+loader.bytesTotal); return; } loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.TEXT; loader.addEventListener(Event.COMPLETE, completeHandler); loader.addEventListener(flash.events.IOErrorEvent.IO_ERROR, function(e:Event) { loader = null; trace("fail"); }) loader.addEventListener(flash.events.SecurityErrorEvent.SECURITY_ERROR, function(e:Event) { loader = null; trace("security error"); }) loader.addEventListener(flash.events.HTTPStatusEvent.HTTP_STATUS, function(e:flash.events.HTTPStatusEvent) { trace("status "+e.status); }); try { loader.load(new URLRequest(url)); } catch (error:Error) { trace("Unable to load requested document."); } }

¡Este no es un proyecto importante, pero cualquier idea sería muy apreciada!


Solo estoy adivinando aquí, pero quizás el Flash Engine está bloqueado por varios URLLoader paralelos (si por alguna razón uno se queda atrapado durante un poco más de dos segundos, ya tiene dos, etc.)

Mi idea es: usar un solo URLLoader . Configure las devoluciones de llamada y los enganches de eventos en una función init() , y llame a load() y reutilice la misma instancia cada vez que verifique los cambios en el servidor. De esta forma, cuando el URLLoader todavía esté ocupado, la nueva solicitud de carga será ignorada o cancelará la anterior (no estoy seguro de cuál).


Para este escenario, las mejores prácticas dictan el uso de una sola instancia de URLLoader; es probable que te bloqueen en algún lugar con llamadas competidoras. Además, puede intentar usar una bandera simple para detectar si su cargador está ocupado en una llamada existente antes de hacer otra; He aquí un ejemplo de trabajo que usa un solo cargador haciendo solicitudes cada cinco segundos, mostrando tanto el cargador único como el cheque "isOpen":

<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="app_init()"> <mx:Script> <![CDATA[ private var timer:Timer; private var loader:URLLoader; private var isOpen:Boolean; private function app_init():void { timer = new Timer(5000) timer.addEventListener(TimerEvent.TIMER, timer_tick, false, 0, true) loader = new URLLoader(); loader.addEventListener(Event.OPEN, loader_open); loader.addEventListener(Event.COMPLETE, loader_complete); // Start the timer timer.start(); } private function timer_tick(event:TimerEvent):void { // Check if the loader''s busy before calling load, and/or close() if (!isOpen) { // loader.close(); loader.load(new URLRequest("http://mydomain.com/myfile.txt")); } } private function loader_open(event:Event):void { // Mark as open isOpen = true; } private function loader_complete(event:Event):void { // Do work // Mark as closed isOpen = false; } ]]> </mx:Script> </mx:Application>

¡Espero eso ayude! Buena suerte.


También es posible que el objeto esté siendo limpiado por el GC debido a que no están conectados al gráfico principal del objeto.


También vale la pena verificar su tráfico HTTP con Fiddler o Charles, podría ayudarlo a tener una mejor idea de lo que está sucediendo.


Un navegador generalmente solo permite 2 conexiones HTTP KeepAlive simultáneas. Las otras conexiones se posponen.