2014-03-27 42 views
1

我想通過打開TCP套接字來手動執行一些HTTP,發送請求並讀取/打印響應消息。響應主體的內容打印良好,但主線程永遠不會退出並永遠阻止。爲什麼從套接字流中讀取塊永遠不變?

socket = new Socket(host, port); 
PrintWriter writer = new PrintWriter(socket.getOutputStream()); 
writer.print(request); 
writer.flush(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
reader.lines().forEach(System.out::println); 
// String next_record = null; 
// while ((next_record = reader.readLine()) != null) 
// System.out.println(next_record); 

socket.close(); 
// System.out.println("Finished"); 

我錯過了什麼,我該如何解決?

+0

EP,似乎有什麼東西什麼'Lambdas'不利於;-) – PeterMmm

+0

@PeterMmm沒有,這個問題已經無關lambda表達式,我只是想保持代碼的乾淨和可讀性。 – tarrsalah

+0

不知道:p,這就是我來這裏的原因。 – tarrsalah

回答

1

你確定你正在發送HTTP請求嗎?這對我有用。請注意,「連接:關閉\ r \ n」字符串非常重要,否則在閱讀內容後它也會掛起。

import java.net.Socket; 
import java.io.PrintWriter; 
import java.io.*; 

public class App { 

    public static void main(String[] args) throws Exception { 
     String host = "google.com"; 
     int port = 80; 
     Socket socket = new Socket(host, port); 

     //BufferedWriter writer = new BufferedWriter(
     //  new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); 
     PrintWriter writer = new PrintWriter(socket.getOutputStream()); 
     writer.write("GET/HTTP/1.1\r\n"); 
     writer.write("Connection: Close\r\n"); 
     writer.write("\r\n"); 
     writer.flush(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); 

     // reader.lines().forEach(System.out.println); 
     String line; 
     System.out.println("Reading lines:"); 
     while ((line = reader.readLine()) != null) { 
      System.out.println("* " + line); 
     } 
     System.out.println("DONE READING RESPONSE"); 

     reader.close(); 
     writer.close(); 
     // socket.close(); 

     System.out.println("Finished"); 
    } 

} 
+0

+1完美,謝謝。 – tarrsalah

+0

沒問題,很高興它的工作。 – rainkinz

+0

您正在發送一個HTTP 1.1請求,所以如果服務器選擇,它可以免費發送一個「分塊」響應。參見[RFC 2616第3.6.1節](http://tools.ietf.org/html/rfc2616#section-3.6.1)。根據[RFC 2616 Section 4.4](http://tools.ietf.org/html/rfc2616#section-4.4),HTTP 1.1實現**需要**來支持分塊數據,但此代碼不支持,並且如果實際發送了「分塊」響應,它將會失敗。 [RFC 2616第4.4節](http://tools.ietf.org/html/rfc2616#section-4.4)定義了用於讀取服務器響應的算法。 'readLine()'循環肯定是錯誤的方法。 –

相關問題