2011-11-11 18 views
2

私はJavaで基本的なWebサーバーを実装しようとしています。 Webブラウザを127.0.0.1:8020/webpage.htmlに誘導すると、サーバーは要求ヘッダーを受信しますが、Webページを送信しようとするとブラウザに表示されません。PrintwriterがoutputStreamに書き込まない

誰でも手助けできますか?

public class WebServer 
{ 
    public static void main(String[] args) 
    { 

     try 
     { 
      ExecutorService scheduler = Executors.newCachedThreadPool(); 
      ServerSocket server = new ServerSocket(8020); 
      while (true) 
      { 
       Socket client = server.accept(); 
       Runnable r = new HTTPThread(client.getInputStream(), client.getOutputStream()); 
       scheduler.execute(r);  
       System.out.println("LOG: New Thread Created"); 
      } 
     } 
     catch (IOException e) 
     { 
      System.out.println("ERROR: Cannot listen on socket"); 
      e.printStackTrace(); 
     } 
    } 
} 


public class HTTPThread implements Runnable { 
    InputStream in; 
    OutputStream out; 

    private String fileName; 
    private String fileLoc; 
    private static final String rootLoc = "C:\\Users\\myName\\workspace\\HTTPServer\\src\\"; 

    HTTPThread(InputStream in, OutputStream out) { 
     this.in = in; 
     this.out = out; 
    } 

    public void run() { 
     try { 

      // show request headers and store http header 
      System.out.println("LOG: Preparing to read request"); 
      String header = readInput(in); 
      System.out.println("LOG: Request read successfully!"); 
      System.out.println(header); 


      // get file name from request header 
      fileLoc = rootLoc + header.substring(5, header.indexOf("H") - 1); 
      System.out.println(fileLoc); 


      PrintWriter writer = new PrintWriter(new OutputStreamWriter(out)); 

      //send response header and body 
      writer.print("HTTP/1.0 200 OK\nContent-Type: text/html\n\n" + fileReader(fileLoc)); 
      System.out.println("LOG: Response Sent"); 

      out.close(); 
      in.close();   
     } 

     catch (IOException e) { 
      System.out.println("ERROR: Could not listen on socket"); 
      System.exit(-1); 
     } 

    } 

    //Returns content of webpage as a string (html) 
    public String fileReader(String file) { 

     StringBuilder text = new StringBuilder(); 
     String NL = System.getProperty("line.separator"); 
     Scanner scanner; 
     try { 
      scanner = new Scanner(new FileInputStream(file)); 
      while (scanner.hasNextLine()) { 
       text.append(scanner.nextLine() + NL); 
      } 

      return text.toString(); 
     } catch (FileNotFoundException e) { 
      System.out.println("ERROR: File Not Found"); 
      System.exit(-1); 
      return null; 
     } 
    } 

    //Reads bytestream from client and returns a string 
    private String readInput(InputStream is) { 

     BufferedReader in = new BufferedReader(new InputStreamReader(is)); 
     try 
     { 
      String current; 
      String header = ""; 
      while (!(current = in.readLine()).isEmpty()) 
      { 
       header += current + System.getProperty("line.separator");  
      } 

      return header; 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 
+0

新しいPrintWriter(新しいOutputStreamWriter(out)、true)の自動フラッシュをオンにしてみましたか? '? – srkavin

+0

ちょうど試しました。まだ運がありません.. – bananamana

答えて

5

writer.close();out.close();の前に追加すると修正されます。

+1

[java.io.Writer.close()](http: /download.oracle.com/javase/1.4.2/docs/api/java/io/Writer.html#flush())は、ストリームを閉じる前に内容をフラッシュします。だから、 'writer.flush()'だけでもうまくいきましたが、ここでは、閉じられた出力ストリームにパイプされた作家を開いたままにしています。 – srkavin

+0

ああ、私は参照してください。ありがとう。 – bananamana

1

http応答は非常に特殊な形式です。プロトコルは、どの文字がヘッダーとコンテンツを分けるかを非常に限定しています。あなたは間違った文字を持っています。

を注意してください。ネットワークストリームの上にPrintWriterを使用しないでください。通常、PrintWriterはIOExceptionを隠すため、使用しないでください。

+0

私はいくつかのグーグルを行い、キャリッジリターンラインフィードに "\ r \ n"を使用する必要があるが、喜んではいけないことを発見しました。 – bananamana

関連する問題