2011年6月2日木曜日

ActionScriptとjavaのソケット通信がうまくいかない件について

Flexの内部でactionscriptを動かしてjavaとsocket通信させるFlashアプリケーションを作ろうと思って、Flash Builderでソケットプログラムを書いた

コーディングは問題なく終わり、開発環境では実行すると問題なく動くので実際にwebサーバーにあげて動作テストすると・・・うごかない(--;)

Client側でデータを送信していないにもかかわらずServer側のreadメソッドが実行されて、EOFErrorが発生してしまっていた

最初はsocketが切断されているのかと思ったが、どうやらsocketを生成できていないみたい・・・
なぜFlash Builderの実行では動作しているのに、実際の環境では動かないのかと考えてセキュリティサンドボックスじゃね?ってことになったのでサンドボックスについて調べた(セキュリティサンドボックスは安全な砂場でしか動作させねーよって意味)

セキュリティサンドボックスの種類は4種類あって
・local trust:信頼できるファイルとして手動設定したもの、ネットワークもローカルもアクセス可能
・local-with-filesystem:ローカルのデータにのみアクセス可能
・local-with-network:ネットワークにのみアクセス可能
・remote:リモートから取得したファイル、filesystemかnetworkにのみアクセス可能でアプリ作成者がそれを決定している

このように分かれている
開発環境では自動的にlocal trustに設定されているためネットワークにアクセス可能であり、webサーバにあげるとremoteとなり設定がfilesystemになっているのではと考えた
そこでFlash Builderのプロジェクトを左クリックしてプロパティからコンパイラのオプションを表示して、
use-network=true を追加することでサンドボックスをlocal-with-networkに明示的に指定してみた

結果は・・・かわらず。それもそのはずで、use-networkオプションはデフォルトでtrueになっているのでかわるわけがないとw
ローカル内だからクロスドメインポリシーファイルが必要なわけもないし・・・


んで、もう一度悩んでついに原因を発見しました

それはソケットポリシーファイルがなかったことです!
どうやらFlash Player 9,9,124,0以降ではソケットを生成する際は、接続するサーバー側に必ずソケットポリシーファイルが必要となるという変更が加わったそうです
詳細はこちら↓

ここにあるサンプルスクリプトを落としてStandaloneフォルダのスクリプトを実行させて、ソケットプログラムを動かすと・・・
無事に動作したぁ~


てことでactionscriptでソケット通信をする際にはサーバー側にソケットポリシーファイルを配置しておくことをお忘れなく!
Web Analytics