2011-10-20 44 views
2

我有一个简单的HTML服务器程序,它在端口8000上侦听请求。我希望能够从服务器程序请求HTML文件,并将请求的HTML发送回浏览器。目前,服务器接收到请求并从请求中解析请求的文件名,并且甚至将html文件的内容打印到控制台。但是,当我尝试将HTML文件内容打印到连接的套接字(返回到浏览器)时,什么都不会发生;浏览器只是继续加载。将服务器响应写入浏览器:Java

我的服务器类比较简单,只是创建这个运行的类,RequestHandler的情况下,为每个连接:

package server; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 

public class RequestHandler extends Thread { 

    Object block; 
    ServerSocket serverSocket; 
    BufferedReader socketReader; 
    PrintWriter socketWriter; 

    public RequestHandler(Object block, ServerSocket serverSocket){ 
     this.block = block; 
     this.serverSocket = serverSocket; 
    } 

    @Override 
    public void run() { 
     try{ 
      System.out.println("Waiting for request..."); 
      Socket clientSocket = serverSocket.accept(); 
      System.out.println("Connection made."); 

      synchronized(block){ 
       System.out.print("Notifying server thread..."); 
       block.notify(); 
       System.out.println("...done"); 
       System.out.println(); 
      } 

      socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));    
      socketWriter = new PrintWriter(clientSocket.getOutputStream(), true); 

      String input; 
      while((input = socketReader.readLine()) != null){ 
//    System.out.println(input); 

       if(input.startsWith("GET")){ 
        getResource(input); 
       } 
      } 
     }catch(IOException e){ 
      System.out.println("IOException!"); 
      e.printStackTrace(); 
     } 
    } 

    public void getResource(String getRequest){ 
     String[] parts = getRequest.split("\\s+"); 
     String filename = parts[1].substring(1); 

     System.out.println(filename); 
     File resource = new File(filename);    
     sendResponse(resource); 
    } 

    public void sendResponse(File resource){ 
     System.out.println(resource.getAbsolutePath()); 

     Scanner fileReader; 
     try { 
      fileReader = new Scanner(resource); 

      while(fileReader.hasNext()){ 
       String line = fileReader.nextLine(); 
       System.out.println(line); 
       socketWriter.println(line); 
      } 
     } catch (FileNotFoundException e) { 
      System.out.println("File not found!"); 
      e.printStackTrace(); 
     } 
    } 

} 
+1

你尝试提供HTTP头吗?这可能有帮助... – alf

+0

HTTP规范:http://www.w3.org/Protocols/rfc2616/rfc2616.html –

+0

你是如何通过浏览器拨打电话的?什么是URI的格式? –

回答

3

当你完成写入或从流中读取你应该总是做? (我知道你的问题的答案,但我问这个问题,因为你把你的问题标记为“作业”)

+0

如果他希望呈现HTML并且不仅仅以文本形式打印,他还应该在内容之前写入内容。阅读RFC或课本可能会有所帮助。 –

+0

已经关闭了,谢谢你提到我以前曾经想过,但是我认为如果我关闭了这个流,我不能因为某些原因继续听更多的请求。 @AlexGitelman是指“HTTP/1.1 200 OK”状态行吗? –

+0

@AlexGitelman如果您希望浏览器将响应呈现为HTML网页(而不是将HTML代码显示为纯文本),那么您必须为HTTP响应添加一个标头:'Content-type:text/html' – Michael