使用socket.io将数据从flash发送到node.js服务器

5
我有一个基于socket.io的简单node.js服务器,它监听端口81上的套接字(例如)。我没有问题连接和在JavaScript中传递客户端数据。但是经过多次尝试后,我无法使我的Flash应用程序连接到服务器并将数据传递给它(我在网上找到了一些示例,但所有这些示例都是基于Flex的并使用不是基本AS3库的类)。
当我尝试使用XMLSocket连接套接字时,我收到安全沙箱违规错误 - 我知道我需要加载策略文件(应该使用socket.io可用),但我无法做到这一点。
以下是我的Flash代码:
Security.loadPolicyFile("http://127.0.0.1:81/crossdomain.xml");
socket = new XMLSocket("127.0.0.1", 81);
socket.addEventListener(Event.CONNECT, onConnect);  
socket.addEventListener(IOErrorEvent.IO_ERROR, onError);  
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityEvent);
socket.addEventListener(DataEvent.DATA, onData);

服务器端的代码是:

var app = require('http').createServer(function (req, res) {...})
   , io = require('socket.io').listen(app, { log: true })
   , fs = require('fs')

app.listen(81);

io.sockets.on('connection', function (socket) {
    console.log("connection "+socket.id);
    socket.on("message",function(data){
        console.log("data: "+data);
    });
    socket.on("data",function(d){
         console.log('data from flash: ',d);
    });
    socket.on('disconnect', function (socket) {
        console.log("disconnect");
    });
});

我的crossdomain.xml文件如下:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/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>

非常感谢您抽出时间阅读!

你的node.js服务器上是否有一个策略文件正在提供服务?通常情况下,你的站点根目录下会有一个名为"crossdomain.xml"的文件。 - NoobsArePeople2
我做了,但是Flash仍然报错:Request for resource at xmlsocket://127.0.0.1:81 by requestor from XXXXX.swf is denied due to lack of policy file permissions - Yaron U.
您的loadPolicyFile()调用没有指向一个策略文件。请尝试Security.loadPolicyFile("http://127.0.0.1:81/crossdomain.xml") - NoobsArePeople2
尝试过了 - 它正在加载策略文件,但我仍然有之前评论中的错误(在添加 Security.loadPolicyFile(...) 之前,我有另一个错误 - 这意味着 Flash 可以读取策略文件,但策略不允许足够的权限)。 - Yaron U.
已将代码更改为AS3并进行了更新,同时添加了crossdomain.xml内容。也许问题就出在那里。 - Yaron U.
2个回答

4

在我们的最后一个项目中,我们使用了FlashSocket.IO,效果非常好。

我们只需要在服务器端进行一些小的调整(例如:确保socket.io监听端口843上的策略文件而不是10843),然后激活flashsocket传输,通信就变得非常容易。

io.configure(function() {
  io.set('transports', ['websocket','flashsocket']);
  io.set('flash policy port', 843);
});

注意:此配置要求以root身份运行node.js!


3
实际上,我已经找到了这个,但是显然在当前版本的Node.js中,隐私策略套接字默认未启用 - 我通过添加 io.set('transports', ['websocket', 'flashsocket']); 解决了这个问题 - 不管怎样,谢谢 :) - Yaron U.
啊,是的,你说得对...我漏掉了flashsocket传输通常是默认禁用的,抱歉。我已经相应地调整了我的回答。 - schaermu
顺便提一下 - 这个库没有 flex 库(mx)就无法工作。 https://github.com/simb/FlashSocket.IO/blob/0.7.x/src/com/pnwrain/flashsocket/FlashSocket.as 它使用了 mx.collections.ArrayCollectionmx.utils.URLUtil - Yaron U.
是的,我的同事不得不在源代码中进行一些修改,使其独立于flex。但我不能提供任何细节,因为他正在度假 :/ - schaermu
我也通过将URLUtil源代码添加到我的项目中来实现它 :) - Yaron U.

0
尝试this解决方案(除游戏服务器外,还需要在843端口上设置套接字策略服务器)
顺便说一句:当您使用套接字时,请始终使用类似于xmlsocket://host:port的网址(对于端口843,Flash会自动加载策略文件),而不是仅用于http请求的http://host:port

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接