Я получаю ошибку песочницы Flex 3 # 2048 после подключения к Socket на сервере Java (1.5). Код сервера полностью мой, т.е. не работает под Apache. Flash Player 10.0 r32.
Последовательность следующая ...
1 Java-сервер запускается, прослушивает порт 843 для запроса файла политики и порт 45455 для других моих запросов.
2 Клиент Flex, обслуживаемый Apache (хотя я получаю тот же результат, если запускаю его из файловой системы), соединение сокета выполнено на хосте: 45455.
3 Flash Player запрашивает файл политики с порта 843. Это стандартное поведение с новыми параметрами безопасности, ищущими главный файл. Это происходит независимо от того, указан ли другой файл политики.
4 Я обслуживаю следующий XML-код с Java через порт 843:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
</cross-domain-policy>
5 Плеер записывает в журнал политики отладки следующее ...
OK: Root-level SWF loaded: http://localhost/bst/BasicSocketTest.swf
OK: Searching for <allow-access-from> in policy files to authorize data loading from resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf
OK: Policy file accepted: xmlsocket://192.168.2.3:843
OK: Request for resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf is permitted due to policy file at xmlsocket://192.168.2.3:843
6 Я отправляю текстовое сообщение от клиента на сервер через порт 45455, используя writeUTFBytes()
и flush()
(это мой собственный домашний протокол сообщений, который правильно обрабатывается на каждом конце)
REG/REGISTER;simon;Si
7 Поток сервера Java, прослушивающий порт 45455, отвечает
REG:0/REGISTER:SUCCESS;simon;Si
8 Клиент Flex получает ProgressEvent, и вызывается прослушиватель событий, который я привязал к сокету. Обрабатываю сообщение (записываю в текстовое поле на экране)
9 Flash player выдает ошибку песочницы 2048 и сокет отключается! Это после получения и успешной обработки сообщения. На самом деле это примерно через 12 секунд. Больше через розетку ничего не работает.
Я попытался явно загрузить файл политики с вызовом Security.loadPolicyFile()
в клиенте Flex, но на самом деле безопасность нового проигрывателя такова, что он в основном игнорируется. Шаги заключаются в том, что запрос политики не будет отправлен до тех пор, пока не произойдет операция ввода-вывода сокета. В этот момент проигрыватель всегда сначала переходит на порт 843 в поисках главного файла политики. Если он найдет его, и он будет снисходительным, дальше он не пойдет.
Я пробовал множество альтернативных способов завершения работы с файлом политики и содержимым файла политики, включая преднамеренные ошибки, чтобы просто проверить, не спит ли Flash Player.
Я не вижу причин, по которым меня бросили бы 2048. Я точно обслуживаю файл политики сокетов на назначенном главном порте безопасности, который сам плеер регистрирует как правильный. Затем сокет успешно отправляет и получает сообщение от сервера, содержимое которого доступно моему коду.
Кто-нибудь знает, почему это может происходить? Ошибка Flash Player?
PS , пожалуйста, не говорите мне использовать BlazeDS, LCDS или Granite или что-то еще в качестве сервера, я ищу решение этой проблемы, а не редизайн . И, пожалуйста, не просите меня использовать вместо этого XMLSocket - я попробовал это и получил точно такой же результат. Я тщательно и осознанно выбрал свою архитектуру, и мне нужен двоичный сокет.
ИЗМЕНИТЬ В ответ на запрос Джеймса Варда в его комментарии, вот полное сообщение об ошибке:
Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.
У меня есть урезанный тестовый клиент, который имеет обработчик для каждого события сокета и выводит сообщение на экран. Вот что он показывает:
RequestPolicy: 192.168.2.3:843
Create Socket: 192.168.2.3:45455
Connect: [Event type="connect" bubbles=false cancelable=false eventPhase=2]
Sending: REG/REGISTER;[email protected];Si
Receiving: REG:0/REGISTER:SUCCESS;[email protected];Si/
Close: [Event type="close" bubbles=false cancelable=false eventPhase=2]
Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.
Событие закрытия запускается сразу после успешного получения ответа от сервера, однако ошибка №2048 не появляется примерно через 20 секунд. Если я попытаюсь отправить следующее сообщение после закрытия, но до ошибки, Flash Player выдаст исключение недопустимого сокета.
Я зарегистрировал в Adobe ошибку по этому поводу.
Я могу предоставить полный исходный код как клиента, так и сервера, если кому-то интересно.