Zend_Amfを使っての通信
それでは実際にZend_Amfを使った例を見てみましょう。ここではFlashアプリ内のボタン[Send to Zend Amf]を押すとサーバへリクエストが渡り、そこから返ってきたメッセージをFlashアプリ右側のテキストエリアに表示するという、簡単なやりとりを見てみます(図3)。
Flash側のコードを理解する
まず、Flashアプリのソースコードから見ていきましょう。リスト3にFlashアプリのユーザーインターフェースの一部を示します。(2)のボタンはクリックされるとclick属性に記述されているようにsend関数を呼び出し、(1)に格納されたテキストを送信します。また、(3)にはidがmessageであるテキストエリアがあり、PHPから帰ってきたメッセージを表示するようになっています。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
...
<!-- (1) 送信テキスト -->
<mx:Text width="100%" color="blue"
text="Zend Amf と Flex のテスト"/>
<!-- (2) ボタン -->
<mx:Button id="iconButton" label="Send to Zend Amf"
paddingLeft="12" paddingRight="18" labelPlacement="right"
color="#993300" click="send();"/>
...
<!-- (3) テキストエリア -->
<mx:TextArea id="message" text="" editable="false"
height="100%" width="100%"
color="#0000FF"/>
...
</mx:Application>
リスト4は、Zend_Amfと実際にやりとりする部分のコードです。(1)にはリスト3の(2)から呼び出されるsend関数が記述されています。(2)にはZend_Amfからの応答が返ってきた場合の処理が、(3)には通信に失敗した場合の処理が記述されています。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<!-- Zend_Amfと実際にやりとりするAction Script -->
<mx:Script>
<![CDATA[
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
import mx.controls.Alert;
/* (1) AMF3形式でデータを送る */
private function send():void {
//(1-1)結果に応じたコールバック関数を登録したオブジェクト
var responder:Responder = new Responder(onSuccess, onFailure);
//(1-2)Zend_Amfとの接続のためのオプジェクト
var nc:NetConnection = new NetConnection();
//(1-3)Zend_AmfのURLを指定
nc.connect('http://localhost/index/amf');
//(1-4)AMF3 でエンコードするように指定
nc.objectEncoding = ObjectEncoding.AMF3;
//(1-5)渡すデータを作成
var params:DataAS = new DataAS;
params.data = texttosend.text;
//(1-6)Zend_AmfにgetHelloStringをリクエスト
nc.call('HelloWorld.getHelloString', responder, params);
}
/* (2) 成功時の処理 */
private function onSuccess(ret:*):void {
if (typeof ret == 'string') {
//テキストエリアに帰って来た文字列を追加
message.text = message.text + ret;
}
}
/* (3) 通信に失敗した時の処理 */
private function onFailure(ret:*):void {
Alert.show('通信に失敗');
}
]]>
</mx:Script>
...
(1)の処理をもう少し詳しく見ていきましょう。ここでは最後の(1-6)にあるnc.callでZend_AmfにHelloWorldサービスのgetHelloStringメソッドの処理をリクエストしていて、その前の部分はそのリクエストのための準備となります。
(1-1)では、nc.callの結果に応じた処理を行うコールバックを登録するためのオブジェクトを生成しています。nc.callの処理が成功した場合は(2)のonSuccessを、失敗した場合には(3)onFailureを呼び出すようにしています。
(1-2)ではZend_Amfに接続するためのオブジェクトを生成し、(1-3)で接続先のアドレスを指定しています。また、(1-4)ではリクエストの形式を指定しています。
(1-5)ではリクエストの際に送るデータを作成しています。ここではデータをDataASクラスのオブジェクトとして渡していますが、このようにオブジェクトをデータの受け渡しにはコツがあります。こちらについては、後からもう少し詳しく説明します。

