Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Соединение flash-клиента и java-приложения. (http://www.flasher.ru/forum/showthread.php?t=145428)

Alex_YAROST_22 07.10.2010 15:38

Соединение flash-клиента и java-приложения.
 
Привет всем.
Первая просьба, пожалуйста не отправляйте в поиск :) Во всех темах по этому вопросу всех отправляют в поиск, а ответа так и нету ;)
Собственно вопрос: есть flash-клиент (не AIR), есть java-приложуха, запускается webstart'ом. Между ними надо установить соединение для обмена данными в... ммм... ну в бинарном виде короче, т.е. не какието xml-структурированные наборы а конкретно bytearray. Соединение создаю использую Socket, не вижу других способов - если есть, буду благодарен.
Собственно по коду вопросов нет, но вываливается Error #2048: Security sandbox violation. Соединение происходит (это видно тем-же netstat'ом) и просто реджектится из-за каких-то ограничений безопасности. Советуют загружать crossdomain - я загружаю. используя Security.loadPolicyFile() и Security.AllowDomain(); да и просто лежит в корне.
В самом кроссдомейнике прописаны все домены и все порты. Коннектится к java-приложухе пробовал и по localhost и по ip-локальной сети. Без разницы.

Посоветуйте плиз, что делать теперь? :( Неужели нет никакого способа установить соединение?

Obi 07.10.2010 16:32

Если crossdomain лежит в корне, в нем все правильно написано и он доступен, должно быть все хорошо. Скиньте ссылку на кроссдоменник.

gloomyBrain 07.10.2010 16:49

Цитата:

использую Socket, не вижу других способов
их нет

Цитата:

Неужели нет никакого способа установить соединение?
Есть - попробуйте отдавать файл политики (его содержимое) по 843-му порту

Alex_YAROST_22 07.10.2010 16:56

Спасибо за ответы, буду пробовать.

crossdomain.xml выглядит следующим образом:
Код:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" secure="false"/>
</cross-domain-policy>


alatar 07.10.2010 19:04

Убедитесь, что сервер правильно отдает файл политик:
Когда проигрыватель Flash Player запрашивает файл политики, он всегда передает следующую строку после установки подключения:
Код:

<policy-file-request/>
Получив эту строку, сервер может передать файл политики. Запрос проигрывателя Flash Player всегда заканчивается нулевым байтом, и ответ сервера также должен заканчиваться нулевым байтом.

Не пытайтесь использовать одно и то же подключение и для запроса файла политики, и для основного подключения. Разорвите подключение после передачи файла политики. Если этого не сделать, проигрыватель Flash Player разрывает подключение, установленное для проверки файла политики, и только после этого устанавливает основное подключение.

afarber 08.10.2010 00:16

Правильно, Вашему ява-коду вначале приходит запрос от клиента:

Код:

<policy-file-request/>\0
На него нужно ответить чем-то вроде:

Код:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>
<allow-access-from domain="*" to-ports="8080"/>
</cross-domain-policy>
\0

Потом клиент закрывает сокет и открывает его снова и начинается настоящее общение.

Можно еще как вариант текст наверху отдавать через порт 843, тогда не будет задержки в 3 секунды. Но не для всех будет работать (из корп. сетей), так что лучше все-таки и по основному сокету уметь ответить.

Если сделать файл mm.cfg:

Код:

ErrorReportingEnable=1
TraceOutputFileEnable=1
PolicyFileLog=1

и установить debug flash player, то можно будет подробнее посмотреть в файлах policyfiles.txt и flashlog.txt.

А файл crossdomain.xml для сокетов рояли не играет.

И смысл всей этой лабуды в том, чтобы если есть корпоративная сеть и какой нибудь работник из нее серфает и открывает интернетную страницу с вражеским баннером, то не дать тому банеру открывать сокетные соединения к mail-серверу или другим серверам внутри этой корпоративной сети.

Alex_YAROST_22 11.10.2010 13:05

Спасибо за обстоятельные ответы. Хотелось бы уточнить некоторые детали:
1. Запрос <policy-file-request/> флэш-плеер отправляет сам, автоматически?
2. Отвечать на него надо уже, соответственно ручками. Т.е. писать в сокет?
3. Пытаемся читать после установления соединения из сокета на стороне ява-приложения, но ничего нет. Может ли так быть, что этот запрос генерируется только когда флэш запускается НЕ локально, а при локальном запуске такого запроса просто не происходит?

update: запустил удаленно. всё равно ява-приложуха нм сокете никаких данных не видит :(

tikhop 11.10.2010 13:19

тут, я думаю, можно найти решение: http://www.broculos.net/tutorials/ho...er/20080320/en

gloomyBrain 11.10.2010 13:32

1- да
2- да
3- да, всегда именно так и есть

Цитата:

запустил удаленно. всё равно ява-приложуха нм сокете никаких данных не видит
если у swf-ки не получается приконнектиться к 843-му порту, то она коннектится к порту приложения, и туда шлет запрос на политику безопасности. Как только получает ответ - отваливается и коннектится снова, если файл политики это разрешает.

ЗЫ
Туториал, приведенный tikhop, на 100% рабочий, проверено =)

Alex_YAROST_22 13.10.2010 15:37

Пока не получается. Хотелось бы уточнить, кто может достоверно сказать - срабатывает ли событие сокета onData ,когда на сокет приходит текст crossdomain-ника? Или он где-то тонет в глубинах реализации сокета? :) (здесь у меня неправильный синтаксис ответа был. надо быть внимательным)

Добавлено через 19 часов 52 минуты
Хорошая тема, хорошее решение :)

Всё получилось, tikhop и afarber особое спасибо. Туториал приведенный tikhop'ом рабочий - 100%

Единственное замечание, выполнять Security.loadPolicyFile() не обязательно! Со стороны клиента необходимо
1. выполнить Socket.connect("127.0.0.1",15556); //предположим это порт где у нас крутится полиси-сервер, т.е. "отвечалка" на <policy-file-request/>
2. выполнить Socket.connect("127.0.0.1",15555); //а это порт по которому идет основная работа с приложением.

Суть в том, что просто при попытке установки соединения запрос безопасности будет отправлен автоматом и если на него правильно ответить, то след. коннект будет выполнен уже без проблем.

А, вот еще что, разновсякие "localhost" "www.vasya.com" не резольвятся при выполнении socket.connect() так что только IP-адрес!

enix 09.11.2010 19:01

у меня возникла проблема при использовании Java сервлетов и Flex.
При написании приложения обнаружил вот что, после того как выложил его на сервер сервлеты для тестирования, флекс ролик не конектится с сервлетом (ролик находится на моем компе), который уже находится в сети (локально все работало).

Потом решил протестировать все это на простом приложении.

Создал сервлет, который возвращает всегда только
out.println("<h1>Соединение прошло успешно Java</h1>");
Выложил его в сеть. Ввел его адрес в браузере для проверки, работает.

Далее создал простое флекс приложение, которое запрашивает этот сервлет и выводит его в текстовом поле. Скомпилировал, запустил, работает.
Но если перенести флекс приложение из папки куда оно компилируется в любую другую, перестает работать (мне известно, что в режиме разработки флекс приложения игнорируют все разрешения, права, песочницы).

Очевидно, что здесь проблема с безопасностью.

Ну конечно я сразу вставил в параметры компилятора
-use-network=true
не помогло

затем в текст флекс приложения добваил

flash.system.Security.allowDomain("http://***:8084");
не помогло

вставил
Security.loadPolicyFile("http://***:8084/tsrv/crossdomain.xml");
Сам crossdomain.xml на сервере содержит

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" secure="false"/>
<site-control permitted-cross-domain-policies="all"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

тоже не помогло

Никаких ошибок приложение не выдает, просто долго ждет ответа от серверной части, а потом будто молча сбрасывает его.

Уверен на 90%, что все дело в настройках безопасности флекс приложения, также возможно (на 10%) дело в безопасности сервера (tomcat или apache). Но вот что не так, не знаю.

Если кто знает, что это за проблема, и где можно почитать о ее решение, буду рад помощи.

dimarik 10.11.2010 13:41

Есть статья на офсайте.
А клиент по http или сокету подключается к сервлету?

Trein 13.11.2010 17:44

Написал сервер и клиента. При взаимодействии происходит следующее:
1) Клиент подключается к серверу
2) Клиент цепляется к порту 843 посылает <policy-file-request/>
3) Не получает ответа и цепляется с тем же запросом к указанному для подключения порту.
4) В ответ сервер отправляет сообщение вида:

Код:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "htp://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="5555-9999" />
</cross-domain-policy>

(Внутри сервера к этому сообщению прицепляется "\0")
5) После чего клиент отключается и не переподключается.

Либо я косячу с файлом политики безопасности, либо не знаю что. К слову, если тестирую клиентское приложение внутри студии, то все работает в порядке (правда тогда он не просит файл политики безопасности).

Добавлено через 19 часов 27 минут
Все, господа! Проблема решена. Оказывается надо было просто к файлу политики безопасности прибавлять не "\0" и не '\0', а "\u0000".


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

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