2

私は途方に暮れています。Flashがポリシーファイルを正しくロードしていない理由がわかりません。私はこれをフラッシュデバッガーからテストしています。

I've also tried from http://127.0.0.1:80/game (it sends a request to http://127.0.0.1:3014/socket.io/1/).
          Security.loadPolicyFile('xmlsocket://127.0.0.1:843');

          var r:URLRequest = new URLRequest();
          r.url = httpProtocal+"://" + domain + "/socket.io/1/?time=" + new Date().getTime();
          r.method = URLRequestMethod.POST;
          var ul:URLLoader = new URLLoader(r);
          ul.addEventListener(Event.COMPLETE, onDiscover);
          ul.addEventListener(HTTPStatusEvent.HTTP_STATUS, onDiscoverError);
          ul.addEventListener(IOErrorEvent.IO_ERROR , onDiscoverError);

エラー:

> webSocketLog: policy file: xmlsocket://127.0.0.1:843 Error #2044:
> Unhandled securityError:. text=Error #2048: Security sandbox
> violation: file:///ude/game/bin-release/Game.swf cannot load data from
> http://127.0.0.1:3014/socket.io/1/?time=1359025067289.    at
> com.pnwrain.flashsocket::FlashSocket()

しかし、これは機能します:

> echo -ne '<policy-file-request/>\0' | nc -v 127.0.0.1 843  

Connection to 127.0.0.1 843 port [tcp/*] succeeded!
<?xml version='1.0' ?>
<!DOCTYPE cross-domain-policy SYSTEM 'http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd'>
<cross-domain-policy>
    <allow-access-from domain='*' to-ports='*' />
</cross-domain-policy>

crossdomain.xmlへの絶対パスの指定も機能しません。このファイルをブラウザにロードできます。

> webSocketLog: policy file: http://127.0.0.1:843/crossdomain.xml
> Error #2044: Unhandled securityError:. text=Error #2048: Security
> sandbox violation: file:///ude/game/bin-release/Game.swf cannot load
> data from http://127.0.0.1:3014/socket.io/1/?time=1359025126138.  at
> com.pnwrain.flashsocket::FlashSocket()

これでも機能しません(非常に人気のあるブログ投稿からの解決策):

import flash.system.Security; Security.allowDomain("http://127.0.0.1");

デバッガポリシーファイルのログは次のとおりです。

> OK: Root-level SWF loaded:
> file:///ude/game/bin-release/Game.swf
> OK: Searching for <allow-access-from> in policy files to authorize
> data loading from resource at
> http://127.0.0.1:3014/socket.io/1/?time=1359026453454 by requestor
> from
> file:///ude/game/bin-release/Game.swf
> Error: [strict] Ignoring policy file at
> http://127.0.0.1:3014/crossdomain.xml due to missing Content-Type. 
> See http://www.adobe.com/go/strict_policy_files to fix this problem.
> Error: Request for resource at
> http://127.0.0.1:3014/socket.io/1/?time=1359026453454 by requestor
> from
> file:///ude/game/bin-release/Game.swf
> is denied due to lack of policy file permissions. Warning: HTTP
> response headers not available on this platform.  Strict policy file
> rules cannot be enforced. OK: Policy file accepted:
> http://127.0.0.1:843/crossdomain.xml

ここで興味深いのはOK: Policy file accepted、私が呼び出しているにもかかわらず、メッセージがエラーの後に来ることです。

Security.loadPolicyFile('http://127.0.0.1:843/crossdomain.xml');

の前にURLRequest。そこでURLRequest、をsetTimeoutに移動すると、ログに次のように表示されます。

> OK: Root-level SWF loaded:
> file:///ude/game/bin-release/Game.swf
> Warning: HTTP response headers not available on this platform.  Strict
> policy file rules cannot be enforced. OK: Policy file accepted:
> http://127.0.0.1:843/crossdomain.xml OK: Searching for
> <allow-access-from> in policy files to authorize data loading from
> resource at http://127.0.0.1:3014/socket.io/1/?time=1359028255268 by
> requestor from
> file:///ude/game/bin-release/Game.swf
> Error: [strict] Ignoring policy file at
> http://127.0.0.1:3014/crossdomain.xml due to missing Content-Type. 
> See http://www.adobe.com/go/strict_policy_files to fix this problem.

したがって、843ポリシーファイルは正常にロードされたようですが、ポート3014ポリシーファイルをロードしようとします(サブポリシーファイルをチェックしている可能性がありますか?)。これは、「Welcometosocket.io」というsocket.ioHTMLページです。そのために失敗するはずはないようです。

デバッガーアラートでこれを受け取ります:

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: file:///ude/game/bin-release/Game.swf cannot load data from http://127.0.0.1:3014/socket.io/1/?time=1359028255268.
    at MethodInfo-3642()
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at SetIntervalTimer/onTimer()
    at flash.utils::Timer/_timerDispatch()
    at flash.utils::Timer/tick()

どんなアイデアでも大歓迎です。ありがとうございました!

4

2 に答える 2

1

私はポリシーファイルのプロではありませんが、これは疑わしいようです:

エラー: [strict] Content-Typeが見つからないため、ポリシー ファイルを 無視しています。この問題を解決するには、 http://www.adobe.com/go/strict_policy_filesを参照してください。http://127.0.0.1:3014/crossdomain.xml

Content-Type ヘッダーがないか無効であるため、ポリシー ファイルが無視されているようです。

アドビから:

バージョン 9,0,115,0 以降、Flash Player は、ファイルがテキスト ファイルであることをある程度保証する Content-Type 値で送信されていない HTTP ポリシー ファイルを無視します。Flash Player では、ポリシー ファイルの Content-Type が次のいずれかである必要があります。

  • text/* (any text type)
  • application/xmlまたapplication/xhtml+xml

この:

Content-Type の問題を解決する必要がある場合は、必ずmeta-policiestext/x-cross-domain-policyのセクションも参照してください。なぜなら、メタ ポリシーを選択する一般的な方法は、すべてのポリシー ファイルに対して特別な Content-Type を指定することだからです。これは、メタポリシーの確立とテキストの Content-Type の提供という 2 つの問題を同時に解決する可能性があります。

また、HTTP 応答ヘッダーが利用できない理由をサーバーで確認してください。

警告:このプラットフォームではHTTP応答ヘッダーを使用できません。厳格なポリシー ファイル ルールを適用することはできません。

お役に立てれば。

于 2013-02-01T10:56:26.583 に答える
0

接続とポリシーの検証を成功させるための鍵は次のとおりです。

1) socket.io スクリプトと同じフォルダーに crossdomain.xml ファイルを配置します。

2) socket.io サーバーが実行されているのと同じ host:port で、http を介してこの crossdomain.xml を提供します。

3) これを実現するには、socket.io の他にエクスプレス フレームワークをインストールする必要があります。Express と socket.io を使用すると、同じポートで同時に http と接続ソケットを介して crossdomain.xml を提供できます。

4) この方法を使用すると、フラッシュはこのポリシー ファイルを最初にシークする場所 (同じホスト: ポート) で crossdomain.xml を見つけることができるため、フラッシュから手動でポリシー ファイルをロードする必要がなくなります (loadPolicyFile を無効にできます)。

次のようになります。

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);

app.get('/crossdomain.xml', function (req, res) {
  console.log("request ... " + __dirname);
  res.sendfile(__dirname + '/crossdomain.xml');
});

server.listen(port, "ip");
console.log("socket.io server started");
于 2013-02-16T11:39:46.873 に答える