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

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

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

Регистрация: Apr 2010
Сообщений: 4
По умолчанию Flash + PHP (Сокет)

Здравствуйте. Есть проблема. Сокет на PHP, клиент на флеше. При запуске из среды - все работает на ура, при запуске выложенной флешки с сервера - она тупо посылает запрос полиси файла, в упор не видя ответа сервера. Кто сталкивался, в чем бок?

PHP код:
if (($msgsock socket_accept($sock)) < 0) {
                throw new 
Exception('socket_accept() failed: '.socket_strerror(socket_last_error())."\n");
                
flush();ob_flush();
            } else {
                echo 
"OK\n";
                
flush();ob_flush();
            }
            
$msg '<'.'?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>'."\0";
                echo 
"Connected, Say to client (crossdomain.xml) ... ";
                
flush();ob_flush();
                
socket_write($msgsock$msgstrlen($msg));
                echo 
"OK\n"

Код AS1/AS2:
Security.allowDomain("domain.com");
Security.loadPolicyFile("xmlsocket://domain.com:PORT");
 
var socket:XMLSocket = new XMLSocket();
socket.onConnect = function(success:Boolean) {
    if (success) {
        trace("Connection succeeded!");
        _root.msgArea.text="Connection succeeded!"
        socket.send("Boss");
    } else {
        trace("Connection failed!");
        _root.msgArea.text="Connection failed!"
    }
};
XMLSocket.prototype.onData = function (src) {
 trace(src);
 
xml = new XML();
xml.ignoreWhite = true;
xml.parseXML(src);
 
outputMsg.text=src
 
 
}
 
 
 
BTN.onPress=function(){
    socket.send("Fucking XMLSoket")
    }
socket.connect("IP", PORT)
Там где domain.com - реальный домен, IP и PORT - соответственно айпишник и порт вписаны

Старый 17.04.2010, 13:19
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Кроссдоменник надо отправлять тогда, когда пришел запрос оного с клиента, а не постоянно.

Старый 17.04.2010, 13:31
MageMerlin вне форума Посмотреть профиль Отправить личное сообщение для MageMerlin Найти все сообщения от MageMerlin
  № 3  
Ответить с цитированием
MageMerlin

Регистрация: Apr 2010
Сообщений: 4
Хм. Я отправляю кросдомен сразу после соединения флеша с сервером. Не совсем понял что неправильно. Да и почему из ИДЕ все работает, а при запуске флеша с сервера - нет.

Там дальше идет код, который проверяет запросы от клиента и если там присутствует <policy-file-request/> - он опять повторяет XML ответ с кросдоменом. Бестолку.

При запуске из ИДЕ выглядит так
1. клиент соедняется
2. сервер отправляет кросдомен
3. клиент шлет Boss
4. идет обмен данными

При запуске с сервака
1. клиент соединяется
2. сервер отправляет кросдомен
3. клент почемуто спрашивает <policy-file-request/>
4. сервер опять его отправляет
5. connetion failed

Старый 17.04.2010, 13:39
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 4  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
всё должно быть не так.

1. клиент соединяется
2. сервер ждет
3a если клиент шлет <policy-file-request />, то сервер шлет кроссдоменник и отключается (потому что клиент все равно отключится после получения кроссдоменника)
3b если пришел обычный запрос от клиента - шлем обычные данные
__________________
мой пустой блог

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

Регистрация: Apr 2010
Сообщений: 4
Сделал сейчас так, вроде соединение прошло, но как-то странно, нет передачи данных после соединения. Что значит "сервер отключается" - можно подробнее с примером кода?

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

Регистрация: Jan 2009
Сообщений: 1,651
непонятно - кури маны!
Рассматривай это так. Когда клиенту нужна политика безопасности, то перед тем, как подключить к серверу твой сокет-клиент, он подключается СВОИМ. Всё что том умеет, так это отправить запрос, дождаться ровно однго ответа и отключится. Т.е. после отправки политики сервером, мы от клиента больше ничего не ждем, это НЕ НАШ КЛИЕНТ.
Код:
				if (strncmp(securityRequest,buf,strlen(securityRequest))==0){ //если запрос на доступ - отдать ответ, разорвать соединение
					mylog.write (2,"received security request");
					send(it->sock, securityAnswer, strlen(securityAnswer), 0);
					close(it->sock);
__________________
мой пустой блог

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

Регистрация: Apr 2010
Сообщений: 4
А ссылку на пресловутый мануал можно? С удовольствием накурился бы - задолбался по инету искать.

Сейчас попробую как вы написали сделать.

Добавлено через 4 минуты
Таки работает, спасибо большое. Код для тех, кто наткнется на пост в будущем:

PHP код:
<?php
    header
('Content-Type: text/plain;');
    
error_reporting(E_ALL E_WARNING);
    
set_time_limit(20);
    
ob_implicit_flush();
    
    echo 
"-= Server =-\n\n";
    
flush();ob_flush();
    
$address '1.2.3.4'
    
$port    10001;

  try {
    
        echo 
'Create socket on port '.$port.'... ';
        
flush();ob_flush();
        if ((
$sock socket_create(AF_INETSOCK_STREAMSOL_TCP)) < 0) {
            throw new 
Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
            
flush();ob_flush();
        } else {
            echo 
"OK\n";
            
flush();ob_flush();
        }

        echo 
'Bind socket ... ';
        
flush();ob_flush();
        if ((
$ret socket_bind($sock$address$port)) < 0) {
            throw new 
Exception('socket_bind() failed: '.socket_strerror(socket_last_error())."\n");
            
flush();ob_flush();
        } else {
            echo 
"OK\n";
            
flush();ob_flush();
        }

        echo 
'Listen socket ... ';
        
flush();ob_flush();
        if ((
$ret socket_listen($sock5)) < 0) {
            throw new 
Exception('socket_listen() failed: '.socket_strerror(socket_last_error())."\n");
            
flush();ob_flush();
        } else {
            echo 
"OK\n";
            
flush();ob_flush();
        }
        
//socket_set_nonblock ( $sock );

        
do {
            echo 
'Accept socket ... ';
            
flush();ob_flush();
            if ((
$msgsock socket_accept($sock)) < 0) {
                throw new 
Exception('socket_accept() failed: '.socket_strerror(socket_last_error())."\n");
                
flush();ob_flush();
            } else {
                echo 
"OK\n";
                
flush();ob_flush();
            }
            
/*$msg = '<'.'?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>'."\0";*/
            
$msg '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'
    
'<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd">'
        
'<allow-access-from domain="*" to-ports="*" secure="false" />'
        
'<site-control permitted-cross-domain-policies="master-only" />'
    
'</cross-domain-policy>';
                
//echo "Connected, Say to client (crossdomain.xml) ... ";
                
echo "Connected ... ";
                
flush();ob_flush();
                
//socket_write($msgsock, $msg, strlen($msg));
                
echo "OK\n";
                
flush();ob_flush();
  
               
            
            

            do {
            
                
//echo 'Client said: ';
                
flush();ob_flush();
                if (
false === ($buf socket_read($msgsock1024))) {
                    throw new 
Exception('socket_read() failed: '.socket_strerror(socket_last_error())."\n");
                    
/*print 'Блаблабла...'."\n";
                    flush();ob_flush();
                    echo 'Close socket ... ';
                    flush();ob_flush();
                    socket_close($sock);
                    echo "OK\n";
                    flush();ob_flush();
                    echo 'Create socket on port '.$port.'... ';
                    flush();ob_flush();
                    if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
                        throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
                        flush();ob_flush();
                    } else {
                        echo "OK\n";
                        flush();ob_flush();
                    }
            
                    echo 'Bind socket ... ';
                    flush();ob_flush();
                    if (($ret = socket_bind($sock, $address, $port)) < 0) {
                        throw new Exception('socket_bind() failed: '.socket_strerror(socket_last_error())."\n");
                        flush();ob_flush();
                    } else {
                        echo "OK\n";
                        flush();ob_flush();
                    }
            
                    echo 'Listen socket ... ';
                    flush();ob_flush();
                    if (($ret = socket_listen($sock, 5)) < 0) {
                        throw new Exception('socket_listen() failed: '.socket_strerror(socket_last_error())."\n");
                        flush();ob_flush();
                    } else {
                        echo "OK\n";
                        flush();ob_flush();
                    }
                    continue;*/
                    
                
} else {
                    if (
$buf!='')
                    {
                        echo 
$buf."\n";
                    }
                    
                }
                
                if (!
$buf trim($buf)) {
                    continue;
                }
                
                if (
$buf == 'shutdown') {
                    
socket_close($msgsock);
                    break 
2;
                }
                if (
'<policy-file-request/>'==substr($buf022))
                {
                    
$msg '<'.'?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>'."\0";
                    echo 
"Say to client (crossdomain.xml) ... ";
                    
flush();ob_flush();
                    
socket_write($msgsock$msgstrlen($msg));
                    echo 
"OK\n";
                    
flush();ob_flush();
                    
                    echo 
"Closing ... ";
                    
flush();ob_flush();
                    
socket_close($msgsock);
                    echo 
"OK\n";
                    
flush();ob_flush();
                    break;
                    
                }
                else
                {                    
                    
$msg='Something'."\0";
                    echo 
"Say to client ($msg) ... ";
                    
flush();ob_flush();
                    
socket_write($msgsock$msgstrlen($msg));
                    echo 
"OK\n";
                    
flush();ob_flush();
                }
                
                
                
                
            } while (
true);
            
        } while (
true);

    } catch (
Exception $e) {
        echo 
"\nError: ".$e->getMessage();
        
flush();ob_flush();
    }
    
    if (isset(
$sock)) {
    
        echo 
'Close socket ... ';
        
flush();ob_flush();
        
socket_close($sock);
        echo 
"OK\n";
        
flush();ob_flush();
    
    }
?>
Код это семпл - за косяки плиз не пинать - это доработанный чужой пример основанный на чужом примере))


Последний раз редактировалось MageMerlin; 17.04.2010 в 14:08.
Старый 29.04.2010, 01:57
LOS2008 вне форума Посмотреть профиль Отправить личное сообщение для LOS2008 Найти все сообщения от LOS2008
  № 8  
Ответить с цитированием
LOS2008

Регистрация: Aug 2008
Сообщений: 27
PHP код:
if (($msgsock socket_accept($sock)) < 0
Не нашёл у вас в коде инициализацию $msgsock, но если делаете сравнение строки "<policy-file-request/>" с тем что пришло по сокету, то будет ошибка, иногда
<policy-file-request/> не всегда приходит целиковым, а часто бьётся на части.

Старый 29.04.2010, 06:37
Crenth вне форума Посмотреть профиль Отправить личное сообщение для Crenth Найти все сообщения от Crenth
  № 9  
Ответить с цитированием
Crenth
[+1 19.06.10]
[+1 27.07.10]
 
Аватар для Crenth

Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
Цитата:
Код для тех, кто наткнется на пост в будущем
хороший тон, MageMerlin

в правила Форума бы ввести эту практику Есть проблема -> Обсуждение -> Вот решение
__________________
Trapatatupatupa

Старый 30.04.2010, 22:58
membrilius вне форума Посмотреть профиль Отправить личное сообщение для membrilius Найти все сообщения от membrilius
  № 10  
Ответить с цитированием
membrilius
 
Аватар для membrilius

Регистрация: Aug 2008
Сообщений: 258
как вообще тут можно читать подцвеченный PHP... у меня глаза кровью наливаются сразу...

кстати лучше не использовать
Код:
"flush();ob_flush();"
каждый раз.
лучше в самом верху вставте:
Код:
ob_implicit_flush();
он все "echo" будет сразу отправлять в браузер сам.

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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