[[FrontPage]]

FlashでSocketやXMLSocketを使ってサーバにアクセスするには、ソケットポリシーファイルの設置が''必須''です。ソケットポリシーファイルはHTTPポリシーファイル(crossdomain.xml)とは''別物''です。

公式サイトも含め、いまいちまとまっていてかつ新しい情報が見つからなかったので、まとめてみました。以下の情報はFlash Player 6〜10に対応しています。

#contents

* おすすめの設置方法 [#x9735172]

843番ポートに(ソケットマスターポリシーファイルとして)配置する方法です。

まずソケットポリシーファイルを書きます。たとえばirc.gimite.netに置いてあるFlashから6667, 6668番ポートにアクセスできるようにするなら、こんな感じです。
まずソケットポリシーファイル([[仕様:http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html]])を書きます。たとえばirc.gimite.netに置いてあるFlashから6667, 6668番ポートにアクセスできるようにするなら、こんな感じです。
 <?xml version="1.0"?>
 <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
 <cross-domain-policy>
     <allow-access-from domain="irc.gimite.net" to-ports="6667,6668"/>
 </cross-domain-policy>
どのホストからもアクセスできるようにしたければ、こんな感じです。
 <?xml version="1.0"?>
 <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
 <cross-domain-policy>
     <allow-access-from domain="*" to-ports="6667,6668"/>
 </cross-domain-policy>

あとはサーバの843番ポートに何かの入力があったときに、このファイルの内容を返せばOKです。方法は何でもいいのですが、以下はinetdを使う例です。
- まず[[in.flashpolicyd.rb:http://gimite.net/archive/in.flashpolicyd.rb]]をダウンロード。(ちなみに[[Adobeのページ:http://www.adobe.com/jp/devnet/flashplayer/articles/socket_policy_files.html]]で配布されているin.flashpolicyd.pyはバグっていて動きませんでした…。)
- 設定ファイルを編集。rubyコマンド、in.flashpolicyd.rb、ソケットポリシーファイル(socket-policy.xml)のパスは環境に合わせて書き換えてください。
 # emacs /etc/services
 以下の1行を追加:
   flashpolicy	843/tcp
 # emacs /etc/inetd.conf
 以下の1行を追加:
   flashpolicy  stream  tcp  nowait  root  /usr/local/bin/ruby  ruby /path/to/in.flashpolicyd.rb /path/to/socket-policy.xml
- inetdを再起動。
 # /etc/rc.d/inetd restart (Free BSDの場合)
 # /etc/init.d/openbsd-inetd restart (Debian Linuxの場合)
- ファイアウォールなどを設定している場合は、843番ポートを開けるのを忘れずに。

あとはActionScript上で以下のように書けば、動くはずです。
 Security.loadPolicyFile("xmlsocket://irc.gimite.net:843");
 socket = new Socket("irc.gimite.net", 6667);
 ...

* ソケットポリシーファイルまわりのFlash Playerの挙動 [#ya03cde9]

** 全バージョン共通 [#c5dfe94d]

- Flash PlayerはSocketやXMLSocketを使う前に、サーバの特定のポートに <policy-file-request/> という文字列 + ヌル文字 を送信します。サーバはそれに対して以下のようなソケットポリシーファイルの内容を送信し、接続を切る必要があります。接続を切らないと認識されないので注意。どのポートに送るかはFlash Playerのバージョンによって違います。
 <?xml version="1.0"?>
 <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
 <cross-domain-policy>
     <allow-access-from domain="irc.gimite.net" to-ports="6667,6668"/>
 </cross-domain-policy>

** Flash Player 9.0.124.0以降 (Flash Player 10を含む) [#l039887b]

- ソケットポリシーファイルが必要なケース
-- Socket、XMLSocketを使う場合は常にソケットポリシーファイルが必要。
- 接続先ポート
-- まず843番ポート(ソケットマスターポリシーファイル)にアクセス。繋がらない or 3秒以内に返事がない場合は、次へ。
-- Security.loadPolicyFile("xmlsocket://...");で指定されたポートがあれば、そこにアクセス。繋がらない or しばらく(20秒ぐらい?)返事がない場合は、次へ。URLがxmlsocket://...の場合のみ有効なので注意。Security.loadPolicyFile("http://...");で指定されたファイルはSocket、XMLSocketによる通信では無視される。
-- Socketの接続先と同じポートにアクセス。適切なソケットポリシーファイルが受信できなければ、SecurityError。

** Flash Player 9.0.115.0以降 9.0.124.0以前 [#vfa371eb]

- ソケットポリシーファイルが必要なケース
-- 1024未満のポートに接続するか、SWFファイルを提供しているホスト以外のホストに接続するときは、ソケットポリシーファイルが必要。
- 接続先ポート
-- Flash Player 9.0.124.0以降と同様。
-- ただし、Security.loadPolicyFile()でHTTPポリシーファイル("http://irc.gimite.net/crossdomain.xml"など)を指定した場合も、Socket、XMLSocketに適用された。

** Flash Player 7.0.19.0以降 9.0.115.0以前 [#m0963bb1]

- ソケットポリシーファイルが必要なケース
-- Flash Player 9.0.115.0以降 9.0.124.0以前と同様。
- 接続先ポート
-- Security.loadPolicyFile("xmlsocket://...");で指定されたポート、またはSecurity.loadPolicyFile("http://...");で指定されたURLがあれば、そこにアクセス。繋がらない or しばらく(20秒ぐらい?)返事がない場合は、次へ。
-- Socketの接続先と同じポートにアクセス。適切なソケットポリシーファイルが受信できなければ、SecurityError。

** Flash Player 6以降 7.0.19.0以前 [#x7f3347e]

- ソケットポリシーファイルが必要なケース
-- Flash Player 9.0.115.0以降 9.0.124.0以前と同様。
- 接続先ポート
-- ソケットポリシーファイルには未対応。
-- ソケットサーバへの接続は、ソケットサーバと同じホストのポート80上にあるHTTPサーバのデフォルトの場所に置かれているポリシーファイルによって承認されていた。

* おすすめの設置方法をおすすめする理由 [#i95fa608]

- 843番ポートに設置する理由
-- Flash Player 9.0.124.0以降では必ず最初に843番ポートにアクセスします。それ以外のポートは、843番ポートを試して、失敗してから見に行くので、ちょっと時間がかかります。843番ポートが閉じている場合でも、手元の環境では1秒ぐらい余計にかかりました。
- 843番ポートに設置した場合でも Security.loadPolicyFile("xmlsocket://irc.gimite.net:843"); を書く理由
-- 新しめのFlash Playerであれば、loadPolicyFile()なしでも一応動くのですが…
-- Flash Player 9.0.115.0以前だとソケットマスターポリシーファイルに対応してないので、loadPolicyFile()がないと843番ポートを見に行ってくれません。
-- 新しめのFlash Playerでも、loadPolicyFile()がない場合は、843番ポートから3秒返事がないと、843番ポートからの取得をあきらめてしまいます。これだとネットワークが遅かったりサーバが重かった場合にSecurityErrorになる場合があります。loadPolicyFile()で指定したポートからの取得なら20秒ぐらいは待ってくれるようなので、この手のエラーを減らせます。

* 情報源 [#ef878d7e]

- Flash Player 10,0,12,36で上のような挙動になることを確認しました。他のバージョンについては以下のAdobeのドキュメントをもとにまとめましたが、実際に試したわけではないので、間違っているところがあるかもしれません。
- [[データのロード - ActionScript 3.0 (Flash Player 10対応):http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7c60.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7c63]]
- [[データのロード - ActionScript 3.0 (Flash Player 9対応):http://livedocs.adobe.com/flash/9.0_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000349.html]]
- [[Socket - ActionScript 3.0:http://www.adobe.com/livedocs/flex/3_jp/langref/flash/net/Socket.html]]
- [[Flash Player 9および10におけるポリシーファイル関連の変更点:http://www.adobe.com/jp/devnet/flashplayer/articles/fplayer9_security_04.html]]
- [[ソケットポリシーファイルサーバの設定:http://www.adobe.com/jp/devnet/flashplayer/articles/socket_policy_files.html]]
-- ここで紹介されているサンプルコード(少なくともin.flashpolicyd.py)はバグっていて動かなかったので注意。
- [[Cross-domain policy file specification:http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html]]

* コメント [#l7d49cd7]

間違いとか見つけたら教えてください。
-動きません --  &new{2011-10-07 01:38:39 (金)};

#comment


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS