5

我在这里找到了很多类似的帖子,但似乎都没有解决我遇到的确切问题。

我只是想将一个 XMLSocket 连接到我的服务器,在我尝试连接大约 10 秒后,我收到一个 SecurityErrorEvent:错误 #2048:安全沙箱违规(无法从 ##.##.##.## 加载数据: 9024)。

在服务器端,我有一个侦听端口 9024 的 php 脚本。我很确定它工作正常,因为我可以使用其他 php 脚本连接到它。此外,当我的客户端 php 发出策略文件请求时,我的服务器脚本会返回该策略。这是as3:

private var sock:XMLSocket  = new XMLSocket();

// in my connection method
Security.allowDomain("domain.com");
Security.loadPolicyFile("dubDomain.domain.com/crossdomain.xml");
Security.loadPolicyFile("xmlsocket://domain.com:9024");
sock.connect("11.11.11.11", 9024);

在调用 sock.connect 之前,我在 as3 中将侦听器设置为套接字,但我认为任何错误都会在它们被触发之前发生。

我的理解是,在第二个 Security.loadPolicyFile 或 socket.connect 应该尝试连接到套接字 9024 的服务器并请求策略文件。我相信 sock.connect 只会在无法从端口 843 获得响应后发送请求。

但是,在服务器端,它显示没有尝试连接。我已经从 IDE(FlashDevelop)和上传到服务器时从 swf 尝试过这个。

我会在端口 843 上尝试它,但我在我的服务器上没有管理员权限。如果重要的话,这里有一些 php 脚本:

$client = socket_accept($sock);
if (socket_getpeername($client, $address, $theirport))
{
echo "Client $address: $theirport is now connected to us\n";
}
$input = socket_read($client, 1024000);
echo "[client] $input";

$sock 似乎设置得很好,因为我可以使用另一个 php 脚本进行连接,但是当我尝试连接 as3 时它只会永远等待。

有什么建议么?我是不是误会了什么?提前致谢。

4

1 回答 1

0
Security.loadPolicyFile("subDomain.domain.com/crossdomain.xml");
sock.connect("11.11.11.11", 9024);

您正在为子域请求跨域文件。它最多允许您连接到 subdomain.domain.com。它绝对不允许您连接到 domain.com。

XMLSocket 会做什么,是加载它认为可以的跨域,与你给它的主机 ip 相关。这将是第一个在11.11.11.11/crossdomain.xml。如果找不到,它会尝试访问11.11.11.11:843. 如果失败,您将抛出一个安全错误。

因此,您要么需要直接连接到您的子域:

 sock.connect("subDomain.domain.com", 9024);

或者添加一个 crossdomain.xml,它允许您在 11.11.11.11:9024 上连接 11.11.11.11/crossdomain.xml :

<allow-access-from domain="YOURSWFDOMAIN" to-ports="9024"/>

然后,您将在服务器上收到来自 flash 的请求。那你可以走了。

于 2012-10-26T13:51:14.973 回答