2014-03-27 5 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 아니, 문제는 람다와는 아무 상관이 없다, 난 그냥 깨끗하고 읽을 수있는 코드를 유지하려고합니다. – tarrsalah

+0

모르겠다 : p, 그래서 내가 여기 왔어. – tarrsalah

답변

1

HTTP 요청을 올바르게 전송하고 있습니까? 이것은 나를 위해 작동합니다. "Connection : Close \ 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 섹션 4.4] (http://tools.ietf.org/html/rfc2616#section-4.4)에 따라 '청크 분할 (chunked)'데이터를 지원하려면 HTTP 1.1 구현이 ** 필요하지만이 코드는 지원하지 않으며 'chunked' 응답이 실제로 전송되면 실패합니다. [RFC 2616 Section 4.4] (http://tools.ietf.org/html/rfc2616#section-4.4)는 서버의 응답을 읽는 데 사용할 알고리즘을 정의했습니다. 'readLine()'루프는 틀린 접근법입니다. –

관련 문제