top / index / prev / next / target / source

2002-06-18 diary: HTTPサーバの自作

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

HTTPサーバの自作

リクエストヘッダが見たかったので超シンプル&サンプルなhttpd(Webサーバ)を自作しました。

今日はひたすら執筆する予定です

さあて がんばるぞ~。

上司がおたふく風邪にかかってしまいました

上司は 当分 会社に来られないことになる予定。

読み上げソフト欲しい…

単純に読み上げソフトが欲しい。IBM ViaVoice for Windows Pro USB Version9日本語版(USBマイク付) \17,100 に興味深々。ボーナスが出たら よくよく考えてみます。

超簡単HTTPサーバの自作

Webブラウザが発信するリクエストヘッダが見たかったので、超簡単ウェブサーバを自作しました。たったこれだけの行数で Webサーバとして最低限の動作をします。(ほんとに最低の機能です)ただし、言うまでもないことですが、そもそも論として Webサーバ機能+αを実現したい場合には、Jakarta Tomcatなどのサーバソフトの利用が簡単で便利です。

/**
* TinyHttpd (for Socket Sample)
* Copyright (C) 2002  Tosiki IGA
*/

import java.io.*;
import java.net.*;
import java.util.*;

public class TinyHttpd {
    public static final String SERVER_NAME = "TinyHttpd(0.0.1)";
    public static final String HTTP_VERSION = "HTTP/1.0";

    public static void main(String[] args) {
        new TinyHttpd().process();
    }

    public void process() {
        try {
            System.out.println(SERVER_NAME + ": Copyright (C) 2002 Tosiki IGA");
            ServerSocket server = new ServerSocket(80);
            System.out.println("port: " + server.getLocalPort());
            for (;;) {
                Socket socket = server.accept();
                new TinyHttpdThread(socket).start();
            }
        } catch (Exception ex) {
            System.out.println(ex);
            ex.printStackTrace();
        }
    }
}

class TinyHttpdThread extends Thread {
    private Socket socket;
    private String strCommand = null;
    private String strFileName = null;

    public TinyHttpdThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        System.out.println("begin: " + socket.toString());
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            for (int iLine = 0;;iLine++) {
                String strLine = reader.readLine();
                if (strLine == null
                        || strLine.length() == 0) {
                    break;
                }
                if (iLine == 0) {
                    StringTokenizer token = new StringTokenizer(strLine, " ");
                    if (token.hasMoreTokens()) {
                        strCommand = token.nextToken().toUpperCase();
                    }
                    if (token.hasMoreTokens()) {
                        strFileName = token.nextToken();
                    }
                }
                System.out.println("R:" + strLine);
            }

            if (strCommand.equals("GET")) {
                doGet(writer);
            } else if (strCommand.equals("POST")) {
                doPost(writer);
            } else {
                writeLine(TinyHttpd.HTTP_VERSION + " 501 Not Implemented", writer);
            }

            writer.flush();
            writer.close();
            reader.close();
            socket.close();
        } catch (Exception ex) {
            System.out.println(ex);
            ex.printStackTrace();
        }
        System.out.println("end: " + socket);
    }

    private void writeLine(String strLine, BufferedWriter writer)
    throws IOException {
        writer.write(strLine);
        writer.newLine();
        System.out.println("S:" + strLine);
    }

    protected void doGet(BufferedWriter writer)
    throws IOException {
        if (true) {
            writeLine(TinyHttpd.HTTP_VERSION + " 200 OK", writer);
            writeLine("Server " + TinyHttpd.SERVER_NAME, writer);
            writeLine("Content-type: text/html", writer);
            writeLine("", writer);
        }
        writeLine("<HTML lang=\"ja\">", writer);
        writeLine("<HEAD><TITLE>なんにもなしページ</TITLE></HEAD>", writer);
        writeLine("<BODY bgcolor=\"#eeddcc\"><P>なんにもなしページ。<BR>要求されたファイル名[" + strFileName + "]</P></BODY>", writer);
        writeLine("</HTML>", writer);
    }

    protected void doPost(BufferedWriter writer)
    throws IOException {
        doGet(writer);
    }
}

これを超機能拡張していくと Tomcat みたいなソフトになる可能性はあります。(意味無いので誰もしないと思いますけれどもね)

2002.06.27 読者からツッコミSubject: 超簡単HTTPサーバの自作についていがぴょんさんはじめまして bataです。開発でブラウザーのリクエストヘッダーを調べる時に Apache Axis のTCPモニターを使用しています。

簡易Proxy となるので、お手軽に使えるのですが…日本語対応していないので△です。では。

T.Kawabata

ここからいがぴょんいろいろなソフトがあるものですね。勉強になります。 Apache Axis は SOAP実装ですが、なるほどその開発にTCPヘッダー解析が必要になってくるのですね。

世間のニュースから () 2002


この日記について