Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   xmlsocket (http://www.flasher.ru/forum/showthread.php?t=202178)

razerw 02.07.2013 17:55

xmlsocket
 
Всем привет. ни как не получается соединяться с сокетом через флеш клинкета, вот такая ошибочка выходит, если компелировать на компе.

Error #2044: Необработанный ioError:. text=Error #2031: Ошибка сокета.
at XMLSocketExample()

Чуть позже вот это

Error #2044: Необработанный securityError:. text=Error #2048: Нарушение изолированной среды: file:///C|/Documents%20and%20Settings/moiseev/Рабочий%20стол/1/Безымянный%2D1.swf не может загрузить данные из :8080.
at XMLSocketExample()


если запускать с веб сервера денвер никаких ошибок, только надпись Соединение не установлено.
фаил политики безопасности сокетов выглядит так. я его размещаю в корневой папке.

PHP код:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<!-- Policy file for xmlsocket://socks.mysite.com --> 
<cross-domain-policy>  
    <allow-access-from domain="*" to-ports="*" />  
</cross-domain-policy>

код моего приложения таков.

Код AS3:

package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.XMLSocket;
        import flash.system.Security;
 
    public class XMLSocketExample extends Sprite {
        private var hostName:String = null;
        private var port:uint = 8080;
        private var socket:XMLSocket;
 
        public function XMLSocketExample()
                {
 
                        flash.system.Security.loadPolicyFile("xmlsocket:localhost:8080");
                        socket_off.text = "Соединение не установлено";
                        socket_connekt.text = "Данные не получены";
            socket = new XMLSocket();
            socket.addEventListener(Event.CONNECT, onConnect);
                        socket.addEventListener(DataEvent.DATA, onDatta);
            socket.connect(hostName, port);
        }
 
                private function onConnect(event:Event):void
                {
                        trace(event.type);
                        socket_off.text = "Соединение успешно установлено";
                        socket.send('shutdown');
                }
 
                private function onDatta(event:Event):void
                {
 
                        socket_connekt.text = "Данные получены";
                }
    }
}

Добавлено через 15 минут
исправил код, прослушал события. но соединение все равно не происходит (
Код AS3:

package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.XMLSocket;
        import flash.system.Security;
 
    public class XMLSocketExample extends Sprite {
        private var hostName:String = null;
        private var port:uint = 8080;
        private var socket:XMLSocket;
 
        public function XMLSocketExample()
                {
 
                        flash.system.Security.loadPolicyFile("xmlsocket://localhost:8080");
                        socket_off.text = "Соединение не установлено";
                        socket_connekt.text = "Данные не получены";
            socket = new XMLSocket();
            socket.addEventListener(Event.CONNECT, onConnect);
                        socket.addEventListener(IOErrorEvent.IO_ERROR, loaderHandleIOError);
                        socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loaderHandleSecurityError);
                        socket.addEventListener(DataEvent.DATA, onDatta);
            socket.connect(hostName, port);
        }
 
                private function onConnect(event:Event):void
                {
                        trace(event.type);
                        socket_off.text = "Соединение успешно установлено";
                        socket.send('shutdown');
                }
 
                private function onDatta(event:Event):void
                {
 
                        socket_connekt.text = "Данные получены";
                }
 
                private function loaderHandleIOError(event:IOErrorEvent):void
                {
 
                }
                private function loaderHandleSecurityError(event:SecurityErrorEvent):void
                {
 
                }
    }
}


maxkar 02.07.2013 19:26

Не важно, где вы размещаете файл. Он (crossdomain.xml) не используется для xmlsocket. Текст данного файла должен отдаваться на запрос по xml-socket'у (и только по нему!). Ну плюс еще мелочи вроде завершающего нулевого байта и закрытия соединения. Так что правьте ваш сокет-сервер.

Добавлено через 31 секунду
Уточню. Не на любой запрос. А на запрос <policy-file-request/>

Korchy 02.07.2013 21:18

2 razerw

Принцип подключения через сокет из флеша таков:

1. Клиентский сокет (флеш) стучится к серверному сокету по порту 843
2. Серверный сокет подключает клиентский и встает на прослушку
3. Клиентский сокет отправляет строку <policy-file-request/>
4. Серверный сокет, получив ее, отправляет в ответ текст вашего полиси-файла.
5. Клиентский сокет, получив его, закрывается.
6. Клиентский сокет стучится к серверу вновь по тому порту, который разрешен в полиси-файле
7. Серверный сокет подключается и встает на прослушку.
8. Все, соединение установлено, можно обмениваться данными через сокеты.

п 1 - 6 с клиентского сокета выполняются автоматически (флеш делает все сам при connect). Обеспечить чтобы действия правильно выполнял серверный сокет - ваша задача.

как правильно указывает вам maxkar, полиси-файл это не тоже самое, что кроссдомен. То, что в нем должно быть, смотрите в хелпе.

razerw 02.07.2013 23:01

Ничего подобного в мануале я не нашел. там лиш приводится тот код который я выложил и то без загрузки политик сокета. а так же без прослушивания событий. Может быть есть рабочий живой пример структуры кода на ас3 клиента?

maxkar 02.07.2013 23:49

А на клиенте все нормально вроде бы. Максимум - не тот порт может быть указан. Это абсолютно точно проблемы на сервере. У меня есть полный пример клиента и сервера.

Korchy 03.07.2013 00:48

2 razerw

Еще раз по вашим ошибкам:
1. Вы получаете

Error #2044: Необработанный ioError

потому, что сокет не может осуществить подключение на п. 7 (алгоритм, что я приводил выше)

2. Вы получаете

Error #2044: Необработанный securityError:.

потому, что в п.1-4 ваш клиентский сокет не получил адекватного полиси-файла.

3. Отсюда делаем вывод: проверяем сервер на предмет отдачи им полиси-файла по 843 порту. Когда сервер научится отдавать файл политики правильно, вы сможете осуществить подключение.


Ну, а вот мануалы по клиентской стороне:

В конце приводится общий пример подключения
http://help.adobe.com/ru_RU/FlashPla...XMLSocket.html

Про файл политики (см. "подключение к сокетам")
http://help.adobe.com/ru_RU/ActionSc...8a9b90204-7c63

razerw 03.07.2013 12:41

то есть код моего клиента корректный?
Я так понял понял вот эта строка вообще лишняя
Код AS3:

Security.loadPolicyFile("xmlsocket://localhost:1028");

сокет сервер должен постоянно отправлять фаил политики? не понятно в какой структуре.
И кстати сокет сервер реализован на php я так понял это вообще не подходит для этой концепции?

Korchy 03.07.2013 18:50

2 razerw

Эта строчка ( Security.loadPolicyFile("xmlsocket://localhost:1028"); ) нужна только если ваш сервер отдает полиси-файл по порту 1028 а не по дефолтному 843.

Сокет сервер должен отдать файл политики только один раз при подключении. Когда сервер получает строку <policy-file-request/> он должен отдать полиси-файл. Если подключение прошло, больше он этой строки не получит и соотв-но не отдаст полиси-файл.

Не важно на чем реализован сервер. Важно, как он выполняет свои задачи. В php есть все для создания сервера, значит сервер на нем вполне имеет право быть.

razerw 04.07.2013 11:57

Спасибо за подсказки. Они меня стимулируют гыы) и есть определенный успех! Сервер слушает 843 порт, после активности на порту отправят код политики. И появилась проблема в том что я не знаю как просматривать запросы между сервером и клиентом. Может быть есть какие то проги? Юзал прогу Charles, но к сожалению она только показывает команды echo.

Korchy 04.07.2013 13:18

2 razerw

Программы есть, но я ими не пользовался. Мне было достаточно вывода в консоль на сервере и трейса во флеше. Просто вариантов не так много. Вы получаете секурити еррор, если трабла с политикой и и-о еррор если трабла с подключением. Если не получено никаких ошибок, значит все работает :)


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

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