Подтвердить что ты не робот

Почему в этом случае Flash Player бросает ошибку в песочнице?

Я получаю ошибку 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 об этом.

Я могу предоставить полный исходный код как клиента, так и сервера, если кто-то заинтересован.

4b9b3361

Ответ 1

Я тестировал это локально, и все работает нормально, пока сокет не будет закрыт. Не следует ли закрывать розетку? После того, как сообщение отправлено клиенту Flex, код Java выполняет:

_in.close();
_out.close();
_socket.close();

Затем клиент Flex получает нарушение песочницы в следующий раз, когда пытается связаться с сокетом. Если я снова создаю новое соединение сокетов, тогда отправка и получение прекратятся, за которым следует закрытие. Но через минуту или около того я получаю другое нарушение песочницы. Интересно, пытается ли Flash выполнить ping сокет, и поскольку он закрыл его, это порождает нарушение песочницы?

Ответ 2

Вы пытались добавить элемент allow-http-request-headers-from?

<allow-http-request-headers-from domain="*" headers="*" />

Или указать фактические порты вместо * для элемента allow-access-from?

<allow-access-from domain="*" to-ports="843,45455" />

Ответ 3

Аналогичная проблема здесь указывает, что localhost не был разрешен до 127.0.0.1.

Вы можете попробовать перейти на IP-адрес и посмотреть, помогает ли это.

Ответ 4

Вы можете попробовать несколько вещей далее в коде с классом безопасности в дополнение к yoru crossdomain.xml

Try:

Security.allowDomain("*")
Security.allowInsecureDomain("*")

Или, если вы загружаетесь с внешних серверов за пределами разрешенного хоста:

Security.allowDomain(loader.contentLoaderInfo.url)

Затем медленно включите его, пока не нажмете на ошибку.

Убедитесь, что вы можете нажать файл политики напрямую, и на этом порте нет какого-либо блока или другого приложения. Обычно, когда я запускаю сокеты, я выше 5000, чтобы убедиться, что ничего не использует порт. Или попробуйте несколько разных портов.

Также как простая проверка, убедитесь, что вы назвали его crossdomain.xml, и все это в нижнем регистре. У меня были программисты, вытягивающие волосы, и это оказалось причиной.

Ответ 5

попробуйте поставить пробел перед закрывающим тегом xml "/" > ", как в предложениях dan_nl, например:

< allow-access-from domain = "*" / >

Не смейтесь над этим, я просто решил проблему, очень похожую на вашу, как это (и она действительно выглядит как синтаксическая ошибка IMHO)

Ответ 6

Случайно... это происходит в Windows Vista? Является ли IP-адрес указанным именем хоста? Если да, см. this.

Или, может быть, это происходит, когда профилировщик активен? Если это так, см. this.

Ответ 7

При отправке файла политики сервер всегда должен отправлять нулевой байт после политики xml. Из приведенного выше описания неясно, отправлен ли нулевой байт, и это может в конечном итоге запутать Flash-плеер.

Ответ 8

Это может или не поможет вам, но у нас были подобные проблемы. Мы получили ошибку безопасности, но это было непоследовательно. Я построил интерфейс и работал с разработчиком, который имел дело с Socket, написанным на PHP. Проблема заключалась в том, что действительно было состояние гонки, в котором Flash попытается подключиться к сокету до получения файла политики. Таким образом, на переднем конце я создал повторную попытку в обработчике ошибок безопасности, который будет запускать определенное количество раз перед тем, как отказаться, а также установить тайм-аут от 20 секунд по умолчанию до 6 или 8. Это обычно ложится на 2-й попробуйте, и это действительно помогло, но были моменты, когда для соединения потребовалось бы 8-10 секунд, а не оптимальное решение.

В нескольких моих поисковых системах появилось несколько ссылок, и он сказал что-то о настройке задержки на сервере, 7-й пост: http://projectdarkstar.com/forum/?action=printpage;topic=1134.0

В конце мы загрузили и использовали файл файлового сервера политики Python из этой статьи Adobe, и он работает безупречно, я не могу объяснить, почему, я не парень сервера, но это может стоить того:

ok, я могу опубликовать только 1 гиперссылку, так как я новый пользователь, странный. Найдите "Настройка файлового сервера сокета", и он должен появиться правильно, есть примеры файлов в этой статье на сайте Adobe.

Ответ 9

Я думаю, что Джеймс Уорд прав, я сейчас работаю с Sockets, и я столкнулся с этим вопросом на днях. Я нашел сообщение, в котором говорилось, что если клиент Flash не закрывает Socket при отправке события COMPLETE, это может привести к ошибке, которую вы видите. Я добавил код, чтобы закрыть клиент Socket на COMPLETE, и все работает нормально до сих пор.