Форум 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-адрес!


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

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