我有一个使用 flash as3 的客户端。 我有 2 个服务器,一个主要用于 Flash 客户端,另一个是套接字策略服务器。
例如,我在端口 843 上运行套接字策略服务器,在任何端口 X 上运行我的客户端。
现在,当我连接 Flash 客户端时,使用以下命令:
Security.loadPolicyFile("xmlsocket://domain.com:port");
SecureSocket.connect(ip, port);
它实际上首先连接到我的策略套接字服务器,发送策略文件请求行并接收我使用我的服务器发送的行,如下所示:
tls.createServer(options, function(sock) {
sock.on('data', function(data) {
console.log('Data receveid: '.cyan + data + ' from ' + sock.remoteAddress);
if (data == "<policy-file-request/>\0") {
sock.write('<?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="all"/><allow-access-from domain="*"></cross-domain-policy
console.log('Sent policy file to: '.green + sock.remoteAddress);
}
...
之后,连接将自动关闭。然后它尝试连接到我的真实服务器并再次向服务器发送策略文件请求行,然后连接关闭。我真的不知道从现在开始我该怎么办,我整天都在尝试并在网上搜索。有人知道我缺少什么吗?
最佳答案
好吧,我终于开始工作了。首先,我想要从我的客户端到我的游戏的 SSL 连接。
- 在 Flash IDE 中本地尝试效果很好,
- 但是在 Flash 调试器或网站上执行此操作不起作用 因为它试图访问套接字策略服务器(这是一个 从 adobe 注册的端口,端口 843)。
所以我需要一个策略套接字服务器来在该端口上工作,并在 adobe 网站上找到了一些用 python 和 perl 编写的。忘记它们吧,它们在这种情况下不起作用。
因为我尝试通过 SSL 访问服务器,所以我还需要一个 SSL 策略服务器。
由于网上没有,所以我写了一个简单的:
var tls = require('tls');
var fs = require('fs');
var options = {
key: fs.readFileSync('/etc/ssl/private/yourserver.key'),
cert: fs.readFileSync('/etc/ssl/certs/yourserver.crt'),
};
var HOST = 'YOURSERVERIP';
var PORT = 843;
tls.createServer(options, function(sock) {
sock.on('data', function(data) {
console.log('Policy Server Request: ' + data);
if (data.indexOf('policy') !== -1) {
console.log("Policy Server: sending regulation file");
sock.write('<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"><!-- Policy file for xmlsocket://MYDOMAIN.com --><cross-domain-policy><allow-access-from domain="*" to-ports="*" /><allow-access-from domain="*" to-ports="1-65535" /><allow-access-from domain="MYDOMAIN.com" to-ports="MYGAMEPORT" /><allow-access-from domain="MYIP" to-ports="*" /></cross-domain-policy>\0');
} else {
console.log("Policy Server: unknown request");
}
});
sock.on('clientError', function(exception) {
console.log('' + data);
});
sock.on('close', function(data) {
console.log('CONNECTION CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
});
sock.on('error', function(err) {
console.log('\n' + HOST +':'+ err);
});
}).listen(PORT, HOST);
console.log('\nPolicy Server listening on ' + HOST +':'+ PORT);
我在允许访问域表单中变得疯狂,因为我遇到了一些安全沙箱违规,并且减少了安全沙箱违规,所以我把它全部写了。我稍后会清理它。
如您所见,我必须在发送策略末尾添加 \0
,否则 Flash 不会接受。
浪费了两天时间。我仍然不明白为什么 Adobe 会让 Flash 和世界之间的联系变得如此艰难。在对套接字进行编程时,从未在其他地方见过这种策略。
关于node.js - 通过 TLS 连接上的 Node js 将跨域策略发送到 Flash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822829/