我一直在使用gimite / web-socket-js来实现一个简单的Chrome浏览器和Safari开发版本的WebSocket。我想从Ruby服务器转移到Node.js.突然间它除了Chrome之外什么都不起作用。
我怀疑这与我需要实现的Flash Socket Policy文件有关。我想将其作为外部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
在这里,我们遇到了Node.js所喜爱的可爱神秘错误。
我的问题是,我可以运行Node.js或其他应用程序吗?我的理解是我只需要将它驻留在端口843上。或者是否有另一个用于Node.js的WebSocket库,它将像Ruby服务器一样处理Flash策略?
答案 0 :(得分:8)
Flash策略请求也可以在与您提供的WebSockets服务相同的端口上内联回答。请参阅Socket.IO node.js模块的this change。它添加了一个连接侦听服务器,该服务器在同一端口上应答策略服务器请求。这样您就不必在端口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服务器,同一端口策略响应的另一个好处是,您可以更轻松地协调Flash策略和WebSockets握手之间的原始策略配置。
答案 1 :(得分:6)
在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);
我还为WebSockets applications using Flash Sockets写了一篇(简短)教程。
答案 2 :(得分:1)
最好覆盖Stream的侦听器(套接字的侦听器)。 否则当您遇到如下错误时,您的服务器将崩溃:
ECONNRESET,由同行重置连接
防止它的实施示例:
socket.setEncoding("utf8");
socket.addListener("end", function () {socket.end();});
socket.addListener("error", function (exception) {socket.end();});
socket.addListener("timeout", function () {socket.end();});
socket.addListener("close", function (had_error) {socket.end();});
请参阅文档:http://nodejs.org/api.html(“net.Stream”)