簡易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)で無限ループに入れることで複数の接続要求を受け取ります。
マルチスレッドを使用して以下二点を実行します。
- メインスレッドはクライアントからの接続要求を受け続ける。
- 接続要求を受けたら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を表示させてみてください。