2009年1月18日

AMFPHP-搭起Flash與PHP的美麗橋樑

Flash在跟Server在交換資料,比較常見的是一般的文字訊息或是XML,我自己在趕時間的時候,會偷懶的隨便echo一個字出來知會 flash說server程式已經做完了或是程式執行之後的結果,不趕時間且資料量較多的時候,則會乖乖的用XML。不過,最近開始我比較常用的是AMF 跟JSON這兩個方法,其實都還滿方便的,各有其優缺點。

AMF(Action Message Format),由Adobe公司推出的規格,主要是用來給flash以RPC的方式來交換資料用的,在flash player 6的版本就已經開始支援(AMF0),直到flash player 9才又推出新規格(AMF3)。其它細節可參考:http://en.wikipedia.org/wiki/Action_Message_Format

接下來就來個簡單的實作吧 :)

1. 下載AMF gateway
找個自己順手的語言吧

AMFPHP:這是PHP的
http://www.amfphp.org/

PyAMF:這是Python的(還不熟,努力學習中)
http://pyamf.org/

AMF.NET:這是.NET的
http://amfnet.openmymind.net/

光看名字大概就能猜到它的後端是用什麼做的
其它還有for Java或其它的,有興趣的可以繼續google翻翻看

2. 安裝AMF gateway(以AMFPHP為例)
安裝方法很容易的,只要把下載下來的壓縮檔解開,放在Web server底下一個自己找得到的路徑就行了

我是放在 http://127.0.0.1/test/amfphp/ 底下

AMFPHP有提供一個很棒的Service Browser:
http://127.0.0.1/test/amfphp/browser
這是個用Flex做的介面,可以清楚列出目前在AMF gateway上的服務

3. 在AMF gateway上新增一個服務
我做了一個簡單的php類別檔,存檔為callme.php,並放在AMF gateway的services資料夾裡面(文末有原始檔連結)。php不像java或as一樣硬性規定類別名稱一定要跟檔名一樣...至少php5還沒有,但建立這習慣也不錯。

上面,我做了一個callme的類別,然後裡面放了一個callmeplease的方法,這個方法會接收一個參數,執行完成之後,會把傳入的參數return回來
這裡只是簡單直接return而已,更複雜的資料庫存取程式也可以寫在這裡....

接下來看一下Service Browser,會發現寫寫的那個新的服務在的左手邊的列表裡
AMFPHP Browser
在右邊的Text輸入文字,按一下右邊的「Call」,應該就可以直接看到結果。(中文支持問題請見文末補充)

4. 新增一個Fla(這裡以AS3.0為例)
import flash.net.*;

// 新增一個NetConnection物件
var test:NetConnection = new NetConnection();

// 連上AMF gateway
// 這裡每家AMF gateway的實作方法應該都有差別,細節請記得看該實作說明
test.connect('http://127.0.0.1/test/amfphp/gateway.php');

// 準備一個Responder物件來接收事件,用法及參數請參考F1說明
var returnResult:Responder = new Responder(ok, ng);

function ok(res:Object):void {
trace(res);
}

function ng(res:Object):void {
trace(res);
}

//以上,我做了ok跟ng兩個簡單小function,分別是trace出它們接收到的物件

test.call('callme.callmeplease', returnResult, 'hi, flash');
// 這裡是最重要的動作,就是直接用call這個方法
// "呼叫"在gateway上面的callme這個服務裡的callmeplease這個方法
// 第二個參數是接收反應的responder,第三個參數是給callmeplease的參數

以上,callme.callmeplease會把"hi, flash"傳給AMF gateway,然後gateway回傳"hi, flash"回來給flash。順利的話,Ctrl + Enter執行,就會在output視窗看到輸出的東西了。

就這樣,你的Flash已經可以跟各家有支援AMF的gateway"對談"了

上面提到的原始檔在這裡可以拿得到(其實沒幾行字,就一個php跟fla)
http://code.eddie.com.tw/downloads/flash/AMF.rar

還是看不懂嗎? 沒關係,這裡有個很棒的影音教學,看完跟著作一遍就知道大概是怎麼運作的了
http://www.gotoandlearn.com/player.php?id=78

希望對大家有幫助 :)

補充1:
AMF不久之後已經可以在Zend Framework裡找到native module了,ZF真的是包山包海了 :)((而且ZF-AMF就是由AMFPHP裡的主導人Wade Arnold來親自操刀)。

補充2:
AMFPHP預設的編碼是不支援中文的(會出現亂碼),不過只要修改一下gateway的程式碼即可。

使用文字編輯器,開啟AMFPHP資料夾的gateway.php,應該可以找到一段跟字碼有關的:
$gateway->setCharsetHandler("utf8_decode", "ISO-8859-1", "ISO-8859-1");

把它修改成:
$gateway->setCharsetHandler("utf8_decode", "UTF-8", "UTF-8");

或是如果你的PHP模組裡有iconv的話也可以這樣改:
$gateway->setCharsetHandler("iconv","UTF-8","UTF-8");

記得,不要改flash裡的useCodePage = true,雖然可能也ok,但這是走回頭路....能使用Unicode就盡量使用它吧 :)