2014-05-18 45 views
0

我正在學習java中的套接字。我創建了一個簡單的tcp客戶端,旨在發送HTTP請求並接收響應。但是在運行客戶端之後,它只是等待而沒有響應。這裏是我的代碼:無法從套接字連接獲得響應

public static void connect(){ 
    try (
     Socket socket = new Socket("localhost", 80); 
     PrintWriter writer 
      = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
     BufferedReader reader 
      = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    ) { 
     socket.setSoTimeout(60000); 
     String request = "GET/HTTP/1.1\r\n" + 
      "Host: localhost\r\n" + 
      "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + 
      "Accept-Language: en-US,en;q=0.5\r\n"; 
     writer.write(request); 
     writer.flush(); 
     String line; 
     System.out.println("Response: "); 
     while((line = reader.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
    } 
} 

這裏是輸出:

Response: 
Read timed out 
BUILD SUCCESSFUL (total time: 1 minute 0 seconds) 

注: 我知道我可以在Java中使用更抽象類,如url類等用於這一目的。正如我所說我正在研究套接字。

回答

2

要終止HTTP請求的請求部分,您需要發送兩個換行符,而不僅僅是一個。

String request = "GET/HTTP/1.1\r\n" + 
    "Host: localhost\r\n" + 
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + 
    "Accept-Language: en-US,en;q=0.5\r\n\r\n"; 

注意雙\r\n\r\n在字符串的末尾。

如果您沒有終止請求,那麼另一端的HTTP服務器就會坐在那裏等待您終止請求,並且您的代碼將等待永遠不會到來的答案。

+0

感謝@Erwin您的迴應,但我也試過回車換行順序,沒有任何改變。我認爲我發送請求和閱讀響應的方式可能存在問題。 –

+1

問題正是@Erwin所說的。您是否真的在請求標題末尾嘗試了空白行? – EJP

+0

謝謝@EJP和歐文我忘了那個 –