Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   as3 Socket - адская мутотень (http://www.flasher.ru/forum/showthread.php?t=194944)

CrazyPHP 25.02.2013 14:30

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;
                }
 
        }
 
}

может у меня последовательность какая-то не такая? Весь гугл перерыл, нормальных примеров нет, исходников не нашёл.

iflamberg 25.02.2013 14:33

Цитата:

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

CrazyPHP 25.02.2013 14:36

Цитата:

Сообщение от iflamberg (Сообщение 1122297)
Это нормальное поведение. Именно так. Подключился клиент, запросил политику, отключился. Подключился заново, работает уже в нормальном режиме.

А есть нормальный пример, от начала всей этой бредятины и до момента когда можно уверенно слать команды? Я так и не смг отловить момент второго подключания после получения полиси файла.

iflamberg 25.02.2013 14:49

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

iNils 25.02.2013 15:01

Название темы не раскрывает сыти проблемы.


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

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