【问题标题】:Using a Flash socket with Node.js在 Node.js 中使用 Flash 套接字
【发布时间】:2011-04-07 22:39:39
【问题描述】:

我一直在使用gimite / web-socket-js 来实现 WebSocket,而不仅仅是 Chrome 和 Safari 的开发版本。我想从 Ruby 服务器转移到 Node.js。突然间,除了 Chrome 之外,它在其他任何地方都不起作用。

我怀疑这与我需要实现的Flash Socket Policy 文件有关。我想将此实现为外部 Node.js 进程,以免与原始应用程序混淆。我正在使用node-websocket-server 来使用 Node.js 实现 WebSocket 协议,而且我也希望 not 搞砸它。

似乎最简单的方法是运行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 策略?

【问题讨论】:

    标签: node.js websocket


    【解决方案1】:

    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 也是因为 Adob​​e 的文档很难追踪(和阅读)。以下是有关其安全策略的 Adob​​e 文档:http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html

    实际上,端口 843 与相同的端口响应有一些不同的目的。端口 843 用于元策略(站点策略)。它优先于同端口策略。管理员可以使用它来定义整个系统的闪存策略,并可以使用它来拒绝非特权用户允许入站闪存套接字连接。这就是为什么它位于端口 843(在特权范围内)上的原因,因此只有系统管理员才能在该端口上启动服务。

    3 秒超时仅适用于与端口 843 的连接被静默断开的情况。它不适用于在端口 843 上运行一些其他服务或连接被拒绝(即 TCP 重置)的情况。我一直使用同一个端口,只运行同一个端口策略服务器没有明显的延迟。

    使用 WebSocket 服务器,同端口策略响应的另一个优势是您可以更轻松地协调闪存策略和 WebSockets 握手之间的源策略配置。

    【讨论】:

    • 是的,它们可以内联回答,但这是不建议,因为 Flash 将首先检查端口 843。如果 3 秒后没有得到响应,它将尝试实际端口。最好在 843 上运行干净的 FPS,并将您的应用程序放在它自己的端口上。
    • 请注意,Socket.IO 只会在启用 flashsocket 传输时启用策略服务器。
    【解决方案2】:

    最好覆盖 Stream 的监听器(socket 的监听器)。 否则,当您遇到以下错误时,您的服务器将崩溃:

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

    【讨论】:

      【解决方案3】:

      在 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 写了一个(简短的)教程。

      【讨论】:

      • 教程现在可以找到here
      猜你喜欢
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2019-12-30
      • 2011-04-17
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多