Показать сообщение отдельно
Старый 19.06.2009, 12:42
vvvvvvf вне форума Посмотреть профиль Отправить личное сообщение для vvvvvvf Найти все сообщения от vvvvvvf
  № 1  
Ответить с цитированием
vvvvvvf

Регистрация: Mar 2009
Сообщений: 107
По умолчанию Проблемы с URLLoader (двойные переменные)

Доброго времени суток.
Написал собственный класс для отправки и получения данных с сервера/на сервер

вот класс

Код AS3:
package main{
	import flash.display.Sprite;
	import flash.events.*;
	import flash.system.*;
	import flash.net.*;
 
	public class LoadData extends Sprite {
		private var Loader:URLLoader;
		private var Request:URLRequest;
		public var varTo:URLVariables;
		public var vars:URLVariables;
 
		public function LoadData():void {
		}
		public function setLoadData():void {
			varTo = new URLVariables();
		}
		public function go(url:String):void {
			System.useCodePage = true;
 
			Request = new URLRequest(url);
			Request.data = varTo;
			Request.method = URLRequestMethod.POST;
 
			Loader = new URLLoader();
			Loader.dataFormat = URLLoaderDataFormat.VARIABLES;
			Loader.load(Request);
			Loader.addEventListener(Event.COMPLETE, completeHandler);
			Loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			Loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
		}
		private function completeHandler(event:Event):void {
			vars = new URLVariables(Loader.data);
			clearEvents();
			dispatchEvent(new Event('loadComplete'));
		}
		private function securityErrorHandler(event:SecurityErrorEvent):void {
			clearEvents();
		}
		private function ioErrorHandler(event:IOErrorEvent):void {
			clearEvents();
		}
		private function clearEvents():void {
			Loader.removeEventListener(Event.COMPLETE, completeHandler);
			Loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			Loader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
		}
	}
}
вот как я его применяю на практике

Код AS3:
package main{
	import flash.display.*;
	import flash.events.*;
	import flash.utils.*;
	import flash.net.*;
 
	public class refrashBattle extends Sprite {
		private var connect:LoadData = new LoadData();
 
		public function refrashBattle():void {
			doTime();
		}
		private function doTime():void {
			connect.setLoadData();
			connect.varTo.myName = 'Вася';
			connect.varTo.myText = 'текст текст текст';
			connect.go('http://localhost/1.php');
			connect.addEventListener('loadComplete', contentBattle, false, 0, true);
 
			intervalReftash = setTimeout(doTime, 5000);
			trace('refrash');
		}
		private function contentBattle(event:Event):void {
			connect.removeEventListener('loadComplete', contentBattle);
			trace(connect.vars.toString())
		}
	}
}
Чтобы небыло лищних вопросов вот php файл, но проблема точно не в нем, так как в броузере все выводиться стабильно.

PHP код:
<?php
header
('Content-Type: text/html; charset=utf-8');

echo 
'newMyName='.$_POST['myName'];
echo 
'&newMyText ='.$_POST['myText'];
?>
Задача очень простая нужно каждые пять секунд обращаться к серверу и получать данные. В данном случае я отправляю две переменные myName и myText на локальный сервер и ответ от сервера вывожу через trace.

По началу все нормально, но потом скажем раз в 10-15 запусков (Ctrl+Enter), первый раз передаются двойные переменные вида
"newMyName=Вася&newMyName=Вася&newMyText=текст текст текст&newMyText=текст текст текст", а через 5 секунд когда идет повторная загрузка переменные передаються нормально, то есть только в первый раз (то есть при первом запуске флешьки) такая проблема и, то не чаще чем раз в 10-15 запусков.

Добавлено через 4 минуты
Разжую еще больше
Первый запуск
&newMyName=Вася&newMyText=текст текст текст
через 5 секунд
&newMyName=Вася&newMyText=текст текст текст
через 5 секунд
&newMyName=Вася&newMyText=текст текст текст
через 5 секунд
&newMyName=Вася&newMyText=текст текст текст

и т.д., но иногда раз в 10-15 запусков идет так

Первый запуск
newMyName=Вася&newMyName=Вася&newMyText=текст текст текст&newMyText=текст текст текст
через 5 секунд
&newMyName=Вася&newMyText=текст текст текст
через 5 секунд
&newMyName=Вася&newMyText=текст текст текст
через 5 секунд
&newMyName=Вася&newMyText=текст текст текст