Frage

Mein Flash-Spiel muss meinen PHP-Socket-Server verbinden. Aufgrund von Sicherheits Dingen, hat eine Richtliniendatei auf das Flash-Client senden kann, wenn es versucht, eine Verbindung.

Das folgende ist das, was ich getan habe.

In Actionscript / Flex 3 / Flash:

Security.loadPolicyFile("http://[SERVER.IP]:9000/crossdomain.xml");
socket.connect(hostName, port); //connect to the socket
[rest of original code]

Um die Socket-Server reagieren auf die Anforderung zu machen, habe ich die folgenden auf den Server:

elseif (preg_match("/policy-file-request/i", $buffer) or preg_match("/crossdomain/i", $buffer)) {
                    socket_write($socket, '<?xml version="1.0"?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-access-from domain="*" to-ports="9000" /></cross-domain-policy>');
                    unset($read_sockets[array_search($socket, $read_sockets)]);
                    socket_shutdown($socket, 2);
                    socket_close($socket);

ich jedoch folgende Fehlermeldung: „Das Ignorieren Richtliniendatei an (URL) durch Content-Type zu fehlen.“ Also habe ich versucht, dieses Problem zu beheben, indem ein Header direkt über meinem XML-Code hinzu:

socket_write($socket, "Content-Type: text/xml\n");

Leider habe ich immer noch die gleichen Fehler. Bin ich den Inhaltstyp in einer falschen Weise zu geben?

War es hilfreich?

Lösung

Versuchen

Senden folgt aus:

HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\n\r\n

Stellen Sie sicher, nichts ist vor diesem gesendet. Auch sendet \r\n vor der Socket geschlossen wird.

Andere Tipps

Sie benötigen eine gültige HTTP-Antwort zurück, wenn Sie verwenden werden:

Security.loadPolicyFile("http://[SERVER.IP]:9000/crossdomain.xml");

Wenn der Blitz Deins PHP-Socket-Server verbinden, lassen Sie die obige Zeile, und es wird der Port selbst versuchen und Rohdaten statt einer HTTP-Antwort erwartet.

Sie die policy von einem beliebigen Port des Servers geladen werden können mit Security.loadPolicyFile () ... vielleicht sollten Sie einfach auf Port 80 per http dienen, laden Sie es von dort und dann einer Verbindung zum Server ...

ebenfalls als Standard, ich glaube, Flashplayer 9 (nach oben von einiger kleineren Version) eine policy Anforderung an Port 943 standardmäßig sendet ... so dass Sie möglicherweise einen Server dort setzen, das zu tun ...

eine kleine Bemerkung: PHP wurde nie für Socket-Server konzipiert und ist nicht sehr gut, dass ..., wenn Sie können, versuchen Sie Java verwenden, oder NekoVM , dass Sie mit Haxe ... auch Haxe Remoting als auch nutzen können als ThreadedRemotingServer für Sie interessant sein könnten ... es gibt einige gute und klare Anleitungen auf der Haxe site ...

Versuchen

es mit \ r \ n nach dem Content-Type.

socket_write($socket, "Content-Type: text/xml\r\n");

Wenn Sie keinen xmlsocket auf Port verwenden 843?

if(trim($buffer) == '<policy-file-request/>') {
$policy_file =
    '<'.'?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>';

socket_write($socket, $policy_file.chr(0));
}

funktioniert gut für mich, wird der Client eine Richtliniendatei anfordern, trennen, dann wieder nach der Richtliniendatei Empfang

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top