diff --git a/.project b/.project index da2e28f..1868ab8 100644 --- a/.project +++ b/.project @@ -14,4 +14,15 @@ org.eclipse.jdt.core.javanature + + + 1635165177317 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/src/j3/Phttpd.java b/src/j3/Phttpd.java index 58c1e2a..7ad5360 100644 --- a/src/j3/Phttpd.java +++ b/src/j3/Phttpd.java @@ -1,5 +1,6 @@ package j3; // いんちきHTTPサーバPhttpd.java (pseudo-HTTP-Daemon) pseudoの発音はスード + // このプログラムはポート番号8000番で動作するサーバです // 使い方: java j3.Phttpd ファイル名 // WWWクライアントからの接続に対して、引数で指定したファイルを返します。 @@ -14,78 +15,78 @@ import java.net.Socket; // Phttpdクラス -class Phttpd{ - public static void main(String args[]){ - // サーバソケット - ServerSocket servsock = null ; - Socket sock ; +public class Phttpd { + public static void main(String args[]) { + // サーバソケット + ServerSocket servsock = null; + Socket sock; - // 入出力 - DataOutputStream dostr; - BufferedReader in ; - FileInputStream infile = null; - byte[] buff = new byte[1024]; + // 入出力 + DataOutputStream dostr; + BufferedReader in; + FileInputStream infile = null; + byte[] buff = new byte[1024]; - // その他 - boolean cont = true ; + // その他 + boolean cont = true; - try{ - // サーバ用ソケットの作成(ポート番号8000番) - servsock = new ServerSocket(8000) ; - while(true){ - sock = servsock.accept() ;// 接続要求の受付 - // 接続先の表示 - System.out.println("---\nConnection Requst from: " - + (sock.getInetAddress())) ; - // オブジェクトinfileを作り,ファイルを準備します - try{ - infile = new FileInputStream(args[0]) ; + if (args.length==0) //引数がない場合、以下のファイルを返すことにする + args = new String[] { "j3/index.html" }; + System.out.println("このサーバは"+args[0]+"を返します。"); + try { + // サーバ用ソケットの作成(ポート番号8000番) + servsock = new ServerSocket(8000); + while (true) { + sock = servsock.accept();// 接続要求の受付 + // 接続先の表示 + System.out.println("---\nConnection Requst from: " + (sock.getInetAddress())); + // オブジェクトinfileを作り,ファイルを準備します + try { + infile = new FileInputStream(args[0]); + } catch (Exception e) { + // ファイル準備の失敗 + System.err.println("ファイルがありません"); + System.exit(1); + } + // 読み書き用オブジェクトの生成 + in = new BufferedReader(new InputStreamReader(sock.getInputStream())); + dostr = new DataOutputStream(sock.getOutputStream()); + // read headers + StringBuffer request = new StringBuffer(); + String line; + while ((line = in.readLine()) != null) { + System.out.println(line); + request.append(line + "\r\n"); + if (line.length() < 1) + break; + } + + // Response Headerの出力 + String CRLF = "\r\n"; + String response = "HTTP/1.1 200" + CRLF + "Content-type: text/html; charset=UTF-8" + CRLF + CRLF; + dostr.write(response.getBytes()); + + // Response Bodyの出力 + cont = true; + while (cont) { + // ファイルからの読み込みとネットワーク出力 + try { + int n = infile.read(buff); + dostr.write(buff, 0, n); + } catch (Exception e) { // end of file + cont = false; + } + } + // おまけ:レスポンスヘッダを表示 + dostr.write(request.toString().getBytes()); + + // 接続終了 + sock.close(); + infile.close(); + } + } catch (IOException e) { + System.out.println("異常終了:ポート番号の重複の可能性あり"); + System.exit(1); // 異常終了は1 } - catch(Exception e){ - // ファイル準備の失敗 - System.err.println("ファイルがありません") ; - System.exit(1) ; - } - // 読み書き用オブジェクトの生成 - in = new BufferedReader(new InputStreamReader(sock.getInputStream())); - dostr = new DataOutputStream(sock.getOutputStream() ); - // read headers - StringBuffer request = new StringBuffer(); - String line; - while( (line = in.readLine()) != null ){ - System.out.println(line); - request.append(line+"\r\n"); - if (line.length() < 1) break; - } - - // Response Headerの出力 - String CRLF = "\r\n"; - String response = - "HTTP/1.1 200" + CRLF + - "Content-type: text/html; charset=UTF-8" + CRLF + CRLF; - dostr.write(response.getBytes()); - - // Response Bodyの出力 - cont = true ; - while(cont){ - // ファイルからの読み込みとネットワーク出力 - try{ - int n = infile.read(buff); - dostr.write(buff,0,n) ; - } - catch(Exception e){ //end of file - cont = false ; - } - } - // おまけ:レスポンスヘッダを表示 - dostr.write(request.toString().getBytes()); - - // 接続終了 - sock.close() ; - infile.close() ; - } - }catch(IOException e){ - System.exit(1) ; // 異常終了は1 } - } }