使用带有Node.js的Flash套接字

时间:2010-09-03 16:09:01

标签: node.js websocket

我一直在使用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策略?

3 个答案:

答案 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”)