FlexとPythonでPyAMFを使ってAMF通信

前回の記事に引き続いて、今回はPythonを使ってFlexとAMF通信をしてみたいと思います。
PyAMFというモジュールを使って、AMF通信してみたいと思います。

PyAMF

  • 下記のサイトより「PyAMF-X.X.X.zip」をダウンロード

PyAMF【http://docs.pyamf.org/dev/community/download.html

  • 任意の場所に解凍
$ unzip PyAMF-X.X.X.zip
$ cd PyAMF-X.X.X
  • インストール
$ python setup.py install

Python

  • 下記のサイトより、「server.py」をダウンロード

http://docs.pyamf.org/dev/tutorials/general/helloworld/index.html

  • server.pyについて

server.pyに下記のソースを追加

class Service:
        def returnName(name):
                return name + 'さん、こんにちわ'
services = {
    'returnNameService': Service.returnName, 
}

が今回Flexから呼び出されるサービスである
また、日本語も扱えるようにファイルの先頭に

# -*- coding: utf-8 -*-

を追記する

  • server.pyの起動
$ python server.py 
Running Hello World AMF gateway on http://localhost:8000 
# これで起動状態になりました

Flex

前回Flexのコードとほぼ同じで、違うのは、connect部分とcall部分である

connection.connect("http://localhost:8000/")

connection.call("returnNameService", responder, nameText.text);

の部分である。
完全なソースは、下記に記します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*">
	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import flash.net.*;

            // データ送信
			private function doRequest():void{
				// レスポンダーを作成
				var responder:Responder = new Responder(onSuccess, onFault);
				// コネクションの作成
				var connection:NetConnection = new NetConnection();
                                // コネクト
				connection.connect("http://localhost:8000/");
				
				connection.objectEncoding = ObjectEncoding.AMF3;
				
                // ServiceクラスのreturnNameメソッドを呼び出す
				connection.call("returnNameService", responder, nameText.text);
			}
			
			// データ取得成功
			private function onSuccess(e:*):void{
				// 返却値をAlertで表示
				Alert.show(e.toString());
			}
			
			// データ取得失敗
			private function onFault(e:*):void{
				Alert.show("通信失敗");
			}
			
			
		]]>
	</mx:Script>
	<mx:TextInput x="10" y="36" id="nameText" />
	<mx:Button label="Submit" id="idTest" click="doRequest()" x="10" y="66"/>
	<mx:Label x="10" y="10" text="name" color="#FFFFFF"/>
</mx:Application>

PHPではクラス名+メソッド名でFlexからPHPのメソッドを呼んだが、
PyAMFでは任意のサービス名が指定できるため、クラス名+メソッド名のような指定はいらないらしい。
(この部分でかなり、ハマりました。。)