Я получаю ошибку песочницы Flex 3 # 2048 после подключения к сокету на сервере 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 выдает ошибку «песочница» 2048, и розетка отключена! Это после сообщение получено и успешно обработано. На самом деле это около 12 секунд после. Больше ничего не работает через сокет.
Я попытался явно загрузить файл политики с помощью вызова Security.loadPolicyFile()
в клиенте Flex, но реальность безопасности нового плеера заключается в том, что он в основном игнорируется. Шаги состоят в том, что запрос политики не будет отправлен, пока не произойдет операция ввода-вывода сокета. В этот момент проигрыватель всегда сначала переходит на порт 843 в поисках главного файла политики. Если он найдет его и он разрешит, он не пойдет дальше.
Я испробовал множество альтернативных способов завершения работы файла политики и содержимого файла политики, в том числе преднамеренные ошибки, просто чтобы проверить, проснулся ли Flash Player.
Я не вижу причин, по которым мне бросили бы 2048. Я точно подаю файл политики сокетов на указанном главном порте безопасности, который сам игрок регистрирует как правильный. Затем сокет успешно отправляет и получает сообщение с сервера, содержимое которого доступно для моего кода.
Кто-нибудь знает, почему это может происходить? Ошибка Flash Player?
PS Пожалуйста, не говорите мне использовать BlazeDS, LCDS или Granite, или что-то еще в качестве сервера, я ищу решение этой проблемы, а не перепроектировать. И, пожалуйста, не просите меня использовать вместо него XMLSocket - я попробовал это и получил точно такой же результат. Я тщательно и обдуманно выбрал свою архитектуру и хочу использовать бинарный сокет.
EDIT
В ответ на запрос Джеймса Уорда в его комментарии, вот полное сообщение об ошибке:
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;simon.palmer@gmail.com;Si
Receiving: REG:0/REGISTER:SUCCESS;simon.palmer@gmail.com;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.
Событие close вызывается сразу после успешного получения ответа от сервера, однако ошибка # 2048 появляется не раньше, чем через 20 секунд. Если я попытаюсь отправить еще одно сообщение после закрытия, но до ошибки, Flash Player выдаст недопустимое исключение сокета.
Я зарегистрировал ошибку в Adobe по этому поводу.
Я могу предоставить полный исходный код как клиента, так и сервера, если кому-то интересно.