package j3; // いんちきHTTPサーバPhttpd.java (Pseudo-HTTPD) 発音はスード // このプログラムはポート番号8000番で動作するサーバです // 使い方java Phttp データファイル名 // 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,300) ; while(true){ sock = servsock.accept() ;// 接続要求の受付 // 接続先の表示 System.out.println("Connection 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() ); // とりあえず改行を2つ読み飛ばす for(i = 0; i < 2;++i) System.out.println(in.readLine() ); // ファイルの出力 dostr.write("Content-type: text/plain\n".getBytes()); cont = true ; while(cont){ // ファイルからの読み込みとネットワーク出力 try{ int n = infile.read(buff); System.out.write(buff, 0, n); dostr.write(buff,0,n) ; } catch(Exception e){ cont = false ; } } // 接続終了 sock.close() ; infile.close() ; } }catch(IOException e){ System.exit(1) ; } } }