2002/05/14
Flash XML FAQ
以下はFlash XML FAQの日本語訳です。
翻訳は原著者の許可を得て株式会社バスキュールのインターフェース開発チームが行いました。翻訳上の問題点はご連絡お願いします。
- 以下のFAQはFlashKitのXML掲示板でよく受ける一般的な質問の結果として生まれた。できれば、この作業のどの部分も進化していくものであってほしい。もしこのリストにつけくわえるべき質問があったら、Luke Tupper<flash@tupps.com>にその質問とできれば回答もメールしてほしい。
- このFAQの最新版は以下のURLにある。
http://www.tupps.com/flash/faq/xml.html
現在のバージョンは1.1.1 - 変更履歴は以下にある。
http://www.tupps.com/flash/faq/xml-faq-cl.html - ミラーサイトは 以下にある。
http://www.huikuri.com/flash/xml/ - 日本語訳
http://faces.bascule.co.jp/flashxmlfaq.php - 公式ミラーリストに追加してほしいときはLuke<flash@tupps.com>にメールしよう。
質問:
- はじめる前に
- 結合性
- XMLを扱う
- バックエンドとの統合
- ASP/JSP/PHP/Perl/Servlets/ColdFusion/その他いろいろ--を使ってXMLファイルを動的に生成できるか?
- FlashとXML文書の間の結合性における問題をどうやってデバッグするか?
- XMLを出力するためのColdFusionの設定法は?
- PHPでサーバ上のXMLデータを読めるか?
- ASPでサーバ上のXMLデータを読めるか?
- Perlでサーバ上のXMLデータを読めるか?
- ロードしたXMLがブラウザでキャッシュされてしまう。どうやって止める?
- スクリプト
- なぜXML.onloadの呼び出しが起こるのか?
- ノードの値にはどうやってアクセスする?
- 属性にはどうやってアクセスする?
- XMLファイルは値を持つべきか、それとも属性を持っているほうがいいのか?
- XML処理を高速化するには?
- Flash/XML Socketサーバ
- 普通のXMLファイルではできないことがソケット接続でできるのか?
- ソケット接続を行うには何が必要?
- XML Socketサーバは何をするのか?
- Flash用のソケットサーバには何ができるのか?
- どんなソケットサーバが自分に向いているか?
- 現在入手可能なソケットサーバは?
- XML Socketプログラミング
- XML Socketサーバをセットアップ、使用するのは簡単?
- ソケットサーバ一般に存在する問題は?
- ソケットが何かの理由でクローズしたら、Flashプレーヤーから通知される?
- Flashでソケット接続を開くとき、ファイヤウォールの問題があるのでは?
- サーバがXMLを送出しているのに、Flashアプリケーションがそれを受信しない?
- リソース
- XMLを習得するのに、何か他に参考になるものは?
- Flashを習得するのに何か他に参考になるものは?
- XML関連のアクションスクリプトを書くのを勉強するにはどこがいい?
- XMLとFlashを習得するにはどんなチュートリアルがある?
- 謝辞
- はじめる前に
- XMLとは何か? XMLはExtensible Markup Language(拡張可能なマーク付け言語)である。XMLはHTMLに非常によく似たタグを用いる。ただ、タグでページの構造を記述する代わりに、XMLはタグをデータの記述に用いる。これにより構造化されたデータフォーマットが可能になり、以前の実装を崩すことなく拡張することができる。XMLを学ぶためのよい出発点として、
- なぜXMLを使うのか? XMLは、異ったシステム間でのデータのやりとりにおいて標準になってきている。この単純化されたマークアップ言語によって、データの正確な構造を知らなくても異ったシステムにデータを読み込むのが簡単になる。XMLデータの記述が適切に行われていれば、その情報を既に使っているシステムに影響を与えることなく、そのXMLデータに別の情報を付加することが可能になる。
- ただ普通のファイルから情報をロードするだけではだめなのか? Flashファイルの外部の情報を引き出す用途において、loadvariablesは、単純で少量の情報をロードする場合は役に立つ。が、多量の情報が変化、もしくは外部のソースによって生成されるするような状況において、その情報を扱う場合は、XMLを使うべきである。
- 結合性
- 私のムービーをWebサーバにアップロードしたら止まってしまったのだが? Webサーバに置いて走らせる場合、Flashはセキュリティ対策の実装が行われており、Flashファイルの配布元のサーバとの間でしか情報の送受信ができない。他のシステム(たとえばmoreover.com)から情報を読み込もうとするばあいは、XMLファイルが自分のローカルマシンではちゃんと機能するのに、Webサーバにアップするとうまくいかなくなる。
- どうやってFlashで使用する情報をserver Xから得る? 外部のXMLリソースを使う能力は、自分のWebサーバに対してどれだけアクセスをもっているかに依存する。これらのルーチンを使う前に、その外部情報へのアクセス許可を持っているかどうかを確認しよう。
- XMLを扱う
- なぜ復帰文字や改行文字、タブ文字が、空のXMLノードになるのか?
FlashがXMLデータをそのままロードすると、復帰文字と改行文字は空のXMLノードとして表示される。マクロメディアがこのようにした正確な理由ははっきりしないが、XML情報を扱うコードを書くときは、XMLオブジェクトのノードが空ノードでないことを常にチェックするのが重要である。正しいノードを得ているということを確認するためにノード名をチェックしよう。これによって、XMLに対する追加のデータがあったときにも自分のムービーがまだ動作することを保証できる。 - 空白のXMLノードをどうやって取り除く?
バージョン5.0.41以降のFlashプレーヤーのバージョンでは、xml.removeWhitespace(???)というコマンドがあるが、Flashプレーヤーが最新のものであるということを保証できるコントロールされた環境で作業しているのでなければ、これは役にたたない。
第一に、空白コマンドはFlashの最新のバージョンでしか使えないので、古いバージョンだと動かないだろう。ましな選択枝としては、以下のコードを使って空白を取り去るというのがある。
http://www.moock.org/asdg/codedepot/
ページの最後に行くと空白除去のコードのあるflaファイルが見つかる。これはどのFlashプレーヤーでも動く。 - XMLをパースしているときのタイムアウトエラーはどうやって受けるか。
XMLが非常に大きい場合は、FlashはそのXMLを処理するのに長い時間がかかるかもしれない。これが15秒以上かかると、Flashプレーヤーはエラーを投げる。このエラーは変えることができない。選択肢としては、XMLファイルのサイズを削減するか、いくつかの塊に分けてロードとパースを行うことである。子ノードよりも属性の方が、アクセスとパースがかなり早いということが分かっている。 - バックエンドとの統合
- ASP/JSP/PHP/Perl/Servlets/ColdFusion/その他いろいろ--を使ってXMLファイルを動的に生成できるか?
バックエンドのスクリプト言語はどれもXMLファイルを生成できる。適切にフォーマットされたXMLを出力する限り、Flashはその情報をロードすることができる。Flashは、そのファイルが.xmlの拡張子を持っていなくてもよい。
実際、XHTMLに準拠したWebページはFlashで読み込み、パースすることができる。 - FlashとXML文書の間の結合性における問題をどうやってデバッグするか?
まずしなければならないのは、XMLが正しく出力されていることを確認することである。最も簡単な方法は、その情報を読み込むのにWebブラウザを使うことである。インターネットエクスプローラはノードと属性に色がついたツリー構造でXMLを表示するのでよいテストになる。 - XMLを出力するためのColdFusionの設定法は?
- PHPでサーバ上のXMLデータを読めるか?
xmlのcontent typeを"text/xml"にしておけば、データをパースするphpのスクリプトをあらためて用意する必要はない。バージョン5,0,30,0(dev studioで最初にリリースされたバージョン)にはバグがあった。http://www.macromedia.com/support/flash/ts/documents/xml_content_type.htmをみてほしい。このバージョンは常に"application/x-www.form-urlencoded"というcontent typeを送出する。バージョン5,0,42,0のプレーヤーでは(Webブラウザを通した場合のみ)、contentTypeという新しいXMLメンバがあり、content typeを"text/xml"にセットできる。これで、$HTTP_RAW_POST_DATAが自分のXMLでセットされ、不快なキーと値のペアに分割されることがない。
次に、PHP開発者にちょっと一言。バージョン4.0.7には、$HTTP_RAW_POST_DATAを、それがなんであれ強制的にそのままの状態に保持する設定命令があるはずだ。関心のある人は、以下に私のコードがある(動いているようではある。マクロメディアの作例からかなり借用している。)
Flash: on (release) { // A. LOGIN要素を持ったXML文書を構築する。 loginXML = new XML(); loginElement = loginXML.createElement("LOGIN"); loginElement.attributes.username = "MyDog"; loginElement.attributes.password = "barkbark"; loginXML.appendChild(loginElement); // これはバージョン5,0,42,0以上でしか動かない //(Webブラウザでテストするように)。 loginXML.contentType = "text/xml"; // B. サーバからの返事を保持するXMLオブジェクトを構築する loginReplyXML = new XML(); loginReplyXML.onLoad = onLoginReply; // C. LOGIN要素をサーバに送る // loginReplyXMLに返事を設定する loginXML.sendAndLoad("xmlreader.php", loginReplyXML); }xmlreader.php PHP CODE: <? // このファイルに書き込むための適切なパーミッションを // 持っているかどうか確かめる $filename = "xmloutput.txt"; $fp = fopen( $filename,"w+"); fwrite ( $fp, "$HTTP_RAW_POST_DATA" ); fclose( $fp ); print '<?xml version="1.0"?><result>LOGIN OK</RESULT>'; ?>
そして、結局以下のような xmloutput.txtファイルになる
<LOGIN password="barkbark" username="MyDog" />
もう一つの選択肢:
とにかく解決法は、PHPでXMLエンジンを動かす前にある程度パースをすることである。間違ったcontent typeによって、PHPが、データがURLエンコードされているかのように('attribute1=value1&attribute2=value2...')パースしてしまうことになり、XMLエンジンが想定している$HTTP_RAW_POST_DATAではなく$HTTP_POST_VARSに設定されてしまう。なにが間違っているのか分かれば、正しく設定するのは簡単なことである。
$s = ''; while(list($key, $val) = each($HTTP_POST_VARS)) { $s .= $key . '=' . $val; } $s = str_replace('_', ' ', stripslashes($s)); $HTTP_RAW_POST_DATA = $s;
そして、普通に進めば、自分が選んだXMLパーサが起動される。。。。
- ASPでサーバ上のXMLデータを読めるか?
ASPはXML要素を読み込み、木構造をたどるのにMicrosoft XMLパーサを使っているはずである。
XMLを読み込むには、全てのpostデータを変数に割り当ててみよう。
Dim strXML Dim objXML strXML = Request.Form Set objXML = Server.CreateObject("Microsoft.XMLDOM") ' ここで操作を行う Set objXML = Nothing ' 使った後free(開放)する
- Perlでサーバ上のXMLデータを読めるか?
このスクリプト例では、URLが2つのパラメータを取得し、サーバ上のXMLファイルにデータを保存する。################## ### スクリプト開始 ################## ############################################################## ### このファイルは、GET,POSTどちらのフォームでも、 ### 2つの名前/値の組を取得する。 ### 名前は'name' と 'xml'である。'name'は生成しようとしている ### ファイルのフルネームを保持する。 ### 'xml'は書き込みたいデータを保持する。これはXMLフォーマット ### である必要はなく、ファイル名も'.xml'でおわる必要はない。 ### だから本質的には、Flashのなかからテキスト形式で自分の ### サーバサイドスクリプトを書き出し、サーバに送り、とにかく後で ### それを呼ぶということが可能である。 ############################################################## #!/usr/local/bin/perl print "Content-type: text/html\n\n"; if($ENV{'REQUEST_METHOD'} eq "GET"){ $my_data = $ENV{'QUERY_STRING'}; } else { $data_length = $ENV{'CONTENT_LENGTH'}; $bytes_read = read(STDIN, $my_data, $data_length); } # なにか使えるものの中にロードしよう @name_value_array = split(/&/, $my_data); # ここが実際の作業を行うところである。名前/値のペアを # デコードするために @name_value_arrayを一通り処理する。 foreach $name_value_pair (@name_value_array) { # HTMLのフォームデータを名前/値のペアに分割する ($name, $value) = split(/=/, $name_value_pair); # '+'を' 'に置き換える $name =~ tr/+/ /; $value =~ tr/+/ /; # 次に、16進の値を文字に置き換える。 $name =~ s/%(..)/pack("C",hex($1))/eg; $value =~ s/%(..)/pack("C",hex($1))/eg; # 最後に、必要なときに使えるように、値を連想配列にロードする。 if($form_data{$name}) { $form_data{$name} .= "$value"; } else { $form_data{$name} = $value; } } #そして、正しいかどうかを確認するためにデータを出力する #foreach $form_data_key (keys(%form_data)) { # print "$form_data_key = $form_data{$form_data_key}<br>"; #} # ここで、名前/値のペアは元の形にデコードされる。 # そしてそれらをスクリプトから使用できるように # ハッシュに代入する。 # $nameは特定のフォーム要素に関係づけられているので、 # それをインデックスとして利用する。こうすることによって、 # 例えばテキストボックスの値にアクセスしたいときに、 # 次のようにすれば可能になる。 #$first_name = $form_data{'first_name'}; # File 操作 $fileNameToOpen = $form_data{'name'}; open myHandle, ">$fileNameToOpen"; $XMLtoWrite = $form_data{'xml'}; print myHandle $XMLtoWrite; close myHandle; print "Here's the XML: ".$XMLtoWrite; ################## ### スクリプト終了 ##################
- ロードしたXMLがブラウザでキャッシュされてしまう。どうやって止める?
URLが変化するように乱数を使う方法で、簡単にブラウザ/プロクシサーバをだまして新しいファイルを取得していると思わせることができる。例えば以下のファイルをロードしているとする。
http://www.tupps.com/flash/news.xml
このファイルは変化しているのに、ブラウザはこのURLへのリクエストをみて同じものだと思い込み、更新を行わない。URLを以下のように変えてみる:
http://www.tupps.com/flash/news.xml?random=12845743890527
最後の数字は乱数である。これはただのファイルなのでWebサーバはこのrandom=12923434という数字を単純に無視する。しかしブラウザとプロキシサーバは事前にそのファイルが同じかどうか判断できず、リロードを強制される。そのファイルが同じかどうかわからないから。"ランダム"な数を日時をベースに生成すれば、同じ乱数が再使用されないことを保証できる。
- ASP/JSP/PHP/Perl/Servlets/ColdFusion/その他いろいろ--を使ってXMLファイルを動的に生成できるか?
- スクリプト
- なぜXML.onloadの呼び出しが起こるのか?
xml.onloadプロパティには関数名を設定する。XMLファイルがFlashプレイヤーによってロード、パースされると、自分が設定した関数が呼ばれる。自分の設定した関数は、FlashがXMLファイルのロードに成功したかどうかを特定するパラメータを一つ返す。これはXMLデータにアクセスする前にチェックする。
- ノードの値にはどうやってアクセスする?
ノード値はXMLのタグに挟まれた値である。例えば、以下のXML<my-xml>Flash is great</my-xml>
におけるmy-xmlタグのノード値は "Flash is great" である。
一度ツリーをパースして、アクセスしたいノードを見付けたら、そのノードのテキストを取り出すために.nodeValueプロパティを使うことができる。例えば、trace(myXML.firstChild.nodeValue)
nodeValueの機能を使うことは実際には(推奨される形ではあるが)必要ではなく、以下のように単純にできる。trace(myXML.firstChild)
最初の記法と同じ結果が返ってくる。これらのメソッドはノード値を設定するためにも使用することができる。
- 属性にはどうやってアクセスする?
属性はXMLタグの内部に割り振られている。例えば、my-xmlというタグの属性:<my-xml QuoteFrom="Luke Tupper" Display="All">Flash is great</my-xml>
は QuoteFrom と Display である。
属性は、attributesタグを使うことで二つの方法でアクセスすることができる:trace(myXML.firstChild.attributes.QuoteFrom)
もしくはtrace(myXML.firstChild.attributes["QuoteFrom"])
attributesノードは属性にアクセスするためだけでなく、XMLに属性を割り当てるために使うこともできる。新たな属性を付加するのは、以下のように行われる:myXML.firstChild.attributes.NewAttribute = "New Value"
これにより、xmlは以下のようになる。<myXML QuoteFrom="Luke Tupper" Display="All" NewAttribute="New Value">....
- XMLファイルは値を持つべきか、それとも属性を持つほうがいいのか?
ええと、どちらの選択肢もありうる。両方とも、自分の必要とするデータを届けてくれる。Vaykentは最近いくつかのテストを行い、属性を持つXMLは、非常に多くのノードを持つXMLよりもずっとロードが早いということを発見した。(注意: この情報はいまのところFlash 5のものである。)
- XML処理を高速化するには?
figleafの気の効いた奴がいい方法を持っている: XMLNitro 1.3 beta
http://chattyfig.figleaf.com/~bhall/killastuff/XMLnitro.as
このルーチンは標準のXMLルーチンを置き換えて、75~130%の高速化が得られる。以下のディスカッションを見てほしい。
http://www.were-here.com/forums/showthread.php?threadid=78637
- なぜXML.onloadの呼び出しが起こるのか?
- Flash/XML Socketサーバ
- 普通のXMLファイルではできないことがソケット接続でできるのか?
ソケット接続は、Flashの通常のデータ送出とはある根本的な意味で異っている。通常の状況ではFlashクライアントは常にサーバにデータを要求しなければならない。しかしFlashでソケット接続を生成すると、クライアントはサーバから'聞く(listen)'ことができ、サーバはクライアントとの接続をはじめることができる。これが、サーバが複数のFlashクライアントの仲介者としてふるまうマルチユーザ環境の鍵である。これは、一つのクライアントから他のクライアントへのインスタントメッセージのようにデータを扱うことを含んでいる。Napster、RealAudio、Telnet、これら全てがサーバとの通信にソケットを使っているが、同じ方法がFlashにも必要なのである。
ソケットを通じてFlashにもたらされるXMLデータは通常のXMLオブジェクトと全く同じである。唯一の違いはFlashに取り込まれるプロセスの中にある。
- ソケット接続を行うには何が必要?
ソケット接続を受け付けることができるXMLサーバが必要である。FlashムービーがWebサーバから配信された場合、XMLソケットサーバはその同じサーバ、もしくは同じサブドメインで走っていなければならない(例: www.flash.com上のFlashムービーはxml.flash.comからファイルを読める)。
- XML Socketサーバは何をするのか?
XMLソケットサーバは、サーバマシンに常駐して'ポート'上でクライアントからのXML情報を'listen'する。クライアントから情報をうけとると、そのXMLタグを見て、他のクライアントに情報を配信するなどなんらかの動作を行う。XMLソケットサーバはJava, Python, C++などの言語で書くことができ、いくつでも機能を組み入れられる。
- Flash用のソケットサーバには何ができるのか?
現在、ほとんどのFlash用ソケットサーバの実際の機能は、チャット機能レベルである。FlashNexusは、標準の<CHAT>タグに加えて専用タグを作ることができる。FortressはJavaとJavascriptのプラグイン機能の生成を可能にすることで、おそらく最も堅牢なXMLソケットサーバになっている。ほとんどはまだ1.0の段階で、基本的な機能と名ばかりのセキュリティを提供している。どれも本当のデータベース機能をもっていないので、チャットアプリケーションやゲームを自分のサイトの他の部分と統合するには問題があるだろう。
- どんなソケットサーバが自分に向いているか?
XMLソケットがどのように動いているかをもっと学びたいなら、MookCommをダウンロードして試してみよう。チャットかもしくは簡単なゲームサーバを探しているならFlashNexusは素晴らしいアプリケーションだ。JavaがいいならDrserverを使おう。Flashアプリを既に存在するデータベース--例えばmySQLなど--と統合する必要があり、セキュリティと企業レベルの安定性が 求められるなら、現在の唯一の選択肢はFortressだ。
- 現在入手可能なソケットサーバは?
いろいろな種類の言語で書かれた、それぞれ異った方向性の多くのサーバが存在し、それぞれが、長所と短所を持っている。
FlashXML Perl tarball and info:
http://www.stray.ch/articles/flash_sockets.html
フリーウェア。ソースコード入手可。
Perlコードの切れ端と.flaクライアント
Compact XML Flash XML Socket Server
http://www.tupps.com/flash/faq/perlFlashSocketServer.zip
flashチャットクライアント一般に使えるPerlのコード。Vaykentによる。サンプルは以下。
Perlコードのサンプル
use IO::Socket; use IO::Socket; use IO::Select; $manager = new IO::Socket::INET ( Listen => 1, LocalPort => 2229); $selectObj = new IO::Select($manager); $/ = "\0"; while(@readySockets = $selectObj -> can_read){ foreach (@readySockets){ if($_ == $manager){ $newConnection = $manager -> accept; $selectObj -> add($newConnection); } else{ my $sysreadReturn = sysread($_, $infoRead, 2048); if($sysreadReturn == 0){ $syswriteToClient = syswrite($_, '<SYSping/>', 2048); if($syswriteToClient==undef){ $selectObj -> remove($_); } } else{ foreach $eachClient ($selectObj->handles){ $syswriteToEachClient = syswrite($eachClient, $infoRead, 2048); } } } } }Drserver XML Socket Server
http://drj.dreamteam.com.pl/server/
フリーウェア。ソースコード入手可。
Javaでチャットサーバをコーディングするならよいスタート地点になる。サーブレットではなく、マルチスレッドのサーバオブジェクトである。私はいくつかのエラーをみつけており、flaはあまり安定しているとはいえないが、全体的にはよく考えられており、堅牢といえる。
Swocket
http://swocket.sourceforge.net/
フリーウェア。ソースコード入手可。
現在アルファバージョンで0.1pre2. Pythonで書かれている。
FlashNow
http://www.nowcentral.com
商用サーバソフト。
WindowsとLinux用サーバソフト。5ユーザ限定のデモが入手可能。64ユーザの完全バージョンが95ドル。
MoockComm: Chat client/server
http://www.moock.org/chat/moockComm.zip
フリーウェア。ソースコード入手可。
Colin Moockの簡単なチャットクライアント。XMLを使ったFlashでのコーディングの例として書かれている。FlashにおけるXMLの込み入った部分を理解するには最高の初心者用アプリ。
FlashNexus
http://www.flashnexus.com
フリーウェア。ソースコード入手可。
Windowsベースの、特にチャット用に構築されたサーバ。MS Accessのデータベース機能を用いており、カスタムタグを構築できる、よくできたフリーウェア。FlashからSQL命令文が実行できる。
In-A-Flash- Message Board and Avatar Based Chat
http://www.in-a-flash.org
商用サーバソフト。
Flash-XMLベースの掲示版とアバターチャット。バックエンドとフロントエンドをカスタマイズできる。Linux 5.0以上(それが何であるかは別として)、Perl 5.004以上、Apache 1.2以上が必要。評価版が入手可能。
Fortress
http://www.xadra.com/xadra_home.html
商用サーバソフト。
Flash XMLの、企業レベルで高度な安全性が求められる場合のソリューション。サーバ当たりのユーザ数ベースのライセンスのみ。クライアントはかなり印象的で、期待される全ての物があり、トップクラスのサポートとセキュリティがある。Webサイトから: 「ある部屋で行われる活動が、JavaもしくはJavaScriptの簡単なプラグインでカスタマイズできる」。http://www.mediatemple.netでFortressのホスティングサービスがうけられる。評価版が入手可能。
Jabber
http://jabber.org
Linux, FreeBSD, Unix, Win32(cygwin使用) JabberサーバはFlash5のXMLSocket接続を直接サポートしている。これは、Flashクライアントが通常のJabberクライアントとしてJabberサーバに接続でき、通常のJabber XMLプロトコルを話せることを意味する。その一つの例が(最近は更新されていないが)http://www.flabber.org/であり、Disneyもこれをつかって自サイト上でFlashのゲームをいくつか発表している。これには、「トランスポート」機能をサポートしており、AIM, IRC, Yahoo, MSNのプロトコルを含むサーバ機能の拡張を行うことができる。これでFlashクライアントがこれらのネットワーク上の誰とでも通信できるようになる。
AquaServer 1.5
http://www.figleaf.com/development/flash5/
フリーウェア. Java 基本的なXMLSocketサーバとデモ用クライアント。自分で探索したければソースも付いてくる。これもFig Leafからの有用なちょっとした情報だ。
- 普通のXMLファイルではできないことがソケット接続でできるのか?
- XML Socketプログラミング
- XML Socketサーバをセットアップ、使用するのは簡単?
不幸なことに、Flashとソケットを使用するための学習曲線はかなり急峻である。ActionScriptにおけるオブジェクト指向の概念についての高度な知識と、最低でもWebサーバについて中レベルの知識が必要とされる。ちゃんと動くようにするには、プログラミング言語かサーバサイドのスクリプト言語について知っていたほうがいい。もし簡単なFlashチャットアプリを探しているのなら、FlashKitからコードを盗むのがいい。XMLソケットサーバは高度なFlashアプリに高度な機能を提供するものだ。
- ソケットサーバ一般に存在する問題は?
ソケットサーバはポートを使ってクライアントと接続を開かなければならない。ポートは0~65535までの番号が振られている。Flashでは1024より大きいポート番号が必要である。Flashはさらに、サーバのドメインでもそのサイトと同じくポートを必要とし、これは通常のFlashからのデータ接続と同じである。XMLにおける標準的な問題---たとえば_root以外でXMLオブジェクトが使えないなど---はXMLソケットのデータでも同様に存在する。XMLSocketのデータとXMLオブジェクトのデータの唯一の違いは、その取り出し方である。
- ソケットが何かの理由でクローズしたら、Flashプレーヤーから通知される?
XMLSocket.onClose(ActionScriptリファレンスガイドの422ページ)で、サーバから接続を断たれた時のコールバック関数をセットできる。ソケットはだいたいにおいて非常に単純で、以下のコマンドからなる。
connect, onConnect (コールバック)
close, onClose (コールバック)
onXML (完結したXMLファイルを受信したときのコールバック)
send (XMLドキュメントを送信する)
- Flashでソケット接続を開くとき、ファイヤウォールの問題があるのでは?
リアルオーディオなど他のプロトコルを通したい場合と同じ問題が存在する。ファイヤウォールは適当なポートで接続が生成されるように設定されなければならない。特定の種類のデータには特定のポートに対する一般的作法がある。たとえばHTMLデータは80番ポートで走り、Telnetは22、FTPは21、Napsterは6969など。ほとんどのファイヤウォールとプロキシソフトウェアは、プログラムが、これらの共通ポートを通じてあるデータを通し、他のデータを制限するように絶えず更新されている。なので、もし一般的に使われていないポートを使いたくても、ファイヤウォールの後ろのコンピュータにはブロックされてしまい、Flashはそのクライアントのネットワークの管理者が特別にそのポートを使えるようにしないかぎり容易に通信できない。一般的に使われるポート--例えばNapsterの6969--を使用することにして、クライアントでNapsterを走らせているなら、FlashはNapsterのデータのデータを受信することになり、逆もまた同じ、完全に行き詰まってしまう。
- サーバがXMLを送出しているのに、Flashアプリケーションがそれを受信しない?
XMLサーバは各XMLメッセージをnull(ASCII 0)で終わらせていなければならない。そうしないとFlashアプリケーションが、セッションが終わるまで接続を開きっぱなしになる。問題があったら、自分自身のサーバを使う前に、ちゃんと動作していると思われる既存のサーバを見てみよう。そうすれば問題がFlashのコードにあるかソケットサーバにあるのか、どちらかに集中できる。
- XML Socketサーバをセットアップ、使用するのは簡単?
- リソース
- XMLを習得するのに、何か他に参考になるものは?
http://www.w3schools.com/dom/dom_parser.asp
http://www.friendsofed.com
- Flashを習得するのに何か他に参考になるものは?
http://www.flashkit.com/
http://www.flash5actionscript.com/
http://www.layer51.com/proto/
http://www.motionculture.org
http://www.actionscripts.org/
http://www.moock.org/webdesign/flash/
http://www.moock.org/asdg/
- XML関連のアクションスクリプトを書くのを勉強するにはどこがいい?
http://www.flash5actionscript.com/xmlobject.php
- XMLとFlashを習得するにはどんなチュートリアルがある?
- XMLを習得するのに、何か他に参考になるものは?
- 謝辞
- 著者
原著者: Luke Tupper <flash@tupps.com>
著者: VAYKENT
Flash-ソケット関連著者: Chris Hill <mailto:chill@collective3.com>
- 貢献者
emailとFlashKitフォーラム両方を通してこのFAQを定義する手助けをしてくれた全ての人に感謝します。
Naveen Rao
ironmallet
Jpsy
Muzak <Muzakmuzak@pandora.be>
Jeremie <jeremie@jabber.org>
- 翻訳者
日本語訳: 北沢 純<jun@bascule.co.jp>
- 参考資料
このFAQを作るに当たって以下の本を使用した。
Flash 5 Magic, New Riders, ISBN 0-7357-1023-6
ActionScript The Definitive Guide, O'Reilly, ISBN 1-56592-852-0
- 著者
http://www.w3schools.com/xml/xml_whatis.asp
がある。
XMLデータをFlashにロードすると、オブジェクトモデルが生成され、容易にデータを操作し引き出すことができるようになる。このオブジェクトモデルはXMLデータを生成するのにも使えるし、外部のシステムから引き出すのにも使える。
ほとんど全てのブラウザでは、これはFlashファイルを含有しているHTMLファイルがあるサーバである。しかし、少なくともIE4.5のマック版では、そのFlashファイルを持ったサーバとしか情報のやりとりができない。この理由により、FlashファイルとHTMLファイルは同じサーバ上に置くことが推奨される。
以下のルーチンは外部にあるWebサーバから情報を引き出し自分のマシンから再送出することで、2aで要約したセキュリティ問題を回避する。別のサーバベースの言語を使ってこれらのルーチンをどのように実現するか知っていたら、flash@tupps.comにそれを送ってほしい。
ASP:
<%
url="http://p.moreover.com/cgi-local/page?c=Web%20developer%20news&o=xml"
Response.ContentType="text/xml"
Response.Redirect url
%>
Java Servlets:JSP:
Mod-ReWrite on Apache:
Perl:
PHP:
<?php
// Webページを文字列にする
$p = file('http://p.moreover.com/cgi-local/page?c=Developer%20news&o=xml');
echo join('', $p);
?>
Shell Scripting: