如何使用Flash,Socket.IO和NodeJS修复此(可能)跨域策略错误

时间:2012-12-30 18:35:53

标签: actionscript-3 node.js cross-domain socket.io

Error #2044: Unhandled SecurityErrorEvent:. text=Error #2048: Security sandbox violation: http://kipos.bluecodestudio.com/holdthebomb/HoldTheBombWeb.swf cannot load data from http://23.29.126.76:8000/socket.io/1/?t=1356891827452.
    at io::Socket/doHandshake()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/Socket.as:139]
    at io::Socket/connect()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/Socket.as:110]
    at io::Socket()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/Socket.as:90]
    at io::IO$/connect()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/IO.as:36]
    at MainController/endOfbluecodeSplash()[/Users/airrider3/Dropbox/Projects/Kipos/Minigames/HoldTheBombWeb/src/MainController.as:41]
    at bluecodeSplash/endOfSplash()[/Users/airrider3/Dropbox/Projects/Kipos/Minigames/HoldTheBombWeb/src/bluecodeSplash.as:55]
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at com.greensock.core::TweenCore/complete()[D:\_Flash\_AS3\src\com\greensock\core\TweenCore.as:178]
    at com.greensock::TweenLite/renderTime()[D:\_Flash\_AS3\src\com\greensock\TweenLite.as:477]
    at com.greensock.core::SimpleTimeline/renderTime()[D:\_Flash\_AS3\src\com\greensock\core\SimpleTimeline.as:93]
    at com.greensock::TweenLite$/updateAll()[D:\_Flash\_AS3\src\com\greensock\TweenLite.as:642]

我正在使用Flash Builder,一个ActionScript项目,它使用Socket.IO模块连接到运行NodeJS的服务器。

要将Socket.IO与AS3连接,我使用以下库https://github.com/sbquinlan/AS3-Socket.IO-XHR-Polling 从Flash Builder中进行本地测试时,它可以很好地工作。

但是,如果托管在我的域 [http://kipos.bluecodestudio.com/holdthebomb/]上,我想它会引发此SecurityErrorEvent,因为我没有正确使用任何crossdomain.xml文件?我没说过这个话题,说实话,所以我不确定这是不是错误。

在任何情况下,我都有以下crossdomain.xml文件:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <site-control permitted-cross-domain-policies="master-only"/>
   <allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>

我的服务器上有不同的地方。 (它应该在托管客户端吗?)。是的,游戏托管在bluecodestudio.com上,而游戏的服务器在IP 23.29.126.76上运行,在端口8000上运行。

如果是跨域政策错误的情况,有人可以解释应该采取什么措施来解决问题吗?

感谢您的关注。

更新1:

我设置了一个监听端口843的服务器,给出了crossdomain文件,但我可以看到Flash不会尝试加载它。 (我测试了命令python -c 'print "<policy-file-request/>%c" % 0' | nc 23.29.126.76 843并检查了策略服务器的确如何工作。

为什么SWF不会尝试加载跨域政策文件?

2 个答案:

答案 0 :(得分:4)

跨域策略文件应托管在运行服务器的计算机上,即23.29.126.76。对于套接字连接,Flash播放器会自动尝试从端口843加载主跨域策略文件(您可以从adobe.com http://www.adobe.com/cn/devnet/flashplayer/articles/socket_policy_files.html获取简单的策略服务器脚本)

UPD: 使用Security.loadPolicyFile("xmlsocket://23.29.126.76:843");直接加载策略文件,但是因为我写的flash player已经自动执行相同的操作(对于端口843),它会发送字符串请求"<policy-file-request/>\0"

调试政策

要调试策略服务器,请执行以下操作:

  1. 请确保您拥有debug flash player

  2. 通过Windows命令(linux,mac或cygwin)检查服务器安装是否正确:echo -ne '<policy-file-request/>\0' | nc -v host port。此命令应该打印出您的crossdomain.xml文件

  3. 通过在mm.cfg文件中设置标记PolicyFileLog=1来启用Flash播放器策略日志(确保您拥有Flash播放器的debug version),运行swf文件并阅读在策略日志中,它具有用户友好的格式,您可以通过此日志找出问题。

答案 1 :(得分:0)

哇。我刚刚在Socket.IO文档中看到了这个: “flash policy port默认为10843

默认情况下,Socket.IO客户端将检查服务器上的端口10843以查看是否允许闪存插件连接。 Adobe Flash Player通常使用843作为默认端口,但我们决定默认使用非根端口。“

这就是为什么它没有尝试从端口843加载文件......

来源:https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO