
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
找個自己順手的語言
光看名字大概就能猜到它的後端是用什麼做的。其它還有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或AS3一樣硬性規定類別名稱一定要跟檔名一樣..至少php5還沒有,但建立這習慣也不錯。
1 2 3 4 5 6 7 8 | |
上面,我做了一個callme的類別,然後裡面放了一個callmeplease的方法,這個方法會接收一個參數,執行完成之後,會把傳入的參數return回來。這裡只是簡單直接return而已,更複雜的資料庫存取程式也可以寫在這裡…
接下來看一下Service Browser,會發現寫寫的那個新的服務在的左手邊的列表裡:

在右邊的Text輸入文字,按一下右邊的「Call」,應該就可以直接看到結果。(中文支持問題請見文末補充)
4. 新增一個Fla(這裡以AS3.0為例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
以上,callme.callmeplease會把”hi, flash”傳給AMF gateway,然後gateway回傳”hi, flash”回來給flash。順利的話,Ctrl + Enter執行,就會在output視窗看到輸出的東西了。
就這樣,你的Flash已經可以跟各家有支援AMF的gateway”對談”了。
上面提到的原始檔在這裡可以拿得到(其實沒幾行字,就一個.php跟.fla)
還是看不懂嗎? 沒關係,這裡有個很棒的影音教學,看完跟著作一遍就知道大概是怎麼運作的了 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就盡量使用它吧 :)