我在这里发现了很多类似的帖子,但似乎都没有解决我所遇到的确切问题。
我只是想将一个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时永远等待。
有什么建议吗?我误会了什么吗?提前谢谢。
答案 0 :(得分: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);
或者添加一个允许您在11.11.11.11:9024,11.11.11.11/crossdomain.xml上连接的crossdomain.xml:
<allow-access-from domain="YOURSWFDOMAIN" to-ports="9024"/>
然后,您将在服务器上收到来自闪存的请求。你当时很高兴。