2005年09月18日

Ajaxの応用?

うちのサイトのチャットをちょこっと改造してみました。
とはいうものの、チャット自体はレンタルのJavaアプレットなので、あのプログラム自体は俺が直接手を入れることはできません。

そこで、あのチャットの置いてあるhtmlファイルの方に細工したわけです。
詳しくはソースを見てしまえばわかりますが、あのファイルを読み込むとonloadイベントでXMLHttpRequestを使用して、うちのサーバ上のCGIを呼び出します。
CGIは単純に、呼び出された時間とIPアドレスをファイルに記録します。そのときファイル中に記録されたレコードの中で、一定時間(今のところ130秒)を過ぎたレコードがあれば削除されます。
また、onloadイベントのイベントハンドラではsetTimeoutを使って一定時間(今のところこっちは120秒)ごとに同じCGIを呼び出します。

ウェブチャットなんかでよくある、入室者の管理ですね。
ただ、入退室を検出できるのはアプレットのみなので、入室していないROMのメンバーも同じようにカウントせざるを得ません。それでも、トップページを見ただけで、今チャットを見てる人がいるってことがわかれば、チャットに入ってみようかなって気にもなりやすいでしょ?

JavaScriptが動かない環境とかでは動作しないわけですが、元々この手のプログラムはそんなに精度が高い必要はないので気にする必要はありません。

そして、サイトのトップページではSSIを使って、ファイルに記録されたIPアドレスの中から一定時間(書き込みの時と同じ130秒)を経過していないものの数をカウントして、現在の参加人数としてトップページに表示します。

ついでにonunloadイベントも捕まえて、こっちでもやっぱりXMLHttpRequestを使用します。こっちでは自分のIPアドレスが記録されていれば即座に削除、ということをやって、退室者の処理とします。

まあ、unloadが取れるなら定期的にCGIを呼び出し続ける必要なんてないのでは?とも思うわけですが、手元のFirefoxでは他のページに遷移させる場合はonunloadが動いたものの、ブラウザを閉じる場合には動かないことがあるようでした。

onunloadが動作し損ねると、ずっと参加者がいるまんま、ということになってしまいます。

それではまずいので一定時間を経過した参加者を除外するわけですが、除外するのなら定期的に参加を確認しなければいけません、このあたりの考え方自体は昔からウェブチャットでやっている考え方と一緒ですね、必ず退室ボタンが押されるとは限らないので定期的に入室者を管理しなければならない、という。ウェブチャットの場合はログのリロードがあるのでそこに混ぜ込めば済んでしまいますが。うちのシステムではチャット本体は別のプログラムなので入室者管理専用にプログラムを呼び出さなければならないという。そういう話です。

というわけで、今回初めてXMLHttpReauestを使ってみました。

レスポンスの処理すらしていないので、これをAjaxと呼ぶのは無理があるでしょう。実際にはAjax(Asynchronous JavaScript and XML)といってもXMLを使用しないケースは多いようですが、レスポンスをまったく処理しないというのはさすがに違う気がします。

でも、とりあえずリクエストの送信自体は実に簡単に楽しく作れましたよ。

今回の機能、問題としてはウェブチャットと同じように定期的にリクエストを飛ばさなければいけないのでサーバの負荷が心配になりますが、ウェブチャットのようにログを取得したりしているわけではないので、転送量的には多少マシだと思います。さらには、参加者数を把握するだけなのでそんなに短時間に頻繁にリクエストを飛ばす必要もなく、現在設定した120秒ってのは標準的なウェブチャットのリロード(30秒くらい)の4分の1の頻度ですから、まあマシだとは思います。

とはいえ、ほとんどの場合onunloadで退室を検出できるならば、呼び出しの間隔はもっと長くてもいいかもしれないと、これを書きながら思いました(笑)

んー・・・あとでもうちょっと長くしときます(笑)
posted by Jack at 14:06| Comment(0) | TrackBack(0) | Web系 | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。