Red5::20.クライアント・サーバー間の通信作法まとめ(1)20.クライアント・サーバー間の通信作法まとめ(1)今回は今まで紹介してきた記事の中からクライアント・サーバー間通信の処理のまとめを行います。書いているうちに一回で収まらないことが明白となってきましたので、まずはFlashクライアントからRed5のメソッドを呼び出す部分について紹介。次回は、Red5サーバーからFlashクライアントへの呼び出しを行う処理を紹介します。(ActionScriptのバージョンは3、Red5は0.9.1で動作確認を行いました)基本的な呼び出しRed5サーバーに接続したFlashクライアントからRed5に定義されたメソッドを呼び出します。クライアント側のコードはFlashMediaServerに対して行うものと同様に以下のように書きます。}サーバーに接続(connect)を行い、成功したらtestMethod()を呼び出すだけのエラー処理も何も無い正常動作するだけのコードです。続いてRed5側のコード。}FlashMediaServerの場合Clientクラスを拡張してメソッドを追加しますが、Red5の場合Applicationクラスにメソッドを追加します。サーバー側のハンドラーをApplicationクラス以外のクラスに設置するにはクライアントからの呼び出しメソッドをApplicationクラス以外に登録した場合があります。その際は「設定ファイルに記述」するか、Javaコード内で登録する必要があります。【JAVAコードでハンドラーを追加する場合】Javaコードで登録する場合はApplicationクラスのappStart(Red5起動時に呼び出されるメソッド)時にregisterServiceHandlerを用いて登録します。true;上記の場合HandlerSampleクラスをハンドラーとして登録しています。今回の場合実装は以下のようにしました。null);HandlerSample.handleMethodではなく、registerServiceHandlerの第一引数で利用したsampleをキーとしていることに注意してください。appStartで登録したハンドラーはapplicationスコープのみに登録されます。roomスコープにも適応したい場合はroomStart時にも同様の処理を行う必要がありますので注意してください。handlersの項目を参照してください。続いて設定ファイルでハンドラーを追加する方法。こちらはapplicationスコープにもroomスコープにも適応される利点がありますが、設定ファイルに記述があることを知らないと呼び出しを見つけにくいかもしれません。Javaコードと同様のハンドラーを設定する場合はred5-web.xmlのbreans(複数形)タグの中に以下のようにタグを追加します。呼び出しに失敗した場合の挙動を確認クライアントからの呼び出しメソッドがサーバーに定義されていなかった場合の処理を見てみます。以下のように存在しないメソッド呼び出してみます。null);これだけだとクライアント側では成功か失敗か判別できる情報、イベントは発生しませんが、サーバー側では以下のようなログが吐き出されます。org.red5.core.HandlerSample@199a84fcallメソッドの2つ目の引数に何も指定しないとクライアント側で何も通知されないのは気に入りません(例外でも起こしてくれれば良いのに・・・)が、Flashからエラーを取れるようにResponderクラスを設置してあげましょう。}Responderクラスに登録したメソッドは、呼び出しが成功した場合一つ目の引数に登録したメソッド。失敗した場合は2つ目のメソッドが呼び出されます。今回の場合は_onStatusメソッドが呼び出されることになります。引数として渡されるstatus変数の中身は以下のようになりました。errorNetStatusEvent.NET_STATUSイベントで取得できても良い感じですねぇ。引数を渡す、戻り値を受け取る次にFlashからRed5に色々な値を渡して見ましょう。FlashとFMS(および互換サーバー)間のデータのやり取りにはAMFという形式が利用されます。AMFはActionScript上のデータをシリアライズした形で送信するフォーマットで、AMFに対応していればサーバー側がJAVAであったりPHPであってもオブジェクトのやり取りが可能となり単純なHTTPによるGETリクエストなどと比べると柔軟な処理が可能となります。Flash側で以下のようにコールを行います。ActionScriptコード(サーバーに引数を一つ渡す。str)【オブジェクトを渡してみる】ActionScriptのObjectを渡す場合はRed5側はObjectMap型で受け取ります。オブジェクト以外のクラスを渡すこともできますが、さすがにRed5に渡るのはパラメーターのみでメソッドは渡らないようです。【返り値を受け取る】Red5からの返り値を受け取る方法は、これまでのコードから予想できるとおり、クライアント側のResponderクラスに渡した第一引数のメソッドで受け取ることができます。いうのは同期処理でそのままreturnとして値を返せる場合のみで、非同期処理の場合はRed5からクライアントのメソッドをコールしてあげる必要があります(この方法はその2で詳しく紹介します)。}以上でクライアントからサーバーのメソッドを呼び出す処理の紹介でした。次回はサーバーからクライアントのメソッドを呼び出す方法を紹介します。1.Red5について2.Windowsにインストールする3.FreeBSDにインストールする4.接続人数を返すアプリケーション作成(Win)5.Red5に映像を録画するサンプルプログラム6.Red5のログ保存方法7.サーバーのメソッドを呼び出す8.クライアントのメソッドを呼び出す9.接続クライアント全員のメソッドを呼び出す10.接続クライアントの情報を保持する11.簡単なチャットアプリを作成する(その1)12.簡単なチャットアプリを作成する(その2)13.簡単なチャットアプリを作成する(その3)14.意味無くまわしてみた・・・15.データベース(MySQL)と接続する16.AIRチャット(β未満)を公開します。17.AIRチャット(β)修正18.EclipsePlugin導入方法19.xuggleプラグインで遊ぶつもりが遊ばれてみる20.クライアント・サーバー間の通信作法まとめ(1)ActionScript3Papervision3DFlashMediaServerRed5WowzaMediaServerトッププログラミング書籍紹介サイト製作四方山噺Macブログ。