2010-09-03 81 views
8

我一直在使用gimite/web-socket-js來實現一個簡單的Chrome瀏覽器和Safari的開發版本。我想從Ruby服務器轉移到Node.js.突然間,它不適用於Chrome瀏覽器。使用帶有Node.js的Flash套接字

我懷疑這與我需要實現的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上。還是有另一個用於Node.js的WebSocket庫,它將像Ruby服務器一樣處理Flash策略?

回答

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

我也寫了(簡單的)教程WebSockets applications using Flash Sockets

+0

現在可以在這裏找到tutortial [http://www.joshuakehn.com/2010/9/22/WebSocket-Tutorial-with-Nodejs.html] – Phylliida 2015-04-10 20:15:05

1

重寫Stream的偵聽器(套接字的偵聽器)更好。實施

ECONNRESET, Connection reset by peer

樣品,以防止它:

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

8
當你有一些錯誤,如 否則你的服務器將崩潰

也可以在您提供的WebSockets服務的同一端口上內聯迴應Flash策略請求。請參閱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用於元策略(站點策略)。它優先於同端口策略。管理員可以使用它來爲整個系統定義閃存策略,並可以使用它來拒絕非特權用戶允許入站閃存套接字連接。這就是它位於端口843(位於特權範圍內)的原因,這樣只有系統管理員才能在該端口上啓動服務。

3秒超時僅適用於端口843連接無提示丟失的情況。它不適用於其他服務在端口843上運行或連接被拒絕(即TCP重置)的情況。我始終使用同一個端口,只有運行同一個端口策略服務器時沒有可察覺的延遲。

使用WebSocket服務器,同一端口策略響應的另一個優點是可以更輕鬆地協調Flash策略和WebSockets握手之間的原始策略配置。

+0

是的,他們可以內聯回答,但這是**不建議**,因爲Flash將首先檢查端口843。它在3秒後沒有得到響應,它會嘗試實際的端口。最好在843上運行一個乾淨的FPS,並在自己的端口上運行應用程序。 – 2010-10-28 15:50:55

+0

關於Flash政策的有趣信息+1。 – 2010-12-10 13:50:43

+0

請注意,Socket.IO將只在啓用閃存傳輸時啓用策略服務器。 – Nick 2012-08-10 15:06:08