代码之家  ›  专栏  ›  技术社区  ›  Josh K

将flash socket与node.js一起使用

  •  8
  • Josh K  · 技术社区  · 14 年前

    我一直在使用 gimite / web-socket-js 要实现WebSocket,只需使用chrome和开发Safari构建。我想从Ruby服务器转移到node.js上。突然间它除了铬以外什么都不起作用。

    我怀疑这和 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。或者,是否有另一个websocket library for node.js可以像ruby服务器那样处理flash策略?

    3 回复  |  直到 14 年前
        1
  •  8
  •   kanaka    14 年前

    Flash策略请求也可以在与您提供的WebSockets服务相同的端口上直接响应。见 this change 到socket.io node.js模块。它添加到服务器的连接侦听,该服务器在同一端口上响应策略服务器请求。这样,您就不必在端口843(通常需要根权限)上运行任何东西。

    或者,您也可以使用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握手之间的源策略配置。

        2
  •  6
  •   Josh K    14 年前

    在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 .

        3
  •  1
  •   devwafwaf    14 年前

    最好重写流的侦听器(套接字的侦听器)。 否则,当出现以下错误时,服务器将崩溃:

    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”处)