- 締切済み
Perlで取得した情報をFlashへ渡す
Perlで取得した情報をFlashのActionScript 3.0で受けたいのですがどの様にすればいいのでしょうか? どなたかよろしくお願いします。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- rafysta
- ベストアンサー率45% (24/53)
ANo.2への「この回答へのお礼」に記載してある質問に対して回答します。 Perlの方の記載は、いたって簡単です。Action Scriptで取り込みたい変数名と同じ変数に対して、Flashに渡したい値をイコールで連結して書けばよいです。複数のパラメータがある場合には、&でつないでください。以下に例を挙げます。($dataと$other_dataにPerlで計算した値が代入されているとします) print "Content-type: text/plain\n\n"; print "first_value=$data&second_value=$other_data"; Flash側で、同じ変数(この場合は、First_valueとsecond_value)を使ってこのデータにアクセスできるので、後は、AcstionScriptで自由に調理してください。
- _--_--_-_-
- ベストアンサー率47% (8/17)
GETかPOSTかはクライアント側 (ActionScript側) で指定することです。 提供者がGETで送り返すわけではなく――。 いうなれば、ただそこにあるデータに対して、GETやPOSTなどのアクセス手段が複数用意されている。どちらを選択するかはActionScript次第。 そんなところでしょうか。
お礼
ということは、複数のデータを返す場合は、Perl側はFlashがGETを指定していようが、POSTを指定していようが、記述方法に違いはないということですか。 ANo.6で$ENV{REMOTE_ADDR}をプリントしていましたが、これをFlash側でどの様にして受けたらいいかわからなかったので、いろいろやってみた結果なのですが、Flash側は、 http://www.at-sonic.com/blog/archives/2008/02/as3php.php のような感じにしておいて、Perl側で、 print "<param name="flashvars" value="IP=$ENV{REMOTE_ADDR} &test=4649">"; のようにしていた場合、Flash側はエラーを吐き出すのですが、&を&だけにして print "<param name="flashvars" value="IP=$ENV{REMOTE_ADDR} &test=4649">"; のようにしてやると、Flash側はエラーを出さなくはなりましたが、IPに入っている値は「undefined」、testに入っている値は、「4649">」が表示されました。 http://www.at-sonic.com/blog/archives/2008/02/as3php.php のphp側のような形で情報をFlashに送るにはどの様にすればいいのでしょうか?
- _--_--_-_-
- ベストアンサー率47% (8/17)
flashvarsの件は忘れてください。 ANo.6で示したのは、単にIPアドレスを返すCGIプログラムです。 これをActionScript側でGETすれば良いのではないかと、ANo.2様のご回答を拝見した際に気が付きました。 2つ以上のデータを渡したいときは、2つのCGIプログラムを用意して別々にGETする、あるいは1つのCGIプログラムで複数行のデータを送り、ActionScript側で切り分けるなどが考えられますが、何分私はActionScriptが読み書きできないため、これ以上は分かりません。
お礼
なるほど。つまり、 Content-Type: text/plain $ENV{REMOTE_ADDR} とプリントすると、GETで$ENV{REMOTE_ADDR}が送り返されるというわけですね。 これをPOSTで送り返すにはどのようにすればいいのでしょうか?
- _--_--_-_-
- ベストアンサー率47% (8/17)
#!/usr/bin/perl -T use strict; use warnings; print <<EOF; Content-Type: text/plain $ENV{REMOTE_ADDR} EOF __END__ 簡単なプログラムになりますが、こんな感じでしょう。
お礼
解答ありがとうございます AS3の方は、 http://www.at-sonic.com/blog/archives/2008/02/as3php.php でいけそうなんですけど、CGI側は、Perlの場合 <param name="flashvars" value="key=value&key=value&key=value" /> をPrintするのではなくて、 print <<EOF; Content-Type: text/plain $ENV{REMOTE_ADDR} EOF と、しておけば良いということでしょうか? この場合は、Flash側に帰ってきた変数は、何に入っている形になるのでしょうか? また、2つ以上の情報をFlashに返したい場合は、どの様に記述すればいいのでしょうか?
- _--_--_-_-
- ベストアンサー率47% (8/17)
完全に的外れな回答をしてしまって申し訳ありません。 CGIプログラムの実装はどのような情報を取得するのかによって異なります。 具体的な事情をお話頂けないでしょうか。もちろん伏せ字で構いません。
お礼
抽象的な質問文になってしまっていて申し訳ありません。 ActionScript3.0ではこのFlashにアクセスしてきたIPアドレスを取得することが出来ないので、Perlを利用して利用者のIPを取得したいのです。
- _--_--_-_-
- ベストアンサー率47% (8/17)
より具体的には、こんな感じです。 <object type="application/x-shockwave-flash" data="sample.swf" width="300" height="400"> <param name="movie" value="sample.swf" /> <param name="quality" value="high" /> <param name="flashvars" value="key0=value0&key1=value1&key2=value2" /> </object>
お礼
なるほど。 ただ、これをプリントすると、Flashを開いているウィンドウからこのPrintをしたものを表示した画面に行ってしまうんですよね? Printで新しい画面を表示させないようにするにはどの様にすればいいのでしょうか?
- _--_--_-_-
- ベストアンサー率47% (8/17)
printでプリントすれば良いですね。 実際に渡したいデータをvalue属性の値に含める形です。 <param name="flashvars" value="key=value&key=value&key=value" /> keyとvalueに具体的な値を入れるということです。
- rafysta
- ベストアンサー率45% (24/53)
古いFlash しか手元にないので、3.0 の場合に参考にならないかもしれませんが、ActionScript 2.0 のときは、以下のような感じでやれば良かったと思います。 とりあえず、FlashからPerlへデータを送って、Perlで処理した後に、再びFlashでデータを受け取る場合に沿って説明します。 単にPerlから情報を受け取る場合や、Perlにデータを送信するだけの場合は、これを少し応用するだけです。 (1)受信専用オブジェクトと、送信専用オブジェクトを用意します。 (2)Perlに送る場合も、Perlから送られてくる場合も、Flash内では、(オブジェクト).(変数)という形でやりとりできるので、Flashでのデータの処理方法を記載しておきます。 (3)準備ができたら、送信専用オブジェクトのメソッド「sendAndLoad」を使って、相手先のCGI、受信用のオブジェクト、送受信のMethod("POST"or"GET")を指定してデータのやり取りをします。もし、単にデータを送信したいだけなら、「sendAndLoad」の代わりに「send」を使って、受信オブジェクトの指定欄には、HTMLで使うターゲット名(_parent, _self)とかを書けばよいです。単にPerlからデータを受け取りたいだけの場合は、「sendAndLoad」の代わりに受信専用オブジェクトの「load」を使って、ターゲットのCBIの名前だけを指定すればよいです。 こんな感じになります。 on (press) { System.useCodepage = false; //送信用LoadVarsオブジェクト mySendVars = new LoadVars(); mySendVars.hensu = hogehoge_txt; //受信用LoadVarsオブジェクト myLoadVars = new LoadVars(); myLoadVars.onLoad = function(success) { receive_txt = myLoadVars.receiveHensu; } mySendVars.sendAndLoad("cgi_name.cgi", myLoadVars, "POST"); } ちなみに「System.useCodepage = false;」の部分は、やりとりする文字コードをUTF-8 にするということで、Shift_JISの場合には、trueにすればよいです。
お礼
解答ありがとうございます。 データのloadをしたいだけなので、Flash側はloadを使うとして、Perl側はどの様に記述しておけばいいのでしょうか?
- _--_--_-_-
- ベストアンサー率47% (8/17)
よく分かりませんが、CGIの話ならobject要素の中に <param name="flashvars" value="data=$DATA" /> みたいな形で渡せばよいのではないでしょうか。 http://blog.keitap.com/archives/000620.html http://d.hatena.ne.jp/undo0530/20080814/1218701961 http://labs.anthill.jp/2007/07/as3flashvars.html
お礼
解答ありがとうございます。 これは、Perlの方には、この<param name="flashvars" value="data=$DATA">をどの様に記述すればいいのでしょうか? Printでプリントすればいいのでしょうか? Perl側からデータを送り返したいだけなので新しいウィンドウは開きたくないのですがどの様にすればいいのでしょうか?
お礼
解答ありがとうございます。 その後色々試してみた結果、perl等のPrintなどでブラウザに表示するというのは、実際はPrintした順に文字列配列として格納され、そのStringデータをブラウザに送り返し、ブラウザがそのStringをHTMLとして解析し画面上に表示されているんですね。 そして、これをFlashに返していた場合、event.target.dataに格納されて返されるのは、Stringだから、それをURLVariablesオブジェクトに読み込んで、変数=データの形を解析させて、データを取り出すと言うことだったんですね。 Perlがどの様なデータを受け渡ししているかよく分かってなかったってつくづく思います。 ただ、一つ疑問なのは、 print "first_value=$data&second_value=$other_data"; だけにしていると、URLVariablesで読み込んだ際first_valueは定義されていないと出てくるんですよね。 これを print "&first_value=$data&second_value=$other_data"; とすると、ちゃんと認識されるんですが・・・ print "Content-type: text/plain\n\n"; の一文が無いからそうなったのかな・・・? 後、FlashはXMLクラスがあるみたいなので、データの種類によっては、XMLで扱っているとものすごく楽そうですね。