1

Flash ゲームは、PHP Socket Server に接続する必要があります。セキュリティ上の理由から、フラッシュ クライアントが接続を試みたときに、ポリシー ファイルをフラッシュ クライアントに送信する必要があります。

以下は私がやったことです。

Actionscript / Flex 3 / Flash の場合:

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

ソケット サーバーがリクエストに応答するようにするために、サーバーに次のコードを追加しました。

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);

ただし、「Content-Type が見つからないため、(URL) のポリシー ファイルを無視しています」というエラーが表示されます。そこで、xml コードのすぐ上にヘッダーを追加して、これを修正しようとしました。

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

残念ながら、私はまだ同じエラーが発生します。コンテンツ タイプを間違った方法で指定していませんか?

4

5 に答える 5

3

以下を使用する場合は、有効な HTTP 応答を返す必要があります。

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

フラッシュが PHP ソケット サーバーに接続する場合は、上記の行をスキップするだけで、ポート自体が試行され、HTTP 応答の代わりに生データが期待されます。

于 2009-07-04T18:21:04.997 に答える
2

Security.loadPolicyFile() を使用して、サーバーの任意のポートからポリシーファイルをロードできます...おそらく、ポート 80 で http ごとにそれを提供し、そこからロードしてからサーバーに接続する必要があります...

また、デフォルトでは、flashplayer 9(いくつかのマイナーバージョンから上)はデフォルトでポリシーファイルリクエストをポート943に送信すると思います...そのためにサーバーをそこに置くことができます...

ちょっとした補足: PHP はソケット サーバー用に設計されたことはなく、あまり得意ではありません。可能であれば、 Haxeで使用できるJava またはNekoVMを使用してみてください。また、Haxe リモーティング、および ThreadedRemotingServer興味があるかもしれません...Haxeサイトにいくつかの優れた明確なチュートリアルがあります...

于 2009-07-04T18:23:25.773 に答える
2

これを送信してみてください:

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

この前に何も送信されていないことを確認してください。また、\r\nソケットが閉じられる前に送信します。

于 2009-07-06T06:48:50.040 に答える
1

Content-Type の後に \r\n を付けて試してください。

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

ポート 843 で xmlsocket を使用するべきではありませんか?

于 2009-07-04T18:11:16.090 に答える
1
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));
}

クライアントはポリシーファイルを要求し、切断し、ポリシーファイルを受信した後に再接続します

于 2010-11-18T13:46:28.757 に答える