汎用的な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
* 【名】 〈米俗〉麻薬中毒者 {まやく ちゅうどくしゃ} 【形】 ホップの豊かな

おい、ジャンキーかよ。。。

くそぉ、勘違いすんなよ!おれは麻薬中毒者じゃないぜ!
草なぎ剛に心から同情する、ただのアル中さまだぜ!!


というわけで、万年二日酔い状態ですが、興味のある方は使ってみて下さい。

一緒に飲みながら開発してくれるアル中プログラマー、絶賛募集中です。