Fleeeex
Adobe、というかMacromedia、いやいややっぱりAdobe、の言語であるところのFlexをいじってます。
仕事でFlashMediaServerをインストールするんですがそれの動作検証用ですね。
俺はFlashもってないので、検証をどうやって作るかなーって所でFlexにご登場いただきました。AdobeのAIRも触ってみたいし、いいタイミングですがな。
Flex SDK とやらで無料でSWFが作れるわけですよ、しかもあの変態なFlashつかわないで、慣れ親しんだコーディングで!(ここじゅうよう)
まあActionScriptは文法が結構謎っつか、そもそも普段OPやってないから、多少面くらいつつHelloworldを書きました。
まあ5分位で出来まして「ちょろいもんよ(あぶらあせ)」とつぶやいてみて、次にいきなりFMSとの連携ですよ。
FlexってFlashと言語的に互換性があるとおもうじゃないですか、
ちょっとくらい、ウィジットを画面に配置するのが手作業なぐらいでロジックは全部Flashからパクれると思ってたんですよ。
Flashのサンプルサイトって山ほどあるし、大丈夫だろーっておもってたんですけど、甘かった。
FMSにつなぐのに、NetConnectionってクラスを使うんですけどね、
Flashだと
nc=new NetConnection();
nc.onStatus=function(info){
var infomsg=info.code;
trace(infomsg);
if(infomsg=="NetConnection.Connect.Success"){
trace("Connected");
}
}
nc.connect(URL);
位書けばいいんですけどね、
F l e x は す ご か っ た
package {
import flash.display.*;
import flash.text.*;
import flash.events.*
import flash.net.*;
public class osisample extends Sprite {
public function osisample() {
trace("Starting.");
var connection:NetConnection;
connection = new NetConnection();
connection.objectEncoding = ObjectEncoding.AMF0;
connection.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, netSecurityError);connection.connect("rtmp://192.168.0.6/sample");
}private function netStatusHandler(evt:NetStatusEvent):void {
switch (evt.info.code){case "NetConnection.Connect.Success":
trace("Connected");
break;
case "NetConnection.Connect.Reject":
trace("Reject");
break;default:
trace(evt.info.code);
break;
}
}private function netSecurityError(event:SecurityErrorEvent):void {
trace("netSecurityError: " + event);
}}
}
普段LLしか触ってない俺には辛いぜ!(笑)
まさかイベントハンドラの定義が今時の最新の言語の癖にこんなにめんどくせえやり方になってるとは。
Flashでは無名関数を突っ込む形でおてがるー♪PerlやJSで俺がなれしたしんだ形ー♪なのですが、同じ言語の筈なのに、FlexはなんかJavaの匂いがするねこれは。
- -
まあでも作りまして、接続の所をnc.connect(null)ってして、ローカルに接続してテストしてたんですけど問題なし。
さてじゃあ社内のテストFMSサーバにつないで見っかーってつないでみたら、これがNetConnection.Connect.Rejectが帰ってくるんですよ。
あれー?弾かれた?IP制限?いや俺の持ってる本にはそういう制限は最初からないよ。LinuxのIptables?いや確認したなー。
まさかDeveloper Editionはローカルホストのみ?いやいやSocksはいてみたけどダメだったよ。
うーんうーん…あ、そうだサーバ側のログ見てみよう…
ああ!これか!接続のURLが間違っていた…。
connect("rtmp/192.168.0.4/sample")
よし、ここを直したぞー接続だ!
…あれ?今度はNetConnection.Connect.Failが帰ってくるな。
変だなー…、サーバー側にも接続できてるみたいだな…、ログを見てもConnectされたって出てるし…。
まあでも一歩前進したし、すぐ解決するだろ。
(省略)
パケット拾ってみてもバイナリ通信だから読めないよー…
でもやり取りできてるからサーバかクライアントの問題だよなー…
rtmpt?httpトンネル用?おお!読める!!…ヘッダーだけ…本文はバイナリ…。
(中略)
Adobeうぜえ
(前略)
…AMF?
(略)
どこにもNetConnectionがやりとりするAMFとかいうプロトコルにバージョンがあるなんてかいてなかったじゃん!俺が持ってる本にもAdobeのサンプルにもなかったじゃん!
connection.objectEncoding = ObjectEncoding.AMF0;
一行いれたらウソのように動いた。
なんかエラーログの詳細(デフォルトで出力されない)を見れば解ったらしい。
結論:Adobeはログをもっと判りやすくと出してください、VerboseModeを用意してください。
後、XMLの設定ファイルは読みづらいこと山の如し、書き換えにくいこと風のごとしなので是非やめる方向で…。