Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   sockets + apache + php (http://www.flasher.ru/forum/showthread.php?t=167935)

Anton_sz 14.09.2011 18:24

sockets + apache + php
 
Приветствую. Недавно начал работать с as3 и не могу решить одну задачу:
Нужно из flash передать данные для php скрипта и получить от него ответ, причем сделать это нужно через socket. Причем флешка будет грузиться на одном домене, а скрипт будет находиться на другом.
Вот код as3
Код AS3:

        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.TextEvent;
        import flash.net.Socket;
        import flash.text.TextField;
        import flash.text.TextFieldType;
        import flash.events.ProgressEvent;
        import flash.system.Security;
 
        public class Main extends Sprite
        {
                private var mySocket:Socket;
                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);
                        // entry point
                        var field:TextField = new TextField();
                        field.border = true;
                        field.x = 10;
                        field.y = 10;
                        field.borderColor = 0xCCC;
                        field.width = 780;
                        field.height = 580;
                        field.type = TextFieldType.DYNAMIC;
                        addChild(field);
 
                        mySocket = new Socket();
                        mySocket.addEventListener(Event.CONNECT, onConnect);
                        function onConnect(success:Event):void {
                                if (success) {
                                        field.appendText("Server connection established!\n");
                                } else {
                                        field.appendText("Server connection failed!");
                                }
                        };
 
                        mySocket.addEventListener(ProgressEvent.SOCKET_DATA, onData);
                        function onData(event:ProgressEvent):void {
                                field.appendText(mySocket.readUTFBytes(mySocket.bytesAvailable));
                        };
 
 
                        Security.loadPolicyFile("socket://localhost:80");
                        mySocket.connect("localhost", 80);
                        var str:String;
 
                        str += "GET /index.php?test=text HTTP/1.0\r\n";
                        str += "Host:localhost\r\n";
                        str += "User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2\r\n";
                        str += "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
                        str += "Accept-Language:ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
                        str += "Accept-Encoding:gzip, deflate\r\n";
                        str += "Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.7\r\n";
                        str += "Connection:keep-alive\r\n\r\n";
                        mySocket.writeUTFBytes(str);
                }

Локально все работает. Но когда запускаю флешку с другого домена то не робит.
Вот файл crossdomain.xml:
Код:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain="*" to-ports="80,8080" />
</cross-domain-policy>

Скрипт пхп работает правильно, к нему вопросов нет.
Помогите найти ошибку.
P.S. я новичок в as3. не ругайте сильно, если что не так.

dimarik 15.09.2011 10:01

Цитата:

Вот файл crossdomain.xml:
Сокет не имеет никакого отношения к файлам политик.

Anton_sz 15.09.2011 10:42

Вы ошибаетесь. Вот что сказано про это на help.adobe.com:
Так как проигрыватель Flash Player поддерживает два типа подключений к серверу, существует и два типа файлов политики: файлы политики URL-адресов и файлы политики сокетов.
  • Для подключений на основе документов требуются файлы политики URL-адресов. С помощью этих файлов сервер указывает, что его данные и документы доступны для SWF-файлов, размещенных на определенных доменах или на любых доменах.
  • Для подключений к сокетам требуются файлы политики сокетов, которые обеспечивают прямое сетевое подключение к TCP-сокетам нижнего уровня с помощью классов Socket и XMLSocket.

wvxvw 15.09.2011 13:34

Если соединение делается с использованием классов Socket / XMLSocket, то сразу после соединения либо на порт по умолчанию (забыл какой, но это случайно тот же порт, что Apache использует для SSL), либо на тот же порт, куда вы хотите подключится высылается запрос на получение политик безопасности. Ответ на этот запрос должен выглядеть как содержание файла crossdomain.xml, но наличие файла никак вам не поможет, потому что оно, само по себе никак не связано с открытием порта на том же IP, в то время как программа открывшая порт наверняка уж знает можно или нельзя подключатся.
Вы так же можете указать для определенноги IP в каком порту получать политики безопасности, делается это через
Код AS1/AS2:

Security.loadPolicyFile("xmlsocket://{IP}:{port}");

.

dimarik 15.09.2011 13:53

Цитата:

Сообщение от Anton_sz (Сообщение 1031590)
Вы ошибаетесь. Вот что сказано про это на...

Наверное, я неясно выразился. Файл (файл — поименованная последовательность байтов) в организации доступа по сокету непосредственно может не участвовать. Это может быть xml-like строка в недрах сокет-сервера. И да, вообще crossdomain.xml — это дефолтный файл для разграничения доступа по http(s). Что легко выясняется по предоставленному whitepaper.

Anton_sz 15.09.2011 14:22

Спасибо, помогло. Остался еще один вопрос.
При помощи Security.loadPolicyFile("xmlsocket://test.ru:843"); я забираю файл политик. 843 порт слушает скрипт и отдает этот самый файл.
Если запускать флешку из браузера, то соединение с apache устанавливается, но запрос к скрипту не отсылается.
В логах все чисто:
Код:

ОК: Выполнена загрузка SWF-файла корневого уровня: http://www.test1.ru/sockets.swf
ОК: Выполняется поиск директив <allow-access-from> в файлах политики, чтобы авторизовать загрузку данных из ресурса по адресу xmlsocket://test.ru:843 инициатором запроса из http://www.test1.ru/sockets.swf
ОК: Файл политики принят: xmlsocket://test.ru:843
ОК: Запрос ресурса на xmlsocket://test.ru:843 источника запроса из http://www.test1.ru/sockets.swf разрешен согласно файлу политики на xmlsocket://test.ru:843

пробовал после
Код AS3:

mySocket.writeUTFBytes(str);

делать
Код AS3:

mySocket.flush()

, но не помогло.

Причем, если запускать скрипт из flashdevelop, то все работает.
Где я опять ошибся?

Добавлено через 8 минут
Проблему решил. :) сделал отправку данных в событии
Код AS3:

function onConnect(success:Event):void {
        if (success) {
                field.appendText("Server connection established!\n");
                this.sock.writeUTFBytes( "request" );
                this.sock.flush();
        } else {
                field.appendText("Server connection failed!");
        }
};

И все заработало!
Спасибо за помощь!
Жаль здесь нельзя плюсик в карму поставить :)

Aquahawk 15.09.2011 14:39

Цитата:

Жаль здесь нельзя плюсик в карму поставить
Можно, справа сверху у каждого сообщения есть весы, там и можно.

Anton_sz 15.09.2011 14:53

поставил :)

Aquahawk 15.09.2011 15:04

а мне?:rolleyes:

dimarik 15.09.2011 15:20

Цитата:

Сообщение от Anton_sz (Сообщение 1031704)
Спасибо, помогло. Остался еще один вопрос.
При помощи Security.loadPolicyFile("xmlsocket://test.ru:843"); я забираю файл политик. 843 порт слушает скрипт

Что-то мне нашептывает, что по 843 порту политики отдаются и без запроса и эту строчку можно исключить.

А да, вот оно в whitepaper.

Цитата:

Сообщение от http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/flashplayer/pdfs/flash_player_10_security.pdf
Security.loadPolicyFile()
A policy file allows administrators to grant an application read access to specific server locations (URL policy
files) or to specific port numbers (socket policy files). The default URL policy file is named crossdomain.xml
and is located in the root directory of the target server. The default socket policy file is served from port 843.



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

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