チャットサーバーを自作する


チャットのためのCGIは、頻繁にCGIが動かされるので web serverの負担となり、web serverを共有する他の人に迷惑をかけます。 負荷を軽減させる工夫がそれなりにはありますが、本章では CGIチャットとは抜本的に異なる方法で他人に迷惑をかけない チャットシステムを紹介します。

最近は日本もだいぶネットーワーク環境が整ってきてため、 家庭のパソコンもIPアドレスを持つことができるようになりました。 (例えばケーブルテレビでの常時接続でかかる費用は月5000円程度です。 電話代は一切不要です。) すなわち、家庭のパソコンが世界からのアクセスを受けるサーバーマシンと なるのです。IPアドレスが固定されていないかもしれませんが、 それはその都度サーバー利用者に通知すれば済むことです。 なので web server のhttpd を家庭のパソコンに走らせることもできますし、 チャット用の server も走らせることができます。

本章ではこのようなIPアドレスを持った自分専用のマシンを所有し、 なおかつC言語によるネットワークプログラミングに詳しい人を対象に 本格的なチャットデーモンを作るための基礎プログラムを提供します。 Netscape Navigator 4と Internet Explorer 5で動作確認できました。


● Chatdの概要

ここで解説するチャットシステムは概観や機能は原始的なものですが、 その設計方針はCGIチャットよりも遥かに本格的なものです。
クライアントは普通に web browser とします。 HTML文法が使えて、telnet窓よりも綺麗に表示できるからです。
ページをframeで上下に分けて、上側frameに書き込みFORMを設け、 下側frameにチャットの内容を表示します。つまり普通のチャットの概観です。
Browserの接続対象は 80番ポートに泊まっている httpd ではなくて、 他のポート(この例では1080番ポート)に泊める これから自作する chatd です。

まず browser のURLに http://host:1080/ と指定します。ここで host は もちろんあなたの所有するマシンの Internet host名です。 これでhostのマシンの1080番ポートに泊めている chatd に接続されることになります。 GETの引数が / だけの場合には chatd は以下のような frameset 用のHTML文章を 返します。

HTTP/1.0 200 OK
Content-type: text/html

<FRAMESET ROWS="84,*">
<FRAME SRC=/input>
<FRAME SRC=/content>
</FRAMESET>
この framesetのため browser はさらに http://host:1080/input http://host:1080/content にアクセスします。 GETの引数が /input の場合には chatd は以下のような入力用のHTML文章を 返します。
HTTP/1.0 200 OK
Content-type: text/html

<FORM METHOD=GET ACTION=/submit>
<INPUT TYPE=TEXT   NAME=messege>
<INPUT TYPE=RESET  VALUE=reset >
<INPUT TYPE=SUBMIT VALUE=submit>
</FORM>
GETの引数が /content の場合(つまり下側のframeに対して)は chatd は最初に以下の内容の Javascript とHTMLを送信します。
<BODY>
<SCRIPT LANGUAGE=JavaScript>
<!--
function toBottom(){
  scroll(0,100000);
  setTimeout('toBottom()',1000);
}
toBottom();
// -->
</SCRIPT>

<PRE>
=========================================
   Web-independent smart chat server.    
Originally designed by Naoki Watanabe.   
Last modified on Mar 12th, 2000 by Naoki.
=========================================
</PRE>
この JavaScript は1秒おきにこのframeを最下部にスクロールさせます。 つまり常に最新の行が表示されるように自動的にスクロールさせるのです。 そして誰かの書き込みがあるごとに、その内容を送信します。 なのでこの接続は常時接続となります。書き込みが無い間はbrowserの 流星が降り続けたり地球が周り続けたりしますが、 単にデータを待つだけなのでクライアントマシンに負荷をかけません。

入力用FORMをsubmitとすると GETの引数が /submit?messege=abcdefg のように なります。chatdはこの入力内容を接続中のすべてのbrowserの content用 frameに送信します。


● Chatdのソース

この本格派原始チャットデーモン chatd のソース を 置いておきます。ソースの内容は詳しくは解説しません。 各自解読して、理解できる人だけがこのプログラムを使って実用化してください。


目次

Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp