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

我在node.js中有一个简单的基于socket.io的服务器,它侦听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> 

非常感谢您的宝贵时间!

对于我们上一个项目,我们使用FlashSocket.IO ,就像一个魅力。

我们不得不在服务器端做一些小改动(比如确保socket.io在端口843而不是10843上监听策略文件)并激活flashsocket传输,但是通信是一件轻而易举的事情。

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

注意:这个configuration要求node.js以root身份运行!

试试这个解决scheme(除了端口843上的游戏服务器外,还需要设置套接字策略服务器)

顺便说一句:当你使用套接字总是使用像xmlsocket://host:port (端口843 Flash自动加载策略文件)而不是http://host:port女巫只用于HTTP请求。