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

标签 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,提供跨域文件,但我可以看到 Flash 没有尝试加载它。 (我测试了命令 python -c 'print "<policy-file-request/>%c" % 0' | nc 23.29.126.76 843 并检查了策略服务器的工作原理。

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

最佳答案

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

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

调试策略

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

  1. 确保您有 debug flash player .

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

  3. 通过设置标志 PolicyFileLog=1 打开 Flash 播放器策略日志在 mm.cfg文件(请确保您有flash播放器的debug version),运行swf文件并读取策略日志,它具有用户友好的格式,您将能够通过该日志找出大多数情况下的问题。

关于actionscript-3 - 如何使用 Flash、Socket.IO 和 NodeJS 修复此(可能)跨域策略错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093429/

相关文章:

javascript - 使用跨域帖子发送凭据?

security - 安全实现脚本标签 hack 来进行 XSS?

javascript - 使用交叉请求获取 Forge 2-legged 身份验证

java - 在 java/c++/c/actionscript-3 应用程序中使用静态变量的最佳方法是什么?

apache-flex - Flash Builder 4.5.1mobile 项目的嵌入元数据时间限制?

flash - 开始使用 Molehill,我应该开始学习什么 api?

android - 如何让您的移动 AIR 应用程序始终在后台运行?

javascript - node.js index.html javascript函数未定义

javascript - 在 JavaScript 中比较 2 个数组

node.js - 无法在 post 请求中发送对象