Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 25.02.2013, 14:30
CrazyPHP вне форума Посмотреть профиль Отправить личное сообщение для CrazyPHP Найти все сообщения от CrazyPHP
  № 1  
CrazyPHP

Регистрация: Sep 2008
Сообщений: 27
The bomb! as3 Socket - адская мутотень

Уже второй день не могу разобраться в их работе. Если запускать в самом IDE (не в браузере и не на сайте), то работает отлично, если запускать в браузере, то флешка запрашивает <policy-file-request/> , на что я ей отдаю отличный полиси файл разрешающий всё что угодно:

Код:
<?xml version="1.0" ?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-http-request-headers-from domain="*" headers="*" secure="false"/><allow-access-from domain="*" to-ports="*" secure="false"/></cross-domain-policy>
после получения этого файла флешка тут же отключается! И дальше происходит нечто очень странное, первый же запрос флешки следующий после коонекта, это данные об игроке, они вообще не отсылаются, потому что в этот момент нет соеденения по сокету, однако спустя скажем секунду, когда персонаж начинает двигаться по полю и отсылать данные о координатах, то эти запросы шлются! и автоматом создаётся новый коннект к серверу (с новым resource id). Что за бред? Как можно добиться нормального коннекта до начала общения клиента с сервером?

Вот тут код флешки:

Код AS3:
package 
{
	[SWF(width = "807", height = "730", frameRate = "24", backgroundColor = "#FFFFFF")]
 
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.system.Security;
	import flash.net.Socket
	import flash.events.*;
	import flash.text.*;
	import flash.utils.Timer;
 
	//VK API AND GUI
    import vk.*;
	import vk.gui.*;
	import vk.api.serialization.json.*;
 
	/**
	 * ...
	 * @author Zerg
	 */
	[Frame(factoryClass="Preloader")]
	public class Main extends Sprite 
	{
 
		public var tf: TextField;//тестовое поле для отладки
		public var socket:Socket;//сокет для соеденения
		public var socket_adress:String = "_здесь_был_ip_сервера_";
		public var socket_port:int = 33777;
 
		public var current_player:Object;//массив с данными текущего пользователя
		public var player_obj:player_canva;//текущий пользователь
 
		public var players:Array = [];//массив со всеми подключёнными юзерами
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			//ебанутые настройки безопасности
			//Security.allowDomain("*");
			Security.loadPolicyFile("xmlsocket://_здесь_был_ip_сервера_:33777");
 
			//натсроим сокет, подключение чуть ниже после получения профиля вконтакте, в функции get_user_info() 
			socket = new Socket();
			socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
			socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
			socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			socket.addEventListener(Event.CONNECT, connectHandler);
 
 
			//поле для отладки
			tf = new TextField();
			tf.x = 10;
			tf.y = 50;
			tf.width = 587;
			tf.height = 349;
 
			tf.border = true;
			tf.borderColor = 0xDAE2E8;
			tf.background = true;
			tf.backgroundColor = 0xFFFFFF;
			tf.embedFonts = false;
			var format:TextFormat = new TextFormat();
			format.font = "Tahoma";
			format.color = 0x000000;
			format.size = 11;
			tf.defaultTextFormat = format;
			addChild(tf);
			tf.appendText("Application initialized\n");
 
			//достанем параметры встраивания
			var flashVars: Object = stage.loaderInfo.parameters as Object;
			//если они есть выведем в отладку
			if (flashVars.api_id) {
				tf.appendText("\n// -- Your code for local testing:\n");
				tf.appendText("flashVars['api_id'] = " + flashVars['api_id'] + ";\n");
				tf.appendText("flashVars['viewer_id'] = " + flashVars['viewer_id'] + ";\n");
				tf.appendText("flashVars['sid'] = \"" + flashVars['sid'] + "\";\n");
				tf.appendText("flashVars['secret'] = \"" + flashVars['secret'] + "\";\n");
				tf.appendText("// -- //\n\n");
			}
			//фальш инициализация для тестирования
			if (!flashVars.api_id) { 
				// -- For local testing enter you test-code here: 
				flashVars['api_id'] = _тут_был_номер_; 
				flashVars['viewer_id'] = _тут_был_номер_; 
				flashVars['sid'] = "c523306d9e58c74f12d19de54bc9f02ea19b1a8dd4437c32cb538f31991d7e6a9fff21427b4c65317528d"; 
				flashVars['secret'] = "f728fbc2d6"; 
				// -- /*/ 
			}
 
			//инициализация vk api
			var VK:APIConnection = new APIConnection(flashVars);
 
			//получим профиль текущего юзера
			VK.api('users.get', { uids: flashVars['viewer_id'], fields: "photo" }, get_user_info, api_fail);
		}
 
		public function connect_to_server():void {
			this.socket.connect(this.socket_adress, this.socket_port);
		}
 
		private function connectHandler(event:Event):void {
			//посылаем сигнал о подключении к игре
			join_game();
			tf.appendText("подключаемся\n\n");
		}
 
		private function securityErrorHandler(event:SecurityErrorEvent):void {
			tf.appendText(event.text+"\n\n");
		}
 
		/**
		 * Отправляет данные в сокет, параметр это Object, массив с командой и данными
		 * @param	data
		 */
		private function send_to_socket(data:Object):void {
			//пишем в сокет в виде сериализованного json
			socket.writeUTFBytes(JSON.encode(data));
			//отправка всего что записано в сокет
			socket.flush(); 
		}
 
		/**
		 * Создаёт массив, с обязательым элементом act, для формирования пакета команда+данные
		 * @param	act
		 * @param	vk_id
		 * @return
		 */
		private function command(act:String, uid:String):Object {
			var json_data:Object = new Object();
			json_data.act = act;
			json_data.uid = uid;
			return json_data;
		}
 
		/**
		 * Выполняет подключение к серверу, вход в игру
		 */
		public function join_game():void { 
			var command:Object = this.command('join_game', current_player.uid);
			command.photo = current_player.photo;
			command.first_name = current_player.first_name;
			command.x = player_obj.x;
			command.y = player_obj.y; 
			//отправим данные
			this.send_to_socket(command); 
		}
 
		/**
		 * Отправляет обновлённые данные о текущем состоянии игрока, координаты и прочее
		 */
		public function send_update_state():void {
			var command:Object = this.command('update_state', current_player.uid);	
			command.x = this.player_obj.x;
			command.y = this.player_obj.y;
			//отправим данные
			this.send_to_socket(command);
		}
 
		/**
		 * обновляет состояние игрока указанного
		 * @param	data
		 */
		private function update_state(data:Object):void { 
			//tf.appendText("Новое состояние: "+data.uid+", x = "+data.x+", y = "+data.y+"\n\n");
			//если он не текущий игрок
			if (data.uid != current_player.uid) {
				//найдём этого игрока
				for each( var player_item:player_canva in this.players) {
					//если наш клиент
					if (player_item.uid == data.uid) {
						//обновим данные
						player_item.x = data.x;
						player_item.y = data.y;
					}
				}
			}
		}
 
		/**
		 * добавляет в комнату нового игрока, размещает его на поле
		 * @param	data
		 */
		private function add_player(data:Object):void {
			//добавим его в массив игроков, если он не текущий игрок
			if (data.uid != current_player.uid) {
				//добавим в массив игроков
				this.players.push(data);
				//разместим юзера на сцене
				var new_player:player_canva = new player_canva();
				new_player.draw_sprite = new sprite_player() as MovieClip;
				new_player.avatar_url = data.data.photo;
				new_player.first_name = data.data.first_name;
				new_player.x = 100;
				new_player.y = 100;
				new_player.main = this;
				new_player.is_current = false;//этот юзер не текущий им нельзя управлять
				new_player.uid = data.uid;
				addChild(new_player);
			}
		}
 
		private function ioErrorHandler(event:IOErrorEvent):void {
			tf.appendText(event.text+"\n\n");
		}
 
		private function onSocketData(event:ProgressEvent):void { //tf.appendText(socket.readUTFBytes(socket.bytesAvailable)+"\n\n");
			//декодируем в объект
			var json_data:Object = JSON.decode(socket.readUTFBytes(socket.bytesAvailable));
			//если ошибка
			if (json_data.act == 'error') {
				tf.appendText(json_data.text+"\n\n");
			}
			//вход в игру выполнен
			if (json_data.act == 'join_game') {
				tf.appendText(json_data.text+"\n\n");
			}
			//показать нового игрока в комнате
			if (json_data.act == 'add_player') {
				tf.appendText(json_data.text + "\n\n");
				//создадим нового игрока
				this.add_player(json_data);
			}
			//у когото изменились данные
			if (json_data.act == 'update_state') {
				//обновим данные об игроке этом
				this.update_state(json_data);
			}
			//очистка сокета
			socket.flush();
		}
 
		private function get_user_info(data: Object): void {
			var profile:* = data[0];//профиль пользователя, uid, first_name, last_name, photo (small)
			//запишем данные 
			current_player = profile;
			//разместим юзера на сцене
			player_obj = new player_canva();
			player_obj.draw_sprite = new sprite_player() as MovieClip;
			player_obj.avatar_url = profile.photo;
			player_obj.first_name = profile.first_name;
			player_obj.x = 100;
			player_obj.y = 100;
			player_obj.main = this; 
			//добавим на сцену
			addChild(player_obj);
			//подключаемся
			connect_to_server();
		}
 
		private function api_fail(data: Object): void {
			var error_msg:String = "";
			if (data is String) {
				error_msg = data.toString();		
			}else {
				error_msg = data.error_msg;
			}
			var box:Box = new Box( "Ошибка", "Ошибка в работе VK API дальнейшая работа невозможна! Информация: "+error_msg, 90, 500, [] ); 
			addChild( box );
			box.visible = true;
		}
 
		private function show_box(title: String, text: String): void {
			var box:Box = new Box( title, text, 90, 500, [] ); 
			addChild( box );
			box.visible = true;
		}
 
	}
 
}
может у меня последовательность какая-то не такая? Весь гугл перерыл, нормальных примеров нет, исходников не нашёл.

Старый 25.02.2013, 14:33
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 2  
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Цитата:
я ей отдаю отличный полиси файл разрешающий всё что угодно:
...
после получения этого файла флешка тут же отключается
Это нормальное поведение. Именно так. Подключился клиент, запросил политику, отключился. Подключился заново, работает уже в нормальном режиме.
__________________
мой пустой блог

Старый 25.02.2013, 14:36
CrazyPHP вне форума Посмотреть профиль Отправить личное сообщение для CrazyPHP Найти все сообщения от CrazyPHP
  № 3  
CrazyPHP

Регистрация: Sep 2008
Сообщений: 27
Цитата:
Сообщение от iflamberg Посмотреть сообщение
Это нормальное поведение. Именно так. Подключился клиент, запросил политику, отключился. Подключился заново, работает уже в нормальном режиме.
А есть нормальный пример, от начала всей этой бредятины и до момента когда можно уверенно слать команды? Я так и не смг отловить момент второго подключания после получения полиси файла.

Старый 25.02.2013, 14:49
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 4  
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Отловить где? Для клиента все прозрачно. Он первое подключение не видит вообще. Сервер должен вести себя примерно так:
- Клиент подключился. Ждем от него запроса.
- Клиент присылает запрос на политику - отдаем политику, отключаем клиента(или просто ждем пока он сам отключится, ничего не делая)
- Клиент присылает запрос на авторизацию, вход в игру - нормальное подключение, работаем в нормальном режиме
__________________
мой пустой блог

Старый 25.02.2013, 15:01
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 5  
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Название темы не раскрывает сыти проблемы.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 01:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:46.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.