2011-10-20 43 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