8

私はgimite/web-socket-jsを使用して、ChromeとSafariの開発ビルドを超えてWebSocketを実装してきました。RubyサーバーからNode.jsに移動したいと思います。突然、Chrome以外では機能しなくなりました。

これは、実装する必要のあるFlashSocketPolicyファイルに関係していると思われます。元のアプリケーションと混同しないように、これを外部Node.jsプロセスとして実装したいと思います。私はNode.jsでWebSocketプロトコルを実装するためにnode-websocket-serverを使用していますが、これも混乱させたくないと思います。

最も簡単な方法は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に常駐させるだけで済みます。または、RubyサーバーのようにFlashポリシーを処理するNode.js用の別のWebSocketライブラリはありますか?

4

3 に答える 3

8

Flashポリシー要求は、提供しているWebSocketサービスと同じポートでインラインで応答することもできます。Socket.IOnode.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のドキュメントを追跡(および読み取り)するのが難しいためです。セキュリティポリシーに関するアドビのドキュメントは次のとおりです。http ://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html

実際には、ポート843は、同じポート応答とは多少異なる目的を果たします。ポート843は、メタポリシー(サイトポリシー)用です。同じポートポリシーよりも優先されます。管理者はこれを使用してシステム全体のフラッシュポリシーを定義し、非特権ユーザーがインバウンドフラッシュソケット接続を許可することを拒否できます。これが、システム管理者のみがそのポートでサービスを起動できるように、ポート843(特権範囲内)にある理由です。

3秒のタイムアウトは、ポート843への接続がサイレントに切断された場合にのみ適用されます。ポート843で他のサービスが実行されている場合、または接続が拒否された場合(つまり、TCPリセット)には適用されません。私は常に同じポートを使用していますが、同じポートポリシーサーバーを実行するだけで目に見える遅延はありません。

WebSocketサーバーでは、同一ポートポリシー応答の追加の利点は、フラッシュポリシーとWebSocketハンドシェイクの間で元のポリシー構成をより簡単に調整できることです。

于 2010-10-28T13:45:32.997 に答える
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アプリケーションの(簡単な)チュートリアルも作成しました。

于 2010-09-03T16:41:29.250 に答える
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")のドキュメントを参照してください。

于 2010-10-07T08:27:44.980 に答える