要するにAMFのデータをJava側で処理する方法です。
しかし、httpのプロトコルを使っての話ではないです。
たとえば、AMF3のデータをBase64してそれを、再度Javaで復元するという感じです。
具体的には、XMLSocketを通じてやりとりをしてみます。
XMLSocketのサーバについてはこちらにて多少説明してあります。
httpプロトコルを使わないのは、Flash側に簡単にpush配信ができるからです。
まあ、ずーとコネクションを張っていますから、そりゃできますよね。
でも、http通信を使ってもクライアント側にpush配信できるソリューションがあるので、
どうやっているのかなーと思ったら、keep-aliveでずーとコネクションを張りっぱなしにしてトンネルするのですね。知りませんでした。
(この方法、XMPPを見ていて知りました。)
そんなことをやろうとも思いもしませんでしたが、確かに、httpサーバを作る側になったときに、
keep-aliveでセッションを張られたときにいったいいつコネクションを切ればいいのかというのが悩みの種という思いをいただいた記憶がありました。
idleタイムとかでやるしかないのでしょうが・・・・めんどくさいです。でもサーバですからね。。。。
それと、PHPなんかには、AMF3のデータを処理するライブラリがたくさんあるのに、Javaにはないのかなーと思っていたら、
本家(Adobe)から出しているので、ないのですね。
さて、それではJavaのライブラリの取得方法は
本家から、BlazeDSのBinaryをダウンロードしてきます。
次に、blazeds.warがありますから、これがZIP圧縮されていますので解凍して、
\blazeds\WEB-INF\lib
にある
flex-messaging-common.jar
flex-messaging-core.jar
を取得して、これをJavaのクラスパスに設定できるようにしておいてください。
さて、AS3側の処理です。簡単なのでかなりはしょっていますが、流れを見ていただければ・・・
var sock:XMLSocket = new XMLSocket();
sock.connect(HOST,PORT);
:
public function send(data:*):void{
var bytes:ByteArray = new ByteArray();
bytes.writeObject(data);
var b64:Base64Encoder = new Base64Encoder();
b64.encodeBytes(bytes);
sock.send(b64.toString());
}
のように、どんなオブジェクトでもByteArrayからBase64してXMLSocketへ投げます。これで、as3側はOKです。
次にJava側ですが・・・
再度、XMLSocketのサーバについてはこちらにて多少説明しています、そして、そのソースを再利用しています。
// ここで送られたBase64の文字列をどうにかして取得する。
String request = (String) e.getMessage();
Decoder base64 = new Base64.Decoder();
base64.decode(request);
byte[] data = base64.flush();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
Amf3Input input = new Amf3Input(new SerializationContext());
input.setInputStream(bais);
log.debug("request object:" + input.readObject().getClass());
と、Amf3Inputというオブジェクトを使ってあげればよくて、そこで、readObject()を使えば、オブジェクトが取得できます。
たとえば、AS3のDate型のオブジェクトを渡せば、Javaでは、java.util.Dateの型になるという感じです。
次は、JavaのオブジェクトをAS3側で扱えるようにしてみたいと思います。


