2009-07-04 11 views
1

私のフラッシュゲームは私のPHPソケットサーバーに接続する必要があります。セキュリティのために、接続しようとすると、ポリシーファイルをフラッシュクライアントに送信する必要があります。私のPHPソケットサーバーがフラッシュクライアントにポリシーファイルを送信する方法を教えてください。

以下は私が行ったことです。 ActionScriptの/フレックス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); 

しかし私は次のエラーを取得します: "コンテンツタイプが見つからないため(URL)でポリシーファイルを無視しています。"だから、私は右の私のXMLコードの上にヘッダを追加することによってこの問題を解決しようとした:

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

残念ながら、私はまだ同じエラーを取得します。私は間違った方法でコンテンツの種類を与えていますか?

答えて

2

これを送信してみてください可能性があります

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

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

+0

HTTP/1.1 200 OK \ r \ nContent-Type:text/xml \ r \ n \ r \ nは私のためには機能しませんでした。 HTTP/1.1 200 OK \ r \ nコンテンツタイプ:text/xml \ n \ n – Mitchell

1

Content-Typeの後に\ r \ nで試してみてください。

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

あなたはポート843上のXMLSocketを使用すべきではありませんか?

+0

ポリシーファイルを受け取った後、私は(私のウェブホストによって制限)は、そのような低いポートを使用することはできません再接続した後、切断をポリシーファイルを要求します。 – Tom

+0

ちょうど試しましたが、\ r \ nをContent-Typeの後に追加すると、同じエラーが表示されます。 – Tom

3

あなたが使用しようとしている場合は、有効なHTTPレスポンスを返す必要があります。

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

フラッシュがちょうど上記の行をスキップし、それはポートをしようと、あなたのPHPソケットサーバに接続しようとしている場合HTTPレスポンスではなく生データを期待しています。

+0

それはそう思わない。有効なHTTP応答を返すにはどうすればよいですか? – Tom

2

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

また、デフォルトでは、私はあなたがそれを行うには、そこにサーバーを置くかもしれないので(上向きにいくつかのマイナーバージョンから)のFlashPlayer 9が...デフォルトではポート943へpolicyfileをリクエストを送信すると思う...

小さなサイドノート:PHPはソケットサーバ向けに設計されたことはありませんでした。もしあなたができるのであれば、NekoVMを使ってみてください。haXeと一緒に使うこともできます。また、haXe remotingやThreadedRemoti ngServerは、haXeのサイト上でいくつかの良い、明確なチュートリアルがあります...あなたに興味がある...

greetz

back2dos

+0

私はそのような低いポートを使用できません(私のウェブホストによって制限されています)。 – Tom

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

私のために正常に動作し、クライアントは

関連する問題