[Up] [Next] [Previous]

ダイナミックドキュメント機能

ダイナミックドキュメント機能は、主として株価情報や天気情報など時間と ともに刻々と変わるページやアニメーションを作る際に用いられる機能です。

Netscape 1.1 以降では、異なる二つのダイナミックドキュメント機能をサポー トしています。これらのメカニズムは『クライアントポップ』と『サーバプッ シュ』と呼ばれ、HTML3.0 の META タグやMIMEを利用しています。

クライアントプル
HTTP応答またはドキュメントヘッダにダイナミックドキュメントのた めの要求(例えば、5秒おきにデータを再ロードする等)を加えたディレ クティブを含めることによって、サーバはクライアントにデータを送 ります。
サーバプッシュ
サーバが好きな時にデータを送り、ブラウザがそのデータを表示しま す。ただし、接続はされたまま行なわれます。
クライアントプルでは、要求がある度にHTTP接続されることになり、サーバプッ シュはHTTP接続を保持したままあるという点に特長があります。これはサーバ 側でデータを送る時間や回数を指定したり、クライアント側から接続を切る要 求がない限り続けられることになります。

クライアントプル

クライアントプルでは、METAタグを拡張して実現しています。例え ば、次の例では "doc1.html" という文書が毎秒再ロードされる例です。

<META HTTP-EQUIV="Refresh" CONTENT=1>
<title>Document ONE</title>

<h1>これは書類ONEです</h1>

ここにテキストがあります。<p>

このMETAタグは以下のように指定します。

<META HTTP-EQUIV="Refresh" CONTENT=n>

<META HTTP-EQUIV="Refresh" CONTENT="n ; URL=http://server/file">

HTTP-EQUIV
HTTPで送るディレクティブ。ここで"Refresh"は再ロードをし なさいというの意味です。
CONTENT
HTTPで送られるメタ情報。ここでは再ロードの間隔(秒)を表します。
URL
書類を再ロードする際に別のURLにリンクできます。但し、URLは自ホ スト内の書類でも必ずホスト名を含んだフルURLで記述しなければなり ません (例えば http://server/file)。

クライアントプルの例

次な用法が考えられます。
  1. 再ロードの行き先を別々の URL 書類を指す事によって、 doc1.htmldoc2.html 〜 ... 〜 docn.html と自動的に書類を移動させる。
  2. CGIスクリプトを使って、ランダムに行き先 URLを指定してネットサー フィンを行う。
  3. 注意書きを最初の数秒間表示させる。
  4. cron の実行により、再ロードファイルを刻々と書き換えていく。
  5. クライアントのエージェント種別を見分ける。
  6. インライン音声:ページを開いた時に開始音を鳴らせます。
    <META HTTP-EQUIV="Refresh" CONTENT="1; URL=http://www.foo.co.jp/sound/open.au">
           
クライアントプルのデモ

サーバプッシュ

サーバプッシュはクライアントが実行するのではなく、サーバ側からデータを 送信し続けます。そのため、HTTP接続はオープンしたままとなり、送るデータ によっては通信の負荷が大きくなり、クライアントとサーバ間は十分な回線容 量を持つ事が望ましい場合があります。

サーバプッシュの仕組みは、"multipart/x-mixed-replace" というMIMEタイプ を使用し、一つの文書に複数の文書を梱包するような形の文書を作ることにあ ります。この複数の文書を作る場合、ループ文を使えば永遠に送り続けること も可能です。そして、サーバ側でデータ送信を止めない限り、データは送り続 けることになってしまいますが、クライアント側で "Stop" ボタンを 押す事によって、いつでも割り込みをかけ中止することができます。

サーバプッシュの文書

下記の書類には、boundaryで決められた "境界文字列" を境界とした 二つのデータブロックに分けることができます。この"境界文字列" を続けることによって、いくつもの送信したいデータブロックを作る事ができ ます。文書の境界は二つのスラッシュを前に付けた "--境界文字列"を使用し、 サーバプッシュ文書の最後は二つのスラッシュで挟んだ "--境界文字列--"で 終ります。

また、ブラウザがデータをバッファ するのを防止するため(ブラウザはデータをバッファリングしてから表示する ため、ある程度データが溜らないと表示してくれません)、サーバプッシュの CGIスクリプトは NPHスクリプト(nph-foo.cgiと、スクリプト のファイル名にnph-を頭に付けておく)で実行させます。そのため、下 記の例では最初にHTTP応答ヘッダ ("HTTP/1.0 200 Okay") を出力し ければなりません。
#!/bin/sh
echo "HTTP/1.0 200"
echo "Content-type: multipart/x-mixed-replace;boundary=境界文字列"
echo ""
echo "--境界文字列"
while true
do
echo "Content-type: text/html"
echo ""
echo "<title>PS</title>>"
echo "<h2>Process on WWW</h2>"
<pre>
ps ax
</pre>
echo "--境界文字列--"
sleep 5
done

サーバプッシュのインラインイメージ

サーバプッシュではインラインイメージ (<IMG SRC>タグ)を 刻々と変更できます。それは、ちょうどアニメーションや紙芝居のようにイン ラインイメージの部分だけ変わっていきます。これは大変面白いものです。 Nick Bicanic氏のスクリプトを 参考に解説します。

  1. アニメーションを実行するスクリプトはバッファをさけるため、 nph-で始まるNPHスクリプトにします。
  2. アニメーション用のスクリプトを作成します。
  3. アニメーション用の画像(GIFファイル)を作成します。
  4. アニメーションをしたいHTMLページでインラインイメージの <IMG>を次のように記述します。
    <IMG SRC="nph-script.cgi?anything.txt">
           
スクリプトの作成方法としての注意点として、
  1. Perl が標準出力(STDOUT)をバッファさせいないために以下の記述を最 初に行います。

    $|=1
           
  2. 次に HTTP_USER_AGENT 環境変数を使って、 Netscape であるかの判断 を行います。
    $browser = $ENV{"HTTP_USER_AGENT"};
    if ($browser =~ /^Mozilla/i) {
           print "Netscape\n";
           &アニメーションルーチン;
    } else {
           print "HTTP/1.0 200 Okay\n";
           print "Content-Type: image/gif\n\n";
           print GIFまたはJPEGイメージ;
    }
           
  3. 次にNPHスクリプトですので、HTTPの応答ヘッダを記述します。
    print "HTTP/1.0 200 Okay\n";
           
  4. アニメーションルーチンで必要なMIMEをヘッダを記述します。
    print "Content-Type: multipart/x-mixed-replace;boundary=境界文字\n\n";
           
    境界文字は任意の文字を指定します。
  5. 境界文字とGIFイメージリストファイルの読み込みを行います。
    print "--境界文字\n";
    open(IMAGEFILES, @ARGV[0]) || die "can not open @ARGV[0]: $!";
           
    この方法によって、nph-script.cgi?list.txtで実行します。 list.txt は、イメージのリストを次のように記述します。
           gif0.gif
           gif1.gif
           :
           gifn.gif
           
  6. 最後にアニメーション部を記述します。
    while (<IMAGEFILES>) {
           chop $_;
           print "Content-Type: image/gif\n\n";
           open (S,$_);
           print (<S>);
           close (S);
           print "\n--境界文字\n";
           }
           close(IMAGEFILES)
           

サーバプッシュのインラインイメージ例

ここでは、16個のGIFイメージ (gif0.gifgif16.gif)を使っ てユーザがストップをかけるまでアニメーションを行います。 アニメーションの実行

#!/usr/bin/perl

# ブラウザ名
$browser = $ENV{"HTTP_USER_AGENT"};

# Perl で標準出力バッファしません。
$|=1;

# ブラウザがNetscape かどうかを判断します。
if ($browser =~ /^Mozilla\/1.[1-9]/i) {
    &animation;
} else {
    print "HTTP/1.0 200 Okay\n";
    print "Content-type: image/gif\n\n";
    open (S, "gif0.gif");
    print (<S>);
    close S;
}

# アニメーションルーチン
sub animation {
    print "HTTP/1.0 200 Okey\n";
    print "Content-type: multipart/x-mixed-replace;boundary=sometex\n\n";

    print "--sometext\n";

    while (1) {
        for ($i=0; $i<17; $i++) {
	    print "Content-type: image/gif\n\n";
	    open (S, "gif$i.gif");
	    print (<S>);
	    close S;
	    print "\n--sometext\n";
        }
    }
}

このNPHスクリプトをインラインイメージの<IMG>タグ部を次 のように設定します。

<IMG SRC="nph-script.cgi">
Netscape 社のサーバプッシュのス クリプト例に、Cによるソースコードがあります。この コードはパブリックドメインです。このコードを使った場合、ブラウザのバッ ファ問題が起こる事があるので、注意が必要です。NPHスクリプトになるよう に改造してみました。

IMAGEMAP と組み合わせる場合

インラインイメージの <IMG SRC>タグ部を以下のように変更 します。
<A HREF="/cgi-bin/imagemap/...><IMG BORDER=0 SRC=/nph-script.cgi" ISMAP></A>
とします。

サーバプッシュの注意点

NCSA httpdの場合、
Content-type: multipart/x-mixed-replace;boundary=境界文字
は解釈できますが、下記のようにboundryの前にスペースを空けると解釈でき ない場合があります。
Content-type: multipart/x-mixed-replace; boundary=境界文字


[Up] [Next] [Previous]