19


3

この場合、Flash Playerがサンドボックスエラーをスローするのはなぜですか。

Java(1.5)サーバー上のSocketに接続した後、Flex 3サンドボックスエラー#2048が発生します。 サーバーコードはすべて私のものです。 Apacheでは動作しません。 Flash Player 10.0 r32。

シーケンスは以下のとおりです。

1 Javaサーバーが始動し、ポリシー・ファイル要求についてはポート843で、その他の要求についてはポート45455でlistenします。

2ファイルシステムから実行しても同じ結果が得られますが、Apacheによって提供されている2 Flexクライアント、host:45455。

3 Flash Playerはポート843からポリシーファイルを要求します。 これは、マスターファイルを検索する新しいセキュリティ設定の標準的な動作です。 異なるポリシーファイルが指定されているかどうかにかかわらず発生します。

4ポート843を介して、Javaから次のXMLを提供します。


5プレーヤーは以下をデバッグポリシーログに書き込みます…​

OK: Root-level SWF loaded: http://localhost/bst/BasicSocketTest.swf
OK: Searching for  in policy files to authorize data loading from resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf
OK: Policy file accepted: xmlsocket://192.168.2.3:843
OK: Request for resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf is permitted due to policy file at xmlsocket://192.168.2.3:843

6 `writeUTFBytes()`と `flush()`を使ってクライアントからポート45455でサーバーにテキストメッセージを送信します(これは私の自家製のメッセージプロトコルで、両端で正しく処理されます)

REG/REGISTER;simon;Si

ポート45455でlistenしている7つのJavaサーバー・スレッドが応答します。

REG:0/REGISTER:SUCCESS;simon;Si

8 FlexクライアントがProgressEventを受け取り、ソケットにバインドしたイベントリスナーが呼び出されます。 メッセージを処理します(画面のテキストボックスに書き込みます)。

9 Flashプレーヤーが2048サンドボックスエラーをスローし、ソケットが切断されました。 これは、メッセージが受信されて正常に処理された後です。 実際には約12秒後です。 他にはソケットを介して機能しません。

Flexクライアントで `Security.loadPolicyFile()`を呼び出してポリシーファイルを明示的にロードしようとしましたが、新しいプレーヤーセキュリティの現実は基本的に無視されるということです。 手順は、ポリシー要求がソケット入出力操作が行われるまで送信されないことです。 その時点でプレイヤー_always_はまずマスターポリシーファイルを探すためにポート843に行きます。 それを見つけてそれが許容されるものであれば、それ以上先に進むことはありません。

Flash Playerが起動しているかどうかを確認するためだけに意図的なエラーを含む、ポリシーファイルとポリシーファイルの内容を終了させるためのさまざまな方法を試してみました。

2048が投げられるのは理由がわかりません。 私は指定されたマスターセキュリティポートでソケットポリシーファイルを正確に提供します。これはプレーヤー自身が正しいと記録します。 その後、ソケットはサーバーからメッセージを正常に送受信し、その内容は私のコードで利用できます。

なぜこれが起きるのか、誰かが何か手がかりを持っていますか? Flash Playerのバグ?

  • P.S. * _Please_はBlazeDS、LCDS、Granite、あるいは他のものをサーバーとして使用するように指示しないでください。再設計ではなく、この問題に対する解決策を探しています。 そして、代わりにXMLSocketを使うように私に頼まないでください - 私はそれを試みました、そして全く同じ結果を得ます。 私は慎重にそして慎重に自分のアーキテクチャを選択しました、そして私はバイナリソケットが欲しいです。

*編集*彼のコメントにおけるJames Wardの要求に応えて、これが全体のエラーメッセージです。

Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.

各ソケットイベントのハンドラを持ち、画面にメッセージを出力するテストクライアントを削除しました。 これはそれが示すものです:

RequestPolicy: 192.168.2.3:843
Create Socket: 192.168.2.3:45455
Connect: [Event type="connect" bubbles=false cancelable=false eventPhase=2]
Sending: REG/REGISTER;[email protected];Si
Receiving: REG:0/REGISTER:SUCCESS;[email protected];Si/
Close: [Event type="close" bubbles=false cancelable=false eventPhase=2]
Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.

サーバーからの応答を正常に受信した直後にcloseイベントが発生しますが、約20秒後になるまでError#2048は表示されません。 クローズ後、エラーの前にさらにメッセージを送信しようとすると、Flash Playerは無効なソケット例外をスローします。

これについてはhttp://bugs.adobe.com/jira/browse/FP-3302 [Adobeにバグを記録しました]。

誰か興味があるなら私はクライアントとサーバーの両方の完全なソースコードを提供することができます。

9 Answer


3


私はこれをローカルでテストしていますが、ソケットが閉じられるまですべてがうまくいっているようです。 ソケットを閉じないでください。 メッセージがFlexクライアントに送信されると、Javaコードは次の処理を行います。

_in.close(); _out.close(); _socket.close();

次にFlexクライアントは、次にソケットと通信しようとしたときにサンドボックス違反を取得します。 もう一度新しいソケット接続を作成した場合、送受信は正常に動作し、その後に閉じることができます。 しかし、数分後にサンドボックス違反が発生します。 Flashがソケットをpingしようとしていて、閉じられているのでサンドボックス違反が発生しますか。


2


allow-http-request-headers-from要素を追加してみましたか?


またはallow-access-from要素に*ではなく実際のポートを指定しますか?



1


同様の問題 ここは、localhostが127.0.0.1に解決されていないことを示しています。

あなたはIPアドレスに切り替えてみてそれが助けになるかどうか確かめるかもしれません。


1


yoru crossdomain.xmlに加えて、Securityクラスを使用してコード内でさらにいくつかのことを試すことができます。

試してください:

Security.allowDomain( "*")Security.allowInsecureDomain( "*")

または、許可された許可されたホストの外部の外部サーバーからロードしている場合は、次のようにします。

Security.allowDomain(loader.contentLoaderInfo.url)

次に、エラーが発生するまでゆっくりと電源を入れます。

ポリシーファイルに直接アクセスでき、そのポートでブロックや他のアプリが実行されていないことを確認してください。 通常、ソケットを実行しているときは、ポートを使い果たしていないことを確認するためだけに5000を超えます。 またはいくつかの異なるポートを試してください。

また、単純なチェックとして、crossdomain.xmlという名前を付けて、すべて小文字にします。 私はプログラマーに彼らの髪の毛を引き出させました、そして、これは原因であることがわかりました。


1


dan_nlの提案のように、xml終了タグ "/>"の前に空白を入れるようにしてください。

_ _

それを笑わないでください、私はちょうどこのようにあなたのものと非常によく似た問題を解決しました(そして、それは本当にパームバグのように見えます


1


もしかして…​ これはWindows Vistaで発生していますか? IPアドレスはホスト名として指定されていますか? もしそうなら、 こちらを参照してください。

それともプロファイラーがアクティブな間に起こっているのでしょうか? もしそうなら、 このを参照してください。


1


ポリシーファイルを送信するとき、サーバーはポリシーxmlの後に常にゼロバイトを送信するべきです。 ゼロバイトが送信されるかどうかは上記の説明からは明らかではありません、そしてこれは最終的にFlashプレーヤーを混乱させるかもしれません。


1


これはあなたを助けるかもしれないし、助けないかもしれませんが、私たちは同様の問題を抱えていました。 セキュリティエラーが発生しましたが、矛盾していました。 私はフロントエンドを構築し、PHPで書かれたSocketを扱っていた開発者と仕事をしました。 問題は、Flashがポリシーファイルを受け取る前にソケットへの接続を試みるという競合状態が実際にあったことです。 フロントエンドで、私はあきらめる前に設定された回数を実行するSecurityエラーハンドラの再試行を作成し、またデフォルトの20秒から6または8にタイムアウトを設定しました。 それは通常2回目の試行でキャッチし、これは助けになりましたが、接続に8-10​​秒かかることがありましたが、最適な解決策ではありませんでした。

私の検索でいくつかのリンクに出くわしました、そしてこれは7番目の投稿、サーバーの遅れを設定することについて何かを言いました:

最後に、このアドビの記事からPythonポリシーファイルサーバをダウンロードして使用しました。それは問題なく機能しています。理由を説明することはできません。サーバの人ではないのですが、ちょっとした価値があります。

私は新しいユーザーなので、ハイパーリンクを1つしか投稿できません。 「ソケットポリシーファイルサーバーの設定」を検索してください。アドビシステムズ社のサイトにその記事のサンプルファイルがあります。


0


私はJames Wardが正しいと思います - 私は現在Socketsを扱っています、そして先日この問題に遭遇しました。 COMPLETEイベントが送出されたときにFlashクライアントがSocketを閉じないと、エラーが発生する可能性があることを示唆する投稿を見つけました。 クライアントのSocketをCOMPLETEで閉じるためのコードを追加しましたが、これまでのところすべて正常に機能しています。