Соединение flash-клиента и java-приложения.
Привет всем.
Первая просьба, пожалуйста не отправляйте в поиск :) Во всех темах по этому вопросу всех отправляют в поиск, а ответа так и нету ;) Собственно вопрос: есть flash-клиент (не AIR), есть java-приложуха, запускается webstart'ом. Между ними надо установить соединение для обмена данными в... ммм... ну в бинарном виде короче, т.е. не какието xml-структурированные наборы а конкретно bytearray. Соединение создаю использую Socket, не вижу других способов - если есть, буду благодарен. Собственно по коду вопросов нет, но вываливается Error #2048: Security sandbox violation. Соединение происходит (это видно тем-же netstat'ом) и просто реджектится из-за каких-то ограничений безопасности. Советуют загружать crossdomain - я загружаю. используя Security.loadPolicyFile() и Security.AllowDomain(); да и просто лежит в корне. В самом кроссдомейнике прописаны все домены и все порты. Коннектится к java-приложухе пробовал и по localhost и по ip-локальной сети. Без разницы. Посоветуйте плиз, что делать теперь? :( Неужели нет никакого способа установить соединение? |
Если crossdomain лежит в корне, в нем все правильно написано и он доступен, должно быть все хорошо. Скиньте ссылку на кроссдоменник.
|
Цитата:
Цитата:
|
Спасибо за ответы, буду пробовать.
crossdomain.xml выглядит следующим образом: Код:
<?xml version="1.0"?> |
Убедитесь, что сервер правильно отдает файл политик:
Когда проигрыватель Flash Player запрашивает файл политики, он всегда передает следующую строку после установки подключения: Код:
<policy-file-request/> Не пытайтесь использовать одно и то же подключение и для запроса файла политики, и для основного подключения. Разорвите подключение после передачи файла политики. Если этого не сделать, проигрыватель Flash Player разрывает подключение, установленное для проверки файла политики, и только после этого устанавливает основное подключение. |
Правильно, Вашему ява-коду вначале приходит запрос от клиента:
Код:
<policy-file-request/>\0 Код:
<?xml version="1.0"?> Можно еще как вариант текст наверху отдавать через порт 843, тогда не будет задержки в 3 секунды. Но не для всех будет работать (из корп. сетей), так что лучше все-таки и по основному сокету уметь ответить. Если сделать файл mm.cfg: Код:
ErrorReportingEnable=1 А файл crossdomain.xml для сокетов рояли не играет. И смысл всей этой лабуды в том, чтобы если есть корпоративная сеть и какой нибудь работник из нее серфает и открывает интернетную страницу с вражеским баннером, то не дать тому банеру открывать сокетные соединения к mail-серверу или другим серверам внутри этой корпоративной сети. |
Спасибо за обстоятельные ответы. Хотелось бы уточнить некоторые детали:
1. Запрос <policy-file-request/> флэш-плеер отправляет сам, автоматически? 2. Отвечать на него надо уже, соответственно ручками. Т.е. писать в сокет? 3. Пытаемся читать после установления соединения из сокета на стороне ява-приложения, но ничего нет. Может ли так быть, что этот запрос генерируется только когда флэш запускается НЕ локально, а при локальном запуске такого запроса просто не происходит? update: запустил удаленно. всё равно ява-приложуха нм сокете никаких данных не видит :( |
тут, я думаю, можно найти решение: http://www.broculos.net/tutorials/ho...er/20080320/en
|
1- да
2- да 3- да, всегда именно так и есть Цитата:
ЗЫ Туториал, приведенный tikhop, на 100% рабочий, проверено =) |
Пока не получается. Хотелось бы уточнить, кто может достоверно сказать - срабатывает ли событие сокета 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, время: 17:20. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.