2014-09-27 7 views
0

서버를 HTTP로 가져 와서 데이터를 읽고 동일한 소켓 연결을 통해 HTTP GET 또는 POST를 다시 수행하려고합니다. 그러나 나는 두 번째 request.What에 대한 응답은 다음 코드로 잘못 될 수 있습니다 얻을 수 없습니다입니다 :소켓 연결을 통한 다중 HTTP 요청

   Socket s = new Socket(InetAddress.getByName("xyz.abc.asd"), 80); 

      InputStream is=s.getInputStream(); 
      OutputStream os=s.getOutputStream(); 

      PrintWriter pwGET = new PrintWriter(os); 

      pwGET.println("GET /login/ HTTP/1.1"); 
      pwGET.println("Host: xyz.abc.asd"); 
      pwGET.println("Connection: keep-alive"); 
      pwGET.println(""); 
      pwGET.flush(); 

      BufferedReader brGET = new BufferedReader(new InputStreamReader(is)); 


      String t=null; 

      while((t = brGET.readLine()) != null) { 
        System.out.println(t); 


      } 

      pwGET.println("GET /login/ HTTP/1.1"); 
      pwGET.println("Host: xyz.abc.asd"); 
      pwGET.println("Connection: keep-alive"); 
      pwGET.println(""); 
      pwGET.flush(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 


      t=null; 

      while((t = br.readLine()) != null) { 
        System.out.println(t); 


      } 
+0

두 번째 요청을하기 위해 반복하는 동안 루프를 종료했음을 확인할 수 있습니까? – Geremy

+0

예. 첫 번째 요청의 응답을 읽고 성공적으로 인쇄 할 수 있습니다. while 루프를 종료하고 단어 뒤에 일부 인쇄를 실행하십시오. 그러나 나는 두 번째 요청을 읽거나 얻을 수 없다. – WillMcavoy

답변

2

주요 오류가 올바르게 응답을 구문 분석하지 않는 것이있다. 응답은 HTTP 헤더 뒤에 본문이옵니다 (어쩌면). 본문을 가져 오려면 응답 헤더, 특히 코드 (일부 코드에는 본문이 없음), 전송 인코딩 및 내용 길이를 구문 분석하고 이해해야합니다. 그런 다음 Connection 헤더도 살펴 봐야합니다. 그 다음에 만 본문의 길이를 알 수 있으며 추가 연결이이 연결에서 허용되는지 여부를 알 수 있습니다.

println과 마찬가지로 \ n \ n뿐만 아니라 \ r \ n으로 구분해야합니다.

요약 : 당신이 정말로 자신의 연구에 필요한 문서 (RFC2616 또는 최신 RFC7230..RFC7235)를 구현하려는 경우. 원하지 않는 경우 기존 HTTP 라이브러리를 사용하십시오.

+0

구체적으로 [RFC 2616 섹션 4.4] (http://tools.ietf.org/html/rfc2616#section-4.4) 또는 [RFC 7230 섹션 3.3.3] (http://tools.ietf.org/html /rfc7230#section-3.3.3). 둘 다 메시지 본문의 길이를 결정하는 방법을 설명합니다. –