Newer
Older
myNWP2 / src / j3 / Phttpd.java
@Motoki Miura Motoki Miura on 22 Sep 2020 2 KB first commit for NWP exp
package j3;
// いんちきHTTPサーバPhttpd.java (pseudo-HTTP-Daemon) pseudoの発音はスード
// このプログラムはポート番号8000番で動作するサーバです
// 使い方: java j3.Phttpd ファイル名
// WWWクライアントからの接続に対して、引数で指定したファイルを返します。

// ライブラリの利用
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

// Phttpdクラス
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];

	// その他
	boolean cont = true ;
	int i ;

	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.exit(1) ; // 異常終了は1 
	}
    }
}