Я получаю ошибку Sandbox 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?
P.S. Пожалуйста, не говорите мне использовать 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 об этом.
Я могу предоставить полный исходный код как клиента, так и сервера, если кто-то заинтересован.