2014-05-18 3 views
0

자바 소켓에 대해 공부하고 있습니다. HTTP 요청을 보내고 응답을 받기위한 간단한 tcp 클라이언트를 만들었습니다. 그러나 클라이언트를 실행 한 후에는 기다리고 응답이 없습니다. 여기소켓 연결에서 응답을 얻을 수 없습니다.

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) 

참고 : 가 나는이 목적을 위해 등 url 클래스처럼 자바에 더 추상화 된 클래스를 사용할 수 있습니다 알고 있습니다. 내가 말했듯이 나는 소켓에 대해 공부하고있다.

답변

2

HTTP 요청의 요청 섹션을 종료하려면 두 개의 개 줄만 보내야합니다. 문자열의 끝에서 이중 \r\n\r\n

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"; 

알 수 있습니다.

요청을 종료하지 않으면 상대방의 HTTP 서버가 요청을 종료 할 때까지 기다리고 코드가 절대로 나오지 않을 응답을 기다립니다.

+0

@Erwin에게 감사드립니다. 그러나 캐리지 리턴 라인 피드 시퀀스도 시도했지만 아무 것도 변경되지 않았습니다. 요청을 보내고 응답을 읽는 방식에 문제가있을 수 있다고 생각합니다. –

+1

문제는 정확히 @Erwin이 말했습니다. 여기에 명시된 요청 헤더의 끝에 빈 줄을 실제로 시도해 보셨습니까? – EJP

+0

감사합니다. @EJP와 Erwin 나는 그것을 잊어 버렸습니다. –

관련 문제