![]() |
Соединение 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-адрес! |
у меня возникла проблема при использовании 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). Но вот что не так, не знаю. Если кто знает, что это за проблема, и где можно почитать о ее решение, буду рад помощи. |
Есть статья на офсайте.
А клиент по http или сокету подключается к сервлету? |
Написал сервер и клиента. При взаимодействии происходит следующее:
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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.