Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.05.2013, 23:24
SiteLev вне форума Посмотреть профиль Отправить личное сообщение для SiteLev Найти все сообщения от SiteLev
  № 1  
Ответить с цитированием
SiteLev

Регистрация: Mar 2008
Сообщений: 13
По умолчанию Флешка не реагирует на 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" />

Старый 12.05.2013, 01:58
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 2  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Программка не нужна, просто еще один сокет сервер, ожидающий policy-file-request и отпарвляющий в ответ xml-строку с политикой доступа. По умолчанию порт, на котором флеш ищет файл crossdomain.xml - 843 (ну и еще тот, к которому подключаемся). С другого порта можно загрузить так: Security.loadPolicyFile("xmlsocket://" + Host + ":" + PolicyPort); Да, и secure="false", это просто рекомендация, лучше на вермя тестирования её убрать, для "чистого" резульатата

Старый 12.05.2013, 05:21
SiteLev вне форума Посмотреть профиль Отправить личное сообщение для SiteLev Найти все сообщения от SiteLev
  № 3  
Ответить с цитированием
SiteLev

Регистрация: Mar 2008
Сообщений: 13
Да, да, именно так все воспринимаю,
эта програмка и есть сервер, который по идее должен выдать
ответ на 843 порте на запрос <policy-file-request/>.
Но дело в том, что когда отправляю этот ответ с помощью php сервера,
все равно ошибка не исчезает.
С помощью сервера на php отправляю
Код:
"<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n";
Правда, в обоих случаях не представляю как зафиксировать, факт,
что флеш получил ответ.


Последний раз редактировалось SiteLev; 12.05.2013 в 14:18.
Старый 12.05.2013, 09:54
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 4  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
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 как подтверждение конца блока данных.
__________________
interplanety

Старый 12.05.2013, 14:14
SiteLev вне форума Посмотреть профиль Отправить личное сообщение для SiteLev Найти все сообщения от SiteLev
  № 5  
Ответить с цитированием
SiteLev

Регистрация: Mar 2008
Сообщений: 13
1) Да, пробовал и отдельный файл поставить на сервер, тоже не помогло.

2) Добавил \0 в конце ответа, т.е, получилось
Код:
"<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\n\0";
Не помогло.
Заметил странность, когда флеш отправляет запрос на полиси,
мой сервер на php почему-то отключается :-) .
При отправке этого же запроса <policy-file-request/> вручную,
такого не происходит.

На всякий случай привожу код php сервера:
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_INETSOCK_STREAMSOL_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($sock5) === 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$msgstrlen($msg));

    do {
        if (
false === ($buf socket_read($msgsock2048PHP_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$talkbackstrlen($talkback));            
            echo 
"received:{$buf}\n";
            
//break;   
        
}else{                        
            
$talkback "You said '$buf'.\n";                        
            
socket_write($msgsock$talkbackstrlen($talkback));
            echo 
"received:{$buf}\n";
        }
                
        
    } while (
true);
    
socket_close($msgsock);
} while (
true);

socket_close($sock); 

Старый 12.05.2013, 15:53
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 6  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от SiteLev Посмотреть сообщение
1) Да, пробовал и отдельный файл поставить на сервер, тоже не помогло.
Кодировка utf ?

Что значит отключается? Если обрывается соединение - так и должно быть. После получения политики сокет обрывает соединение и устанавливает по новой на назначенном порту.

Попробуйте убрать всякие "you say" и т.п. Сервер политики должен только получать запрос политики, отдавать ответ с правилами политики и закрывать соединение после отдачи. Ничего лишнего не должно быть.
__________________
interplanety

Старый 12.05.2013, 16:34
SiteLev вне форума Посмотреть профиль Отправить личное сообщение для SiteLev Найти все сообщения от SiteLev
  № 7  
Ответить с цитированием
SiteLev

Регистрация: Mar 2008
Сообщений: 13
Кодировка файла crossdomain.xml utf
А во флеше у меня

Код AS3:
Security.loadPolicyFile("http://localhost/путь_к_файлу/crossdomain.xml");
Притом swf-ка тоже находится в той же папке, вместе с html страницей.

Кстати, в этом файле crossdomain.xml все символы вроде такие, что не
должно иметь значение utf.


А сервер на php действительно отключается, т.е, сама консольная программа
отключается почему-то (а не соединение) , когда флешка пытается подкючиться
по сокету :-)

Старый 12.05.2013, 17:47
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 8  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от SiteLev Посмотреть сообщение
Код AS3:
Security.loadPolicyFile("http://localhost/путь_к_файлу/crossdomain.xml");
А это зачем?
Вы не путаете понятия кроссдомена и сокет-политики?
Для того чтобы подключить сокет-соединение, не нужно грузить файл политики отдельно (если он не лежит где-нибудь отдельно от сайта).

Код AS3:
var sock = new Socket();
sock.addEventListener(Event.CONNECT, OnConnect);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, OnSecurityError);
sock.connect(MyHosht,Port); // хост, порт
Все, больше ничего не нужно. Сокет сам опросит сервер по 843 порту на предмет получения файла политики, если получит - он сам переподключится на указанный порт и дистпатчнет событие OnConnet, если нет - просто бросит OnSecurityError

Ну и проверяйте свой php сервер. Раз он отключается при попытке коннекта, значит определенно имеет какие-то проблемы.
__________________
interplanety

Старый 12.05.2013, 18:18
SiteLev вне форума Посмотреть профиль Отправить личное сообщение для SiteLev Найти все сообщения от SiteLev
  № 9  
Ответить с цитированием
SiteLev

Регистрация: Mar 2008
Сообщений: 13
Ок, спасибо
Действительно с php у меня видимо что-то нито,
потому, что там не нормально работает также код записи лога в файл.


Но вопрос в том, что я в начале использовал для ответа полиси
не php, другой сервер специальный для флеша (называется Socket policy file server ).
Тоже не исчезает ошибка securityError.

Код подключения сокета во флешке у меня примерно такой же, как у Вас.

Код AS3:
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 ) исчезла.

Огромное спасибо за ответы :-)


Последний раз редактировалось SiteLev; 12.05.2013 в 23:21.
Создать новую тему Ответ Часовой пояс GMT +4, время: 01:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
php , socket , сервер
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:35.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.