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

我一直在使用gimite / web-socket-j来实现一个简单的Chrome浏览器和Safari的开发版本。 我想从Ruby服务器转移到Node.js. 突然之间,除了Chrome之外,它什么都行不通。

我怀疑这与我需要实现的Flash Socket策略文件有关。 我想实现这个作为一个外部的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策略?

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用于元策略(站点策略)。 它优先于同口岸政策。 pipe理员可以使用它来为整个系统定义Flash策略,并可以使用它来拒绝非特权用户允许入站Flash套接字连接。 这就是为什么它是在端口843(这是在特权范围内),所以只有系统pipe理员可以启动该端口上的服务。

3秒超时仅适用于连接到端口843的情况下无提示丢弃。 它不适用于其他服务在端口843上运行或连接被拒绝(即TCP重置)的情况。 我一直使用同一个端口,只有运行一个相同的端口策略服务器,没有可察觉的延迟。

使用WebSocket服务器,相同端口策略响应的另一个优点是可以更轻松地协调Flash策略和WebSocket握手之间的源策略configuration。

从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套接字的WebSockets应用程序编写了一个简短的教程。

重写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”处)查看文档