1

我的 Flash 游戏需要连接到我的 PHP Socket 服务器。出于安全考虑,当 Flash 客户端尝试连接时,必须将策略文件发送到它。

以下是我所做的。

在 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 从来都不是为套接字服务器设计的,而且不是很擅长……如果可以,请尝试使用 Java 或NekoVM,您可以将其与Haxe一起使用……还有 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 回答