19

Java (1.5) サーバーのソケットに接続した後、Flex 3 サンドボックス エラー #2048 が発生します。サーバー コードはすべて私のものです。つまり、Apache では動作しません。フラッシュ プレーヤー 10.0 r32。

順番は以下の通り…

1 Java サーバーが起動し、ポート 843 でポリシー ファイル要求をリッスンし、ポート 45455 で他の要求をリッスンします。

2 Apache が提供する Flex クライアント (ファイル システムから実行しても同じ結果が得られますが)、ホスト:45455 でソケット接続が行われます。

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

4 ポート 843 経由で Java から次の XML を提供します。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
</cross-domain-policy>

5 プレーヤーはデバッグ ポリシー ログに次のように書き込みます...

OK: Root-level SWF loaded: http://localhost/bst/BasicSocketTest.swf
OK: Searching for <allow-access-from> 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

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

REG/REGISTER;simon;Si

7 ポート 45455 でリッスンしている Java サーバー スレッドが次のように応答します。

REG:0/REGISTER:SUCCESS;simon;Si

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

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

Flex クライアントでへの呼び出しを使用してポリシー ファイルを明示的にロードしようとしSecurity.loadPolicyFile()ましたが、実際には、新しいプレーヤー セキュリティは基本的に無視されます。手順は、ソケット i/o 操作が発生するまでポリシー要求が送信されないことです。その時点で、プレイヤーは常に最初にポート 843 にアクセスして、マスター ポリシー ファイルを探します。1 つが見つかり、それが許可されている場合は、それ以上進みません。

私は、ポリシー ファイルとポリシー ファイルの内容を終了するさまざまな代替方法を試しました。その中には、Flash Player が起動しているかどうかを確認するための意図的なエラーも含まれます。

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

なぜこれが起こっているのか、誰にも手がかりがありますか? Flash Player のバグ?

PS BlazeDS、LCDS、Granite、またはその他のものをサーバーとして使用するように言わないでください。再設計ではなく、この問題の解決策を探しています。代わりに XMLSocket を使用するように頼まないでください - 私はそれを試しましたが、まったく同じ結果が得られました。私は自分のアーキテクチャを慎重かつ慎重に選択しており、バイナリ ソケットが必要です。

EDIT 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;simon.palmer@gmail.com;Si
Receiving: REG:0/REGISTER:SUCCESS;simon.palmer@gmail.com;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 イベントは、サーバーからの応答を正常に受信した直後に発生しますが、エラー #2048 は約 20 秒後まで表示されません。クローズ後、エラーが発生する前にさらにメッセージを送信しようとすると、Flash Player は無効なソケット例外をスローします。

これについてAdob​​e にバグを記録しました。

興味があれば、クライアントとサーバーの両方の完全なソース コードを提供できます。

4

9 に答える 9

3

私はこれをローカルでテストしてきましたが、ソケットが閉じられるまではすべて正常に動作しているようです。ソケットを閉じてはいけませんか?メッセージが Flex クライアントに送信された後、Java コードは次のことを行います。

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

その後、Flex クライアントは、次にソケットと通信しようとしたときにサンドボックス違反を取得します。新しいソケット接続を再度作成すると、送受信が正常に機能し、その後閉じます。しかし、1 分ほどすると、別のサンドボックス違反が発生します。Flash がソケットに ping を実行しようとしていて、ソケットが閉じているため、サンドボックス違反がスローされるのだろうか?

于 2009-12-04T22:16:22.417 に答える
1

ここでの同様の問題は、ローカルホストが127.0.0.1に解決されていなかったことを示しています。

IPアドレスに切り替えて、それが役立つかどうかを確認してみてください。

于 2009-11-10T23:08:09.310 に答える
1

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

試す:

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

または、承認された許可されたホストの外部の外部サーバーからロードする場合:

Security.allowDomain(loader.contentLoaderInfo.url)

次に、エラーが発生するまでゆっくりとオンに戻します。

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

また、簡単なチェックと同じように、crossdomain.xmlという名前を付けていることを確認してください。すべて小文字です。私はプログラマーに髪の毛を抜いてもらいましたが、これが原因であることが判明しました。

于 2009-11-12T23:20:51.950 に答える
1

ひょっとして、これは Windows Vista で発生しているのでしょうか。ホスト名にIPアドレスを指定していませんか? もしそうなら、これを見ください。

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

于 2009-11-21T09:59:56.690 に答える
1

ポリシー ファイルを送信する場合、サーバーは常にポリシー xml の後にゼロ バイトを送信する必要があります。上記の説明からは、0 バイトが送信されるかどうかは明確ではありません。これにより、最終的に Flash プレーヤーが混乱する可能性があります。

于 2009-11-26T16:34:57.573 に答える
1

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

<allow-access-from domain="*" />

笑わないでください、私はこのようなあなたの問題に非常によく似た問題を解決しました(そして、それは本当に解析バグのように見えます)

于 2009-11-16T10:59:58.590 に答える
1

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

私の検索でいくつかのリンクに出くわしましたが、これはサーバーで遅延を設定することについて何かを言いました.7番目の投稿: http://projectdarkstar.com/forum/?action=printpage;topic=1134.0

最後に、この Adob​​e の記事から Python ポリシー ファイル サーバーをダウンロードして使用しましたが、問題なく動作しています。理由は説明できません。私はサーバーの専門家ではありませんが、試してみる価値はあるかもしれません。

わかりました、私は新しいユーザーなので、ハイパーリンクを 1 つしか投稿できません。「Setting up a socket policy file server」を検索すると、すぐに表示されるはずです。Adobe のサイトのその記事にサンプル ファイルがあります。

于 2009-12-01T18:56:18.820 に答える
0

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

于 2009-12-07T16:54:20.030 に答える