汎用的なXMLSocketサーバを書いた
FlashのXMLSocketサーバ「Hoppy」をリリースしました。
Hoppy - Flash XMLSocket Server
http://github.com/miki/Hoppy/tree/master
githubにあげてあります。そのうちCPANにも反映されると思います。
HoppyはFlashのXMLSocketサーバのperl実装です。いわゆるプッシュ型のwebアプリケーションを簡単に実装することを目標としたTCPサーバです。
内部はperlのPOEによるイベントドリブンな実装なので、POEの知識がある方であれば、かなり柔軟にサーバの振る舞い自体を変更したり拡張したりすることができます。逆にPOEを知らない人でも、いくつかの決めごとに従うだけで、簡単に機能を搭載していく事ができます。
基本的な決めごと
Hoppyはある程度の「決めごと」を前提とした、汎用的で拡張可能なXMLSocketサーバです。
ある程度の決めごととは
* クライアントとサーバ間の通信はRPC的なやり取り(methodとparamsを指定する)で行われる
* 接続したら、まず最初にloginというmethodを叩く必要がある
* 実際のアプリケーションはHoppy::Service::Baseの派生クラスをユーザが書いて、サーバ起動時にregistする
基本的にはこれだけです。
RPC的なIOフォーマット
Flashからは以下のようなデータを送信します。
{"method":"メソッドネーム", "params": {"パラメータ1":"値1", "パラメータ2":"値2"}}
そうしますと、サーバ側ではmethodで指定したサービスモジュールがdispatchされるようになっています。
また同様にサーバからクライアントに情報をプッシュすることもできます。そのときもフォーマットは同じものを使います。
IOフォーマットはいまのところJSON-RPC的なものしか用意していません。あとからXML版を作ってもいいけど、今となってはJSONがあれば十分かなとも思っています。
loginと認証
loginについてはデフォルトだと「user_id」だけ適当に指定すれば認証が通るようになっています。
またHoppyは内部にRoomという概念を持っていて、接続してloginしたユーザのセッションはかならずどこかのRoomに格納されます。デフォルトだと(なにも指定しないと)globalという名前のRoomに収容されます。
実際にちゃんとした認証を挟みたければ「auth」という名前のServiceクラスを作ってサーバにregistすればそれが呼ばれます。regist方法は以下で説明します。
独自サービスの組み込み
独自の機能を搭載するには、独自にクラスをつくり、サーバ起動時に以下のように設定します。
use Hoppy; my $server = Hoppy->new(config => { port => 12345 } ); $server->regist_service( auth => 'MyService::Auth', chat => 'MyService::Chat', ); $server->start;
この例では上記で説明した「auth」というメソッドと「chat」というメソッドをサービスとして組み入れているイメージです。
組み入れるクラスはこんなコードになります。
package MyService::Auth; use strict; use warnings; use base qw(Hoppy::Service::Base); sub work { my $self = shift; my $args = shift; # 第1引数にハッシュリファレンスで引数が渡される my $poe = shift; # 第2引数にPOE::SugarArgsのオブジェクトが渡されるので、使いたかったら使う my $c = $self->context; # context()でHoppyオブジェクトにアクセスできる # ここに自由に機能を書く } 1;
Hoppy::Service::Baseを継承します。またこのクラスには必ずworkというメソッドを作っておく必要があります。(Hoppyは内部でサービスクラスのworkメソッドにdispatchします)
なお、Hoppyオブジェクト($c)はunicast、multicast、broadcastなどの通信メソッドを持っています。
なので、これらの通信メソッドとユーザ自身が構築する機能を駆使して同期型のwebアプリケーションを構築する事ができます。
名前の由来
Hoppyという名前の由来ですが、最近行きつけの居酒屋でよく「ホッピー」を愛飲しておりまして、他に良い名前が思い浮かばなかったので、そのまんま「Hoppy」と名付けました。なんか響きもかわいいし。
と、ここまできて、今更になって「英語ではなんか意味あるのかな?」と思って調べてみました。
goo辞書
* hoppy
* 【名】 〈米俗〉麻薬中毒者 {まやく ちゅうどくしゃ} 【形】 ホップの豊かな
おい、ジャンキーかよ。。。
くそぉ、勘違いすんなよ!おれは麻薬中毒者じゃないぜ!
草なぎ剛に心から同情する、ただのアル中さまだぜ!!
というわけで、万年二日酔い状態ですが、興味のある方は使ってみて下さい。
一緒に飲みながら開発してくれるアル中プログラマー、絶賛募集中です。