高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

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

image

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的
  • PyAMF:這是Python的(還不熟,努力學習中)
  • AMF.NET:這是.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或AS3一樣硬性規定類別名稱一定要跟檔名一樣..至少php5還沒有,但建立這習慣也不錯。

1
2
3
4
5
6
7
8
<?php
  class callme
  {
      function callmeplease($text)
      {
          return $text;
      }
  }

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

接下來看一下Service Browser,會發現寫寫的那個新的服務在的左手邊的列表裡:

image

在右邊的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
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://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就盡量使用它吧 :)

Comments