2011-11-11 65 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