top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
リクエストヘッダが見たかったので超シンプル&サンプルなhttpd(Webサーバ)を自作しました。
さあて がんばるぞ~。
上司は 当分 会社に来られないことになる予定。
単純に読み上げソフトが欲しい。IBM ViaVoice for Windows Pro USB Version9日本語版(USBマイク付) \17,100 に興味深々。ボーナスが出たら よくよく考えてみます。
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モニターを使用しています。
T.Kawabata
ここからいがぴょんいろいろなソフトがあるものですね。勉強になります。 Apache Axis は SOAP実装ですが、なるほどその開発にTCPヘッダー解析が必要になってくるのですね。