使用Flash套接字与Node.js

8
我一直在使用gimite/web-socket-js实现WebSocket,它不仅支持Chrome浏览器,而且还支持开发版本的Safari。我希望将其从Ruby服务器迁移到Node.js上。但突然间,除了Chrome浏览器外,其他浏览器都无法正常使用。

我怀疑与需要实现的Flash Socket Policy文件有关。我想将其作为一个外部的Node.js进程来实现,以免影响原始应用程序。我正在使用node-websocket-server来实现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被喜爱的迷人的神秘错误。

我的问题是,是否有一个独立的全局Flash套接字策略服务器,我可以在Node.js或其他应用程序上运行? 我的理解是,我只需要让它驻留在843端口上。或者,是否有另一个WebSocket库可以处理Flash策略,就像Ruby服务器那样?

3个回答

8
Flash策略请求也可以在提供WebSockets服务的同一端口内进行内联回答。请参见this change Socket.IO node.js模块。它向服务器添加了一个连接侦听器,以在同一端口上回答策略服务器请求。这样,您就不必在端口843上运行某些东西(通常需要root权限)。
或者,您还可以使用socat运行一个非常简单(2行)的策略请求服务器(假设您在*nix系统上):http://github.com/kanaka/noVNC/blob/master/docs/flash_policy.txt 更新(响应@Josh K):
这是一个常见的误解,认为端口843是Flash策略请求的主要位置,同端口请求是一种备选方案,由于超时而变慢。这可能基于常见的引用http://www.lightsphere.com/dev/articles/flash_socket_policy.html和Adobe文档难以跟踪(和阅读)。这是Adobe关于安全策略的文档:http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html 实际上,端口843与同端口响应有着不同的目的。端口843用于元策略(站点策略),优先于同端口策略。管理员可以使用它来定义整个系统的Flash策略,并可用于拒绝非特权用户允许入站Flash套接字连接。这就是为什么它在端口843上(这是特权范围内)的原因,只有系统管理员才能在该端口上启动服务。
3秒的超时仅适用于连接到端口843被静默丢弃的情况。它不适用于其他服务运行在端口843上或连接被拒绝的情况(即TCP重置)。我一直使用同端口,只运行同端口策略服务器,没有明显的延迟。
对于WebSocket服务器,同端口策略响应的另一个优点是,您可以更轻松地协调Flash策略和WebSockets握手之间的源策略配置。

是的,它们可以在行内回答,但这不建议,因为Flash会首先检查端口843。如果在3秒钟后没有得到响应,它将尝试实际端口。最好在843上运行干净的FPS,并在其自己的端口上运行应用程序。 - Josh K
请注意,只有在启用flashsocket传输时,Socket.IO才会启用策略服务器。 - Nicolas Zanotti

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

我还为使用Flash Sockets开发WebSocket应用程序编写了一个(简短的)教程。


教程现在可以在这里找到。 - Phylliida

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接