非常に簡単なwebサーバーです。
変数httpPortはHTTPのデフォールトのポート番号で80番になります。webLogはこのページへのアクセス情報を保存するためのファイル名、webRootはホームページのあるディレクトリ名、webIndexはホームページのファイル名。

webサーバーを作る
import java.net.*;
import java.io.*;
import com.dalsemi.tininet.http.*;


public class tiniweb
{
	boolean    webServerEnabled = true;
	Object     lock= new Object();
	HTTPServer httpServer;
	boolean    loggingFailed = false;
	public int    httpPort    = HTTPServer.DEFAULT_HTTP_PORT;
	public String webLog      = "/web.log";
	public String webRoot     = "/www";	 
	public String webIndex    = "index.html";
	boolean  debugOn=true;
	public static void main(String[] args)
	{
		new tiniweb().start();
	}
	
	public void start(){
	
		try
		{
		// httpPort上にHTTPサーバーのインスタンスを作る
			httpServer  = new HTTPServer(httpPort);
		// デフォールトのindexページをオーバーライドする
			httpServer.setIndexPage(webIndex);
		// デフォールトのHTTPルートをオーバーライドする
			httpServer.setHTTPRoot(webRoot);
		// デフォールトのログファイル名をオーバーライドする
			httpServer.setLogFilename(webLog);
		}
		catch(HTTPServerException h)
		{
			System.out.println(h.toString());
		}

		try
		{
		// ログを開始
		// 注意: ログファイルはいつも最後に追加されます
		//       従って管理していないとメモリーを消費します。
			httpServer.setLogging(true);
		}
		catch(HTTPServerException h)
		{
		// ログファイルに問題が起こった
			loggingFailed = true;

			if(debugOn)
			{
				System.out.println(h.toString());
			}
		}

		while(webServerEnabled)
		{
			httpServer.serviceRequests(lock);
			//...
		}
	}
}


HTTPのメソッド
HTTPはWEBサーバーにリクエストを送信する際にメソッドを使用します。メソッドとはサーバーに対する命令みたいなもので、よく使われるのはGETとPOSTです。
メソッド説明
GETURLで指定したリソースを取得します
POST指定したURLにデータを転送します


HTTP POSTメソッドを使用してデータの送信

POSTメソッドを使用してデータをクライアントから送信するわけですが、インターネット上ではどんな場面で使用されているのでしょうか。よく見かけるログインのページなど、フォームにユーザーがデータを入力するページで使用されています。それではさっそく入力フォームから作ってみることにしましょう。
下記がその入力するページを作りますが、その前に同じものを/www/index.htmlとして作っておきます。これが一番始めにアクセスされます。後の問題にありますが、この始めのページはこのプログラムが関与しないので文字化けは起こりません。

FORMタグで示されているACTIONにサーバー側で実行されるクラスを指定しています。このようにTiniがPOSTメソッドでアクセスされた場合、tiniServerクラスのhandlePostメソッドに動作が移ります。入力フォームで入れられたデータはVectorクラスのデータに入ってきますのでこれを解析すれば何をすれば良いかが分かります。また、OutputStreamには解析し、実行した結果のページを作り出力すれば、クライアント側に送信されます。このサンプルプログラムではコマンドのところにcommand、値のところに何か文字を入れて実行ボタンを押すとページの左下にその入れた文字が表示されるようになっています。

POSTメソッドに対応する
import java.io.*;
import java.util.*;
import com.dalsemi.tininet.http.*;
/*
コマンド入力に"command"を入れ、値入力に任意の値を入れると
その値を付け加えて表示する。
*/

public class tiniServer implements PostScript
{
    String indextop = "<html><head><title>TiniWebServer</title></head>"+
        "<body><h1>TiniWebServer</h1><br>"+
        "<FORM METHOD=\"POST\" ENCTYPE=\"application/x-www-form-urlencoded\" ACTION=\"tiniServer\">\r\n"+
        "コマンド: <INPUT TYPE=\"text\" NAME=\"command\"><br>\r\n"+
        "   値: <INPUT TYPE=\"text\" NAME=\"value\"><br>\r\n"+
        "      0<INPUT TYPE=\"submit\" VALUE=\"実行\"><br>\r\n"+
        "</FORM>";
    String indexbottom = "</body></html>";

    public void handlePost( Vector data, OutputStream out, HTTPWorker work ) 
    {
        StringBuffer strBuff = new StringBuffer ();
        PostElement pe;
        strBuff.append(indextop);
        try {
            pe = (PostElement)data.elementAt(0);
            String command = pe.value;
            if(command.equals("command")) {
                pe = (PostElement)data.elementAt(1);
                strBuff.append(pe.value);
            }
            out.write( work.encodeBody( HTTPServer.HTTP_OK, "OK", 
            HTTPServer.MIME_TEXT_HTML, strBuff.length() ) );
            strBuff.append(indexbottom);
            out.write( strBuff.toString().getBytes() );
            out.flush();
        } catch(Exception e){
            System.out.println(e);
        }
    }
}


これにアクセスするためのhtmlファイルは以下のようになります。

index.html
<html>
<head>
<title>TiniWebServer</title>
</head>
<body>
<h1>TiniWebServer</h1>
<br>
<FORM METHOD="POST" ENCTYPE="application/x-www-form-urlencoded" ACTION="tiniServer"><br>
  コマンド: <INPUT TYPE="text" NAME="command"><br>
     値: <INPUT TYPE="text" NAME="value"><br>
       <INPUT TYPE="submit" VALUE="実行"><br>
</FORM>
</body>
</html>



注意:

コンパイルのclasspathオプションに%TINISDK%\bin\modules.jarを加えてください。
BuildDependencyの-pオプションに%TINISDK%\bin\modules.jarを加えてください。
BuildDependencyの最後に
-add HTTPSERVER
のオプションを追加してください。

インターネットエクスプローラでアクセスする場合の注意

XPの場合
http://mytini で接続できます。(mytiniは自分で設定したホスト名)あるいは
http://fe80:… で接続できます。
Vistaの場合
http://[fe80:…] で接続できます。


問題7-3

コマンド、値、実行が文字化けします。これを直しなさい。