簡易Webサーバーを実装してみた。

長いお休みをしました。
というよりやらないといけないことが多くて
なかなかアップできませんでした。

実はdamePGは東京で某社の新人研修サブ講師をしています。
初の東京と講師で胸を躍らせていたのですが、はっきりいって
最近の子はレベルが高すぎます。
Javaをはじめて2週間でWebサーバを実装していました。
2週間ですよ。
さすがに驚きました。
dame講師もがんばらねばと思います。

では今日はWebサーバを実装したいと思います。
では吟じます。
まずはクライアントからの接続要求を待つクラスです。

package webServer;

import java.net.ServerSocket;
import java.net.Socket;

public class DamePgServer {

	public static void main(String[] args) {
		final int PORT = 5555;
		
		try {
			ServerSocket server = new ServerSocket(PORT);
			System.out.println("damePGのWebサーバーを起動しました!!");
			while (true) {
				//クライアントからの要求を待ちます。接続要求を待ちます。
				Socket socket = server.accept();
				DameThread t = new DameThread(socket);
				t.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("エラーが起きたのでサーバを停止します。");
		}
	}
}

while(true)で無限ループに入れることで複数の接続要求を受け取ります。
マルチスレッドを使用して以下二点を実行します。

  1. メインスレッドはクライアントからの接続要求を受け続ける。
  2. 接続要求を受けたらindex.jspをブラウザに表示する

ではindex.jspをブラウザに表示するクラスを作成します。

package webServer;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class DameThread extends Thread {

	/** クライアントの接続要求*/
	private Socket client;
	/** localホストで接続した際に表示するファイルまでのパス*/
	private static final String INDEX_FILE_ROOT
		= "C:/・・・・";
	
	public DameThread(Socket client) {
		this.client = client;
	}

	@Override
	public void run() {
		// クライアントIPの取得
		String clientIp = client.getInetAddress().toString();
		// クライアントPortの取得
		int clientPort = client.getPort();
		System.out.println("IP " + clientIp);
		System.out.println("PORT " + clientPort);
		
		try {
			PrintStream outStream = new PrintStream(client.getOutputStream());
			BufferedReader clientInfo = new BufferedReader(new InputStreamReader(
					client.getInputStream()));

			//クライアント情報を表示します。
			while (clientInfo.ready()) {
				String infomation = clientInfo.readLine();
				System.out.println(infomation);
			}
			
			String responseFile = INDEX_FILE_ROOT + "Hello.jsp";
			File file = new File(responseFile);
			System.out.println("Request " + file.getName());

			sendFile(outStream, file);
			outStream.flush();
			outStream.close();
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("エラーが発生しました。");
		}
	}

	private void sendFile(PrintStream outStream, File file) {
		try {
			DataInputStream in = new DataInputStream(new FileInputStream(file));
			int length = (int)file.length();
			byte buf[] = new byte[length];
			
			in.readFully(buf);
			outStream.write(buf, 0, length);
			outStream.flush();
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
}

メインメソッド一行目にポート番号を指定しています。
今回は5555です。
DamePgServerクラスを実行し「http://localhost:5555/」でアクセスします。
すると・・・・・

あると思います!!
Hello.jspが表示されます。

自分が作ったHTMLを表示させてみてください。