4

Java サーバーとの通信に Flash バイナリ (TCP) ソケットを使用する Flex クライアントがあります。テスト中に広く開いている crossdomain.xml ファイルを提供する localhost (Apache) サーバーがあります。

私のコードは、起動時にポリシー ファイルを正常にロードします。

次に、問題なくソケットをサーバーに接続し、メッセージを送信して応答を取得します。これまでのところすべて順調です。

ただし、同じソケットを介して 2 番目のメッセージを送信すると、約 12 秒間一時停止してから、サンドボックス違反エラーが発生します。

Security Error: Error #2048: Security sandbox violation: file:///C:/apache_root/ttt1/ttt1.swf cannot load data from localhost:45455.

これは、最初のメッセージが成功したポートとソケットと同じです。

毎回送信する前にポリシー ファイルを再読み込みしようとしましたが、同じ結果が得られました。

なぜこれが起こっているのでしょうか?明らかに、ある時点でソケットが開いています。各送信後にソケットをフラッシュしており、各読み取り後にもそれを実行しようとしましたが、同じ結果になりました。

前もって感謝します

編集:
すべての呼び出しの前にソケットを再作成すると、コードが機能します。これが正しいとは信じがたいですが、欠落しているソケット設定があるかもしれません。

4

4 に答える 4

1

ソケット接続を作成するときに最初に行う必要があるのは、ポリシー ファイルをロードすることです。これは、SWF のロードごとに 1 回だけ実行する必要があります。

Security.allowDomain(host);
Security.loadPolicyFile("xmlsocket://"+host+":"+port);

リクエストは割り当てられたポート(あなたの場合は45455)で行われます。サーバーは"<policy-file-request/>"引用符なしでリクエストをそのポートでリッスンする必要があります。そのリクエストが見つかったら、ノードを含む crossdomain.xml をクライアントに返す必要があります。<allow-access-from domain="*" to-ports="*" />

クロス ドメインが送信された後、サーバー側でソケットを閉じる必要があります。クライアント側では、Flex が処理するためドメイン応答を無視する必要がありますが、その時点でソケット サーバーに再接続できます。この時点で、データの送受信を行うことができます。

実際に機能した理由は、タイムアウトになる前にポリシー ファイルの接続を使用してデータを送信していたからだと思います。

新しいスタイルのクロスドメイン ポリシーを読み、ソケット サーバーに使用しているプロトコルについても読むことをお勧めします。

于 2011-03-10T23:20:04.797 に答える
1

私の知る限り、バイナリ ソケットを使用している場合、crossdomain.xml は http 経由でロードされません。

クロスドメインがクエリされている場合でも、Apache のアクセス ログを確認しましたか?

javaサーバー上のファイルを要求するフラッシュからtcp経由でフラッシュから接続を取得する場合があります(httpは使用しません。文字列「」などを送信するだけです)。それらに気をつけてください。3 秒 (またはそれくらい) 以内に応答しない場合、flash はサンドボックス違反をスローします。

于 2011-01-30T00:14:05.073 に答える
0

この種のものは、キャッシュの問題のように聞こえます。おそらく、最初のソケット接続をキャッシュから引き出して、2 番目のソケット接続がサーバーから 200 を取得しているため拒否されます。

デバッグのために、フラッシュ セキュリティ例外リストに localhost を追加することをお勧めします。これにより、作品が本番環境に到達するまで、サンドボックス エラーが静かになります。

于 2009-12-23T13:56:47.143 に答える
0

crossdomain.xmlではなく、swfのコンパイルプロセスで使用したサンドボックスポリシーに依存すると思います...おそらく、このドキュメントが役立ちます:セキュリティサンドボックス

しかし、私は100%確信が持てません

于 2009-11-04T11:50:26.183 に答える