2012-09-12 140 views
3

所以建立我的偵聽連接,接受一個接一個:的Java如何處理建立TCP連接後,HTTP GET請求

ServerSocket serverSock = new ServerSocket(6789); 
Socket sock = serverSock.accept(); 

當我輸入到我的瀏覽器localhost:6789/index.html我該如何處理這個進入GET請求,並返回index.htmlindex.html位於相同的目錄中。

首先,我想非常希望index.html實際上存在,如果沒有,我會返回一個HTTP 404消息。然後,我將關閉連接。

+2

你寫這是一個學習的過程?有許多現成的基於Java的Web服務器可用於處理HTTP請求。 – codebox

+0

@codebox不,我對Java相當陌生。你能告訴我一些符合我需要的東西嗎? – meiryo

回答

9

處理GET和其他請求其實很簡單,但您必須知道HTTP protocol的規格。

要做的第一件事是獲取客戶端的SocketInputStream和文件的路徑返回。 HTTP請求的第一行有這種形式:GET /index.html HTTP/1.1。這裏是做一個代碼示例:

SocketInputStream sis = sock.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(sis)); 
String request = br.readLine(); // Now you get GET index.html HTTP/1.1 
String[] requestParam = request.split(" "); 
String path = requestParam[1]; 

該文件是否存在您創建一個新的File對象和檢查。如果該文件不存在,則返回一個404響應給客戶端。否則,你讀取文件併發送其內容返回給客戶端:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
File file = new File(path); 
if(!file.exist()){ 
    out.write("HTTP 404") // the file does not exists 
} 
FileReader fr = new FileReader(file); 
BufferedReader bfr = new BufferedReader(fr); 
String line; 
while((line = bfr.readLine()) != null){ 
    out.write(line); 
} 

bfr.close(); 
br.close(); 
out.close();  

下面是完整的代碼摘要:

ServerSocket serverSock = new ServerSocket(6789); 
Socket sock = serverSock.accept(); 

InputStream sis = sock.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(sis)); 
String request = br.readLine(); // Now you get GET index.html HTTP/1.1` 
String[] requestParam = request.split(" "); 
String path = requestParam[1]; 

PrintWriter out = new PrintWriter(sock.getOutputStream(), true); 
File file = new File(path); 
if (!file.exists()) { 
    out.write("HTTP 404"); // the file does not exists 
} 
FileReader fr = new FileReader(file); 
BufferedReader bfr = new BufferedReader(fr); 
String line; 
while ((line = bfr.readLine()) != null) { 
    out.write(line); 
} 

bfr.close(); 
br.close(); 
out.close(); 
+0

我在編輯問題。等待我的完整答案 – Dimitri

+0

乾杯Dimitri,你能解釋爲什麼只有在輸入'localhost:6789/index.html'而不是'localhost:6789/blahblah'時爲「index.html」服務?哪一行檢查這個? 編輯:對不起,當我編輯此評論時,我的互聯網連接死亡。 – meiryo

+1

這是因爲blahblah沒有託管在你的服務器上。看到我完整編輯的答案 – Dimitri

2

如果您只是想要一個基於Java的Web服務器來處理HTTP請求,那麼您應該看看Tomcat,它會自動返回靜態文件,並且還允許您定義Java代碼以提供自定義對特定請求的迴應。

您應該閱讀某種Tomcat快速入門指南,並獲得對Java Servlet和JSP的基本瞭解。

另一種可以更容易設置和配置的方法是Jetty,因此您可能也需要查看該選項。