[[FrontPage]]
#author("2016-08-28T02:53:36+09:00","","")
They arrested members of clergy, who I would not expect to be a      violent thehet.Warn we are talking strikes in the warehouse industry, violence is      not out the ordinary, but an LRAD?      Is the LRAD even legal to use on the public?I know that I shop at Walmart form time to time, but I do try to      avoid them when I can. Sometimes it is limitations on funds or      suppliers that forces me to the herd. You will NOT find me on the      people of walmart page. There are some walmarts that leave me      desiring a shower after I come out, because of the population inside.

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

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

#contents

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

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

まずソケットポリシーファイル([[仕様: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 (金)};
-Null文字書いてないです --  &new{2011-11-16 21:05:44 (水)};

#comment


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