もっと良い方法
HTTPのGET
/POST
メソッドでデータをやり取りする例を見てきました。簡単な処理ですが、それなりの手間は掛かりますね。
実はFlex・Flashでは、サーバサイドと通信するのに、もっと良い方法があります。それは、サーバサイドで"RPCサービス"を作成して、Flex・Flashから、そのサービスのメソッドを呼ぶやり方です。
「RPC」とは”Remote Procedure Call”の略で、名前の通り、遠隔にあるプロシージャ(=メソッド)を呼び出しを可能にする技術のことを指します。要は、サーバサイドでサービスを書いて登録すると、クライアントは、ローカルのメソッドを呼ぶのと同じように、サーバサイドのサービスのメソッドを呼ぶことができます。
RPCで何が嬉しいかというと、まず直感的に使えることがあります。ローカルのメソッドを呼ぶような感覚で、サーバサイドのメソッドが呼べるのは便利です。しかし、更に重要なのは効率です。最初に紹介したGET
/POST
を使う方法や、XML/JSONといったテキスト表現でデータを送受信する方法では、サーバ・クライアント間で流れるデータは全てが文字列になってしまいます。これは効率が良くありません。例えば、int
型を受け渡すことを考えてみましょう。クライアントサイドからint
型の値を送る際、一旦文字列型に変換されます。
int -> 文字列 -> 文字列 -> 文字列 ->int (クライアント)(サーバ)(クライアント)
という流れになりますが、文字列型とint
型との相互変換が発生するのが無駄です。Flex・FlashのRPC呼び出しで使われるAMFフォーマットは、バイナリ形式のため冗長性が低く、そもそも効率的なデータのやりとりが可能ということもありますが、それだけではなく、Flash Playerがネイティブに扱えるフォーマットというのが重要なポイントです。
前述の例で言えば、RPC呼び出し時には
int -> int ->int (クライアント)(サーバ)(クライアント)
となり、余計な中間オブジェクトが生成されません。クライアントサイドではint
型はActionScriptの型からAMFに直接シリアライズされますし、サーバサイドでもAMFからサーバサイドの言語の対応する型にデシリアライズされます。上記の例では軽微な差で、重要性があまり感じられないかもしれませんが、非常に頻繁にデータをやりとりするシステムではこの差が大きく影響してきます。例えば、株価情報を毎秒チェックし続けるクライアントを考えてみてください。
他にも、高解像度画像など非常に大きなデータを扱うシステムでも、この差が全体のパフォーマンスに大きな影響を与えることでしょう。もしサーバから送られてきた画像がBase64エンコードの文字列なら、文字列を画像に変換するのに多くのメモリを使用しなければなりません。サーバサイドで画像を適切な型(ByteArray)にエンコードしさえすれば、変換の際に必要になるメモリはそもそも不要です。
クライアントサイドの実装
作成するのは、「HelloWorld」です。クライアントから、"Hello"を送信すると、サーバから"World!"を返すというだけの、ごく単純なサンプルです。
一口にRPC呼び出しと言っても幾つか実装の選択肢があり、例えばFlexでは、「RemoteObject」というクラスを使うこともできますが、今回の記事では省略します。RPC呼び出しの際に最も基礎となる、「NetConnection」クラス(flash.net.NetConnection)を使って、RPC呼び出しを実行してみましょう。RemoteObjectと違い、NetConnectionは、Flex・Flashの両方にあるクラスですので、このクラスの使い方を把握すれば、Flashでもほぼ同様の手順でRPC呼び出しを実行できます。
処理の説明
一番上のラジオボタンで、サーバサイドのサービスのうち、どの言語で実装されたサービスを呼ぶかを選択します。「Send a request」ボタンを押すと、左側の入力エリアに入力された文字列を引数として、サーバの「hello」メソッドを送信します。
サーバサイドでエラーが発生した場合は下のテキストエリアに、正常に処理された場合は呼び出した結果が上のテキストエリアに表示されます。