Просмотр полной версии : Флешка не реагирует на cross-domain-policy (Ошибка 2048) ?
Доброго времени суток.
Уже несколько дней бьюсь над проблемой соединения
флешки с сервером через сокет (оба на локалхост).
Читал кажется всю необходимую информацию, даже
установил специальную программку - сервер socket policy file server
( хотя в итоге у меня сервер должен быть на php ).
Такое впечатление, что флешка не хочет воспринять
ответ <cross-domain-policy>... (хотя запрашивает <policy-file-request/>).
При попытке подключения по сокету всегда выдает ошибку securityError.
В ответе на <policy-file-request/> у меня:
<allow-access-from domain="*" to-ports="*" secure="false" />
Программка не нужна, просто еще один сокет сервер, ожидающий policy-file-request и отпарвляющий в ответ xml-строку с политикой доступа. По умолчанию порт, на котором флеш ищет файл crossdomain.xml - 843 (ну и еще тот, к которому подключаемся). С другого порта можно загрузить так: Security.loadPolicyFile("xmlsocket://" + Host + ":" + PolicyPort); Да, и secure="false", это просто рекомендация, лучше на вермя тестирования её убрать, для "чистого" резульатата :)
Да, да, именно так все воспринимаю,
эта програмка и есть сервер, который по идее должен выдать
ответ на 843 порте на запрос <policy-file-request/>.
Но дело в том, что когда отправляю этот ответ с помощью php сервера,
все равно ошибка не исчезает.
С помощью сервера на php отправляю
"<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n";
Правда, в обоих случаях не представляю как зафиксировать, факт,
что флеш получил ответ.
1. Попробуйте сделать политику отдельным файлом (кстати и удобнее править будет в случае чего). Вот, взято с адобовского сайта:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>
2. В конце при отправке после \n добавляете еще \0
Флеш использует \0 как подтверждение конца блока данных.
1) Да, пробовал и отдельный файл поставить на сервер, тоже не помогло.
2) Добавил \0 в конце ответа, т.е, получилось
"<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n\0";
Не помогло.
Заметил странность, когда флеш отправляет запрос на полиси,
мой сервер на php почему-то отключается :-) .
При отправке этого же запроса <policy-file-request/> вручную,
такого не происходит.
На всякий случай привожу код php сервера:
error_reporting(E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit(0);
/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();
$address = '127.0.0.1';
$port = 843;//10000;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}
if (socket_bind($sock, $address, $port) === false) {
echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
if (socket_listen($sock, 5) === false) {
echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
do {
if (($msgsock = socket_accept($sock)) === false) {
echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
break;
}
/* Send instructions. */
$msg = "\nWelcome to the PHP Test Server. \n" .
"To quit, type 'quit'. To shut down the server type 'sd'.\n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'sd') {
socket_close($msgsock);
break 2;
}
if( strstr( $buf, "policy-file" ) ){ //<policy-file-request/>
$talkback="<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n\0";
socket_write($msgsock, $talkback, strlen($talkback));
echo "received:{$buf}\n";
//break;
}else{
$talkback = "You said '$buf'.\n";
socket_write($msgsock, $talkback, strlen($talkback));
echo "received:{$buf}\n";
}
} while (true);
socket_close($msgsock);
} while (true);
socket_close($sock);
1) Да, пробовал и отдельный файл поставить на сервер, тоже не помогло.
Кодировка utf ?
Что значит отключается? Если обрывается соединение - так и должно быть. После получения политики сокет обрывает соединение и устанавливает по новой на назначенном порту.
Попробуйте убрать всякие "you say" и т.п. Сервер политики должен только получать запрос политики, отдавать ответ с правилами политики и закрывать соединение после отдачи. Ничего лишнего не должно быть.
Кодировка файла crossdomain.xml utf
А во флеше у меня
Security.loadPolicyFile("http://localhost/путь_к_файлу/crossdomain.xml");
Притом swf-ка тоже находится в той же папке, вместе с html страницей.
Кстати, в этом файле crossdomain.xml все символы вроде такие, что не
должно иметь значение utf.
А сервер на php действительно отключается, т.е, сама консольная программа
отключается почему-то (а не соединение) , когда флешка пытается подкючиться
по сокету :-)
Security.loadPolicyFile("http://localhost/путь_к_файлу/crossdomain.xml");
А это зачем?
Вы не путаете понятия кроссдомена и сокет-политики?
Для того чтобы подключить сокет-соединение, не нужно грузить файл политики отдельно (если он не лежит где-нибудь отдельно от сайта).
var sock = new Socket();
sock.addEventListener(Event.CONNECT, OnConnect);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, OnSecurityError);
sock.connect(MyHosht,Port); // хост, порт
Все, больше ничего не нужно. Сокет сам опросит сервер по 843 порту на предмет получения файла политики, если получит - он сам переподключится на указанный порт и дистпатчнет событие OnConnet, если нет - просто бросит OnSecurityError
Ну и проверяйте свой php сервер. Раз он отключается при попытке коннекта, значит определенно имеет какие-то проблемы.
Ок, спасибо
Действительно с php у меня видимо что-то нито,
потому, что там не нормально работает также код записи лога в файл.
Но вопрос в том, что я в начале использовал для ответа полиси
не php, другой сервер специальный для флеша (называется Socket policy file server ).
Тоже не исчезает ошибка securityError.
Код подключения сокета во флешке у меня примерно такой же, как у Вас.
var s:Socket = new Socket( host, port );
s.addEventListener(ProgressEvent.SOCKET_DATA, sData );
s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, secuerror);
function secuerror(event:SecurityErrorEvent):void
{
trace(event);//Получаю SecurityErrorEvent type="securityError"... Error #2048
}
Вот сейчас слушаю порт 843.
при подключении сокета пришел запрос <policy-file-request/>
и потом соединение сразу же разорвано со стороны
клиента (флешки очевидно).
Флешка наверно не должна была так быстро сбрасывать соединение?
Добавлено через 28 часов 29 минут
Сменил номер порта подключения с 1000 на 12000,
ошибка (securityError ) исчезла.
Огромное спасибо за ответы :-)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.