Jul 29, 2005

Ajaxを使ったシンプルなチャット

を作ってみました。
http://la.ma.la/misc/ajaxchat/

サーバーサイドのソースは5行です。
http://la.ma.la/misc/ajaxchat/write.txt

CGIを使うのは書き込みの時だけで、表示はXMLHttpRequestを使ってログファイルを直接読み込みます。更新は差分取得で転送量とサーバー負荷を減らしています。

IEとFirefoxでしか動きません。
Operaはリクエストヘッダのセットが使えないので無理。

仕組み
-HEADリクエストでログファイルのサイズを取得
-ファイル末尾1KBを取得
-レスポンスヘッダから最終更新日と現在のファイルサイズを保存
-If-Modified-SinceとRangeヘッダをセットして定期リロード

とりあえずこれだけです。参加者表示も何もつけてませんが、改造の雛形にでもどうぞ。

Range付きのリクエストは昔試したときに、ヘッダをセットしても全部取得しちゃったりと、どうにもうまくいかなかった記憶があって試してなかったのだけど、なんかうまくいくようになってる様子。
こういうのを使えば負荷を極限まで減らせるわけで、カリカリにチューニングされたデータベースと、単純な追記式のログファイルだと、どちらが負荷が少ないのか気になるところ。

DATA[count++]={name:"名前",comment:"コメント1"}
DATA[count++]={name:"名前",comment:"コメント2",mail:"メール"}
DATA[count++]={name:"名前",comment:"コメント3"}

こんな感じにすれば、追記式で柔軟なデータ構造も保存できるんじゃないか、と考えていて、これだとJSONというかJavaScriptのコードって感じだけど。

----

Rangeリクエストを試したきっかけは、これなんだけど
http://ajaxdb.jp/

これ自体は微妙というかなんというか、Rangeリクエストはブラウザのキャッシュが利かないので、データベースとして使うならあらかじめファイルを分割しておくのが普通だと思う。

例えばこれ。
http://www.oldriver.org/jsmigemo/

pure JavaScriptによるmigemoで、あらかじめ分割しておいた辞書を動的にロードすることで実現しています。やればできるものだなあ、と関心。

----
追記

Operaは8.01からsetRequestHeaderが定義されていますが、実際に送信するヘッダに反映されないようです。8.02でも同上。8.02はなにやらPOSTメソッドの場合には反映される様子。

IEやFirefoxだと、自分で定義したヘッダを追加したり、HTTPで定義されてないメソッド使ったり、基本的に何でも出来るのですがRefererやAccpect-Encodingなんかは書き換えられなかったと思う。(あんま検証してない)
Posted at 09:19 | WriteBacks (49) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.