我一直在使用gimite/web-socket-j来实现一个简单的Chrome和Safari开发版本的WebSocket.我想从Ruby服务器转移到Node.js. 突然间它除了Chrome之外什么都不起作用.
我怀疑这与我需要实现的Flash套接字策略文件有关.我想将其作为外部Node.js进程实现,以免与原始应用程序混淆.我正在使用node-websocket-server来实现与Node.js的WebSocket协议,我再次也不想搞砸它.
看起来最简单的事情就是运行flashsocket.js,但运行时会出现以下错误:
sys:334
ctor.prototype = Object.create(superCtor.prototype, {
^
TypeError: Object prototype may only be an Object or null
at Function.create (native)
at Object.inherits (sys:334:29)
at Object.<anonymous> (/Users/me/Projects/testing/websocket/node-websocket-server/flashsocket.js:10:16)
at Module._compile (node.js:472:23)
at Module._loadScriptSync (node.js:479:10)
at Module.loadSync (node.js:349:12)
at Object.runMain (node.js:532:24)
at node.js:762:10
Run Code Online (Sandbox Code Playgroud)
在这里,我们遇到了Node.js所喜爱的可爱的神秘错误.
我的问题是,是否有一个独立的全局闪存套接字策略服务器,我可以运行Node.js或其他应用程序?我的理解是我只需要将它驻留在端口843上.或者是否有另一个用于Node.js的WebSocket库,它将像Ruby服务器一样处理Flash策略?
Flash策略请求也可以在与您提供的WebSockets服务相同的端口上内联回答.请参阅Socket.IO node.js模块的此更改.它添加了一个连接侦听服务器,该服务器在同一端口上应答策略服务器请求.这样您就不必在端口843上运行某些东西(通常需要root权限).
或者,您也可以使用socat运行一个非常简单的(2行)策略请求服务器(假设您使用的是*nix系统):http://github.com/kanaka/noVNC/blob/master/docs/flash_policy.txt
更新(回复@Josh K):
常见的误解是端口843是闪存策略请求的主要位置,并且相同端口请求是后退,并且由于超时它们较慢.这可能基于常用的 http://www.lightsphere.com/dev/articles/flash_socket_policy.html,也因为Adobe的文档难以追踪(和阅读).以下是有关其安全策略的Adobe文档:http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
实际上,端口843 与相同的端口响应有一些不同的目的.端口843用于元策略(站点策略).它优先于同端口策略.管理员可以使用它来定义整个系统的闪存策略,并可以使用它来拒绝非特权用户允许入站闪存套接字连接.这就是它在端口843(处于特权范围内)的原因,因此只有系统管理员才能在该端口上启动该服务.
3秒超时仅适用于以静默方式丢弃与端口843的连接的情况.它不适用于端口843上运行某些其他服务或拒绝连接(即TCP重置)的情况.我一直使用相同的端口,只有运行相同的端口策略服务器没有明显的延迟.
使用WebSocket服务器,同一端口策略响应的另一个优点是,您可以更轻松地协调闪存策略和WebSockets握手之间的原始策略配置.
在Node.js邮件列表的帮助下,我提出了以下建议:
var net = require("net"),
domains = ["localhost:8081"];
net.createServer(
function(socket)
{
socket.write("<?xml version=\"1.0\"?>\n");
socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n");
socket.write("<cross-domain-policy>\n");
domains.forEach(
function(domain)
{
var parts = domain.split(':');
socket.write("<allow-access-from domain=\""+parts[0]+"\"to-ports=\""+(parts[1]||'80')+"\"/>\n");
}
);
socket.write("</cross-domain-policy>\n");
socket.end();
}
).listen(843);
Run Code Online (Sandbox Code Playgroud)
我还使用Flash Sockets为WebSockets应用程序编写了一个(简要)教程.
归档时间: |
|
查看次数: |
11050 次 |
最近记录: |