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

Jos*_*h K 8 websocket node.js

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

kan*_*aka 8

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握手之间的原始策略配置.


Jos*_*h K 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);
Run Code Online (Sandbox Code Playgroud)

我还使用Flash SocketsWebSockets应用程序编写了一个(简要)教程.