Feb 28, 2005

JavaScriptで差分リロードなチャット

3年と少し前から作っているチャットのリファクタリングをしています。
http://ma.la/mirrorman/wiki.cgi/%e5%8b%95%e7%9a%84%e3%83%ad%e3%83%bc%e3%83%89
ここに書いてあるチャットのことで、当時はNN4でも動くように、けっこう苦労した覚えがあります。

フレームを使わないスタイルシートでのレイアウトへ変更、
オブジェクト指向化、イベント定義を外部記述へ変更など、大幅に直しています。
ベースの部分は3年前からほとんど変化ありません。
IFRAMEで通信しているので、Ajaxとは違うと思いますが、XMLHTTPを使わなくても昔から動的ロードは出来たよ、ということで。

最近はDHTMLを使ったチャットも多くなっているので、
目新しくはなくなってしまっているかもしれません。
まだ何かと中途半端ですが、とりあえず、動作デモとして設置してみます。
http://chat.ma.la/

普通のチャット、改行を含むテキストの書き込みと保存、それから手書きメッセージの書き込みが可能です。
長文書き込みはタブが残るので、pythonのソースコードが貼れます。
手書きはお絵かきBBSの使い回しです。ボーダーのリサイズでキャンバスを広く出来ます。
IPアドレスは表示されませんが、ログとしては残しています。

サーバーの負荷が高かったり、不具合が見つかったら消すかもしれません。

----
仕組みはログファイルのどこまでを読み込んでいるのかを記録しておき、追加された部分のみを読み込んで追記、という単純なものです。
変更がなかった場合はマイナーですが「HTTP 204 No Content」というレスポンスを返すと、ブラウザは何の処理も行いません。
http://www.studyinghttp.net/status_code#Code204

差分リクエストは、昔XMLHTTPでrange付きリクエストが出来ないかと試行錯誤したことがあるのですが、どうにも無理みたいです。
CGIを使ってログファイルを部分的に切り出してブラウザに送ってやる必要があります。
サーバープッシュとクライアントプルの組み合わせで、ウェブベースでも高レスポンス、低通信量のチャットを作るというのがコンセプトなのですが、
レンタルサーバー上でサーバープッシュをやるとコネクション数を多く使ってしまうので無効にしています。
ブラウザ上で完全リアルタイムに更新するチャットを作るのは、それほど難しいことではありません。

プライベートメッセージ、ローカルファイルのアップロード、httpからファイルのダウンロード
アスキーアートで発言、MSAgentを使った発言読み上げ、mp3ストリーミング、ブラクラ送信機能、
タブまたはMDI表示でマルチルーム同時参加、2ch実況、正規表現での発言フィルタ機能など、
色々あったのですが、かなり意味不明なものになってしまっていたので、いったんばっさりと削りました。

ウェブベースでも、メッセンジャー以上の機能を持った通信手段を作れないものかと考えています。
Posted at 20:48 | WriteBacks (3) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















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