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

Yar*_* U. 5 flash actionscript-3 websocket node.js socket.io

我在node.js中有一个简单的基于socket.io的服务器,它监听端口81中的套接字(例如)我在使用Javascript编写的客户端之间连接和传递数据没有问题但经过多次尝试我无法得到我的Flash应用程序连接到服务器并将数据传递给它(我在Web中找到了一些示例 - 但它们都是基于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);
Run Code Online (Sandbox Code Playgroud)

和服务器端代码是

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");
    });
});
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

非常感谢您的宝贵时间!

sch*_*rmu 4

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

我们必须在服务器端进行一些小的调整(即确保 socket.io 侦听端口 843 而不是 10843 上的策略文件)并激活 flashsocket 传输,但通信非常轻松。

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

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

  • 实际上我已经发现了这一点,但显然在当前版本的 Node.js 中,默认情况下隐私策略套接字并未打开 - 我通过添加 `io.set('transports', ['websocket', 'flashsocket'] 解决了这个问题);` - 无论如何谢谢你:) (3认同)