2011-11-11 70 views
2

我想在Java中實現一個基本的Web服務器。當我將網絡瀏覽器定向到127.0.0.1:8020/webpage.html時,服務器會收到請求標題,但當它嘗試發回網頁時,它不會顯示在瀏覽器中。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

你嘗試開啓'new PrintWriter(new OutputStreamWriter(out),true)的自動刷新功能嗎? '? – srkavin

+0

剛剛嘗試過。仍然沒有運氣.. – bananamana

回答

5

out.close();之前添加writer.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,因爲它隱藏了IOExceptions(通常避免PrintWriter)。

+0

我做了一些谷歌搜索,發現你應該使用「\ r \ n」的回車換行,但仍然沒有喜悅.. – bananamana