我正在尝试建立一个简单的websocket服务器,它在Flash AS3客户端和Node.js后端之间进行通信。以下代码是客户端和服务器都在本地托管的时间。当swf托管在本地连接到heroku上托管的服务器时,代码也能正常运行。当swf和服务器都在线托管时,套接字才会失败。
Node.js代码(服务器)
var WebSocketServer = require("ws").Server
var net = require('net');
var http = require("http")
var express = require("express")
var app = express()
var crossdomain = require('crossdomain')
var port = process.env.PORT || 5000;
app.use(express.static(__dirname + "/"))
var xml = crossdomain({ domain: '*' });
app.all('/crossdomain.xml', function (req, res, next) {
res.writeHead(200, { 'Content-Type': 'application/xml; charset=utf-8' });
res.write(xml);
//res.write(new Buffer([0x00]))
res.end();
});
var server1 = http.createServer(app)
server1.listen(port)
console.log("http server listening on " + port)
var wss = new WebSocketServer({server: server1})
wss.on("connection", function(ws) {
console.log("Connected");
ws.on("close", function() {
console.log("websocket connection close")
})
})
Crossdomain文件 - example.com/crossdomain.xml
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" secure="false"/>
</cross-domain-policy>
AS3代码(客户端) - 我正在使用(https://github.com/theturtle32/AS3WebSocket)
import com.worlize.websocket.*;
Security.loadPolicyFile("http://example.com/crossdomain.xml");
var websocket:WebSocket = new WebSocket("ws://example.com", "*", "echo-protocol");
websocket.addEventListener(WebSocketEvent.OPEN, handleWebSocketOpen);
websocket.connect();
var con = false;
function handleWebSocketOpen(event:WebSocketEvent):void {
trace(event);
}
当从服务器访问客户端时,会发生对crossdomain.xml的请求,并且它会成功返回给客户端,但此时不再发生任何事情。我一直试图解决这个问题多年没有运气。我确实发现当你返回crossdomain文件时,你需要以0x00结束它才能正确读取,但我还没有找到一种方法来完成这项工作。我已经尝试将res.write(new Buffer([0x00]))添加到来自跨域请求的响应以及其他几个修改无效。这些似乎都阻止了xml文件无效。
如果有人能帮助我实现这一目标,我将非常感激,我已经在很长一段时间里努力奋斗,似乎无法让这最后一步工作。