Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Flash + PHP (Сокет) (http://www.flasher.ru/forum/showthread.php?t=138857)

MageMerlin 17.04.2010 13:05

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 - соответственно айпишник и порт вписаны

etc 17.04.2010 13:19

Кроссдоменник надо отправлять тогда, когда пришел запрос оного с клиента, а не постоянно.

MageMerlin 17.04.2010 13:31

Хм. Я отправляю кросдомен сразу после соединения флеша с сервером. Не совсем понял что неправильно. Да и почему из ИДЕ все работает, а при запуске флеша с сервера - нет.

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

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

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

iflamberg 17.04.2010 13:39

всё должно быть не так.

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

MageMerlin 17.04.2010 13:41

Сделал сейчас так, вроде соединение прошло, но как-то странно, нет передачи данных после соединения. Что значит "сервер отключается" - можно подробнее с примером кода?

iflamberg 17.04.2010 13:47

непонятно - кури маны!
Рассматривай это так. Когда клиенту нужна политика безопасности, то перед тем, как подключить к серверу твой сокет-клиент, он подключается СВОИМ. Всё что том умеет, так это отправить запрос, дождаться ровно однго ответа и отключится. Т.е. после отправки политики сервером, мы от клиента больше ничего не ждем, это НЕ НАШ КЛИЕНТ.
Код:

                                if (strncmp(securityRequest,buf,strlen(securityRequest))==0){ //если запрос на доступ - отдать ответ, разорвать соединение
                                        mylog.write (2,"received security request");
                                        send(it->sock, securityAnswer, strlen(securityAnswer), 0);
                                        close(it->sock);


MageMerlin 17.04.2010 14:03

А ссылку на пресловутый мануал можно? С удовольствием накурился бы - задолбался по инету искать.

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

Добавлено через 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();
    
    }
?>

Код это семпл - за косяки плиз не пинать - это доработанный чужой пример основанный на чужом примере))

LOS2008 29.04.2010 01:57

PHP код:

if (($msgsock socket_accept($sock)) < 0

Не нашёл у вас в коде инициализацию $msgsock, но если делаете сравнение строки "<policy-file-request/>" с тем что пришло по сокету, то будет ошибка, иногда :)
<policy-file-request/> не всегда приходит целиковым, а часто бьётся на части.

Crenth 29.04.2010 06:37

Цитата:

Код для тех, кто наткнется на пост в будущем
хороший тон, MageMerlin :)

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

membrilius 30.04.2010 22:58

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

кстати лучше не использовать
Код:

"flush();ob_flush();"
каждый раз.
лучше в самом верху вставте:
Код:

ob_implicit_flush();
он все "echo" будет сразу отправлять в браузер сам.


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

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