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

Actionscript 3 如何使用Flash、Socket.IO和NodeJS修复此(可能)跨域策略错误,actionscript-3,node.js,cross-domain,socket.io,Actionscript 3,Node.js,Cross Domain,Socket.io,我正在使用FlashBuilder,一个ActionScript项目,它使用Socket.IO模块连接到运行NodeJS的服务器 要将Socket.IO与AS3连接,我使用以下库 从Flash Builder在本地进行测试时,它可以完美地工作 但是,如果托管在我的域上,我想它会引发此SecurityErrorEvent,因为我没有正确使用任何crossdomain.xml文件?老实说,我从来没有接触过这个话题,所以我不确定这是否是个错误 在任何情况下,我都有以下crossdomain.xml文件

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

要将Socket.IO与AS3连接,我使用以下库 从Flash Builder在本地进行测试时,它可以完美地工作

但是,如果托管在我的域上,我想它会引发此SecurityErrorEvent,因为我没有正确使用任何crossdomain.xml文件?老实说,我从来没有接触过这个话题,所以我不确定这是否是个错误

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

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]

我把它放在服务器的不同位置。(是否应该在托管客户端上?)。是的,游戏托管在bluecodestudio.com上,而游戏服务器位于IP 23.29.126.76上,运行在端口8000上

如果是跨域策略错误,是否有人愿意解释应该采取什么措施来解决问题

谢谢你的关注

更新1:

我在843端口上设置了一个服务器监听跨域文件,但我可以看到Flash是如何不尝试加载它的。(我测试了命令
python-c'print”%c“%0”| nc 23.29.126.76 843
,并检查了策略服务器的实际工作方式


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

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

UPD: 使用
Security.loadPolicyFile(“xmlsocket://23.29.126.76:843”;
直接加载策略文件,但正如我编写的flash player已经自动执行相同的操作(对于端口843),它发送字符串请求
“\0”

调试策略

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

  • 确保你有足够的时间

  • 通过以下命令检查服务器安装是否正确(Windows上的linux、mac或cygwin):
    echo-ne'\0'\124; nc-v主机端口
    。此命令应打印出您的crossdomain.xml文件

  • 通过在文件中设置标志
    PolicyFileLog=1
    打开flash player策略日志(确保您拥有flash player的权限),运行swf文件并读取策略日志,它具有用户友好的格式,您将能够通过此日志在大多数情况下找出问题


  • 跨域策略文件应托管在服务器运行的计算机上,即23.29.126.76上。对于套接字连接,flash Player会自动尝试从端口843加载主跨域策略文件(您可以从adobe.com获得简单的策略服务器脚本)

    UPD: 使用
    Security.loadPolicyFile(“xmlsocket://23.29.126.76:843”;
    直接加载策略文件,但正如我编写的flash player已经自动执行相同的操作(对于端口843),它发送字符串请求
    “\0”

    调试策略

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

  • 确保你有足够的时间

  • 通过以下命令检查服务器安装是否正确(Windows上的linux、mac或cygwin):
    echo-ne'\0'\124; nc-v主机端口
    。此命令应打印出您的crossdomain.xml文件

  • 通过在文件中设置标志
    PolicyFileLog=1
    打开flash player策略日志(确保您拥有flash player的权限),运行swf文件并读取策略日志,它具有用户友好的格式,您将能够通过此日志在大多数情况下找出问题


  • 哇,我刚从Socket.IO文档中读到: “闪存策略端口默认为10843

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

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


    来源:

    哇。我刚从Socket.IO文档中读到: “闪存策略端口默认为10843

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

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


    来源:

    谢谢。我能够在我的服务器上正确设置flashpolicy服务器,并使用给定的命令测试它是否正常工作。我使用Security.loadPolicyFile(“);直接加载策略文件。但是,我收到以下错误:连接来自::ffff:88.8.71.155:55884无法识别的请求来自::ffff:88.8.71.155:55884:get/HTTP/1.1主机:23.29.126.76:843用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10_8_2)[…]例如,如果发出请求的字符串没有被识别。哦,我真傻。请求是'GET/HTTP/1.1',因为它试图直接访问文件。我想我可以通过给它一个正确的链接来解决它,但我仍然不明白为什么它不尝试从端口843的服务器获取.xml,或者我必须在AS3中执行一个函数才能生成它试图获取它?给它一个直接链接是不起作用的,它也不会尝试从843加载策略文件…感谢您更新您的答案。我已经使用了您提供的命令来检查策略服务器是否正确设置,并且确实正确。正如我在终端上看到的,Flash不会自动请求端口843上的文件,这对我来说似乎很奇怪,因为我到处都在读它应该从那里获得它。谢谢。我能够在我的服务器上正确设置flashpolicy服务器,并且我使用给定的命令测试它是否正常工作。我使用Security.loadPolicyFile(“);直接加载策略文件。但是,我得到了f
    <?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>