私のPHPソケットサーバは、フラッシュクライアントにポリシーファイルを送信するようにする方法?
-
23-08-2019 - |
質問
私のフラッシュゲームは私のPHPソケットサーバに接続する必要があります。そのため、セキュリティのもので、ポリシーファイルは、それが接続しようとしたときにフラッシュクライアントに送信する必要があります。
以下は、私がやったものです。
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");
残念ながら、私はまだ同じエラーを取得します。私は間違った方法でコンテンツタイプを与えているだろうか?
解決
これを送信してみます:
HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\n\r\n
何もこの前に送られていないことを確認してください。
ソケットがクローズされる前に、また、\r\n
を送っています。
他のヒント
あなたが使用しようとしている場合は、有効なHTTPレスポンスを返す必要があります:
Security.loadPolicyFile("http://[SERVER.IP]:9000/crossdomain.xml");
フラッシュはちょうど上記の行をスキップし、それはポート自体を試してみて、代わりにHTTPレスポンスの生データを期待して、あなたのPHPソケットサーバに接続しようとしている場合。
あなたはSecurity.loadPolicyFile()を使用して、サーバーの任意のポートからpolicyfileををロードすることができます...多分あなたは、単にポート80でHTTPごとにそれを提供する必要があり、そこからそれをロードして、サーバ... への接続P>
また、デフォルトでは、私は(上向きにいくつかのマイナーバージョンから)のFlashPlayer 9は、デフォルトでポート943へpolicyfileをリクエストを送信すると思う...ので、あなたはそれを行うには、そこにサーバーを置くかもしれません...
少しサイドノート:PHPは、ソケットサーバ用に設計されていませんし、その時に非常に良いではありませんして...あなたは、Javaを使用してみてください、またはことができるかどうか<のhref =「http://nekovm.org/」のrel = "nofollowをnoreferrer"> NekoVM を、あなたにも、 haXeのに...また、haXeのリモーティングを使用することができますThreadedRemotingServerはあなたに興味があるかもしれないと... haXeのサイト上でいくつかの良い、明確なチュートリアルがあります...
\ rをする\ n個でのContent-Typeの後にそれを試してみます。
socket_write($socket, "Content-Type: text/xml\r\n");
あなたはポート843上のXMLSocketを使用するべきではないでしょうか。
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));
}
私のために、クライアントがポリシーファイルを受け取った後に再接続した後、ポリシーファイル、切断を要求します正常に動作します。