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 は無効なソケット例外をスローします。
興味があれば、クライアントとサーバーの両方の完全なソース コードを提供できます。