2016-09-11 6 views
-1

Java에서 SocketBufferedReader 클래스 만 사용하여 HTTP 요청을 읽으려고합니다. 문제는 요청의 본문 부분에 도달 할 수 없다는 것입니다. 버퍼링 된 리더는 나에게 요청 라인과 헤더만을 제공합니다. 여기Java 소켓이 http 요청 본문을 수신하지 않습니다.

bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     String comando = ""; 
     while((msgDoSocket = bufferedReader.readLine()) != null){ 
      //telaOutput.adicionaFim(msgDoSocket); 
      try { 
       comando += msgDoSocket + " "; 
       //System.out.println(comando); 
       if(msgDoSocket.isEmpty()){ 
        processaInput(comando); 
       } 
      } catch (Exception ex) { 
       Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 


는 POST 본체가 전송되는 것을 나타내는 WireShark로 캡처이다 : 여기서 코드의 일부분이다. 내 프로그램은 포트 15000에서 실행되며 데이터는 단지 "teste12345"문자열입니다. 요청을 보내기 위해 Google 크롬의 POSTMAN 앱을 사용하고 있습니다.

enter image description here

나는 정확히 this 스레드에서 설명한 것과 같은 문제에 봉착하지만 해결책이 작동하지 않았다 제안했다. 요청은 여전히 ​​마지막 헤더까지 올라가며 더 이상 발생하지 않습니다. 미리 감사드립니다.

편집 : 문제가 해결되었습니다. 바이너리가 가능 요청의 body 부분에 도달하기 위해 만든로 읽기

reader = new DataInputStream(socket.getInputStream()); 


String comando = ""; 
while((dt = reader.readByte()) >= 0){ 
    comando += dt; 
    //... do the rest of the stuff 
} 

: 대답에 제안 된 제안에 따라, 나는에 읽기를 변경했습니다.

+1

문제는 RFC 2616을 읽지 않은 것입니다. HTTP 요청의 본문은 줄로 구성 될 필요가 없으며 기본적으로 스트림의 끝으로 종료되지 않습니다. – EJP

+2

DataInputStream는 적절한 해결책이 아닙니다. 평범한 BufferedInputStream을 원한다. – bmargulies

+1

문제가 해결되지 않았습니다. 여전히'Content-length'를 구현하지 않았고 해결책이 불완전합니다. .'DataInputStream'은 부적절 할뿐만 아니라 불필요하며, 코딩 한'readByte()'루프가 올바르지 않습니다. 입력의 임의의 지점에서 멈 춥니 다. 이 메소드는 스트림의 마지막에 -1을 리턴하지 않습니다. – EJP

답변

3

나는 자바 전문가가 아니지만, readLine\r\n 시퀀스를 발견했을 때만 결과가 반환됩니다. 몸이 \r\n으로 끝나지 않으므로 readLine 메서드는 반환되지 않습니다. 해당 문자 시퀀스를 본문에 수동으로 추가하여 어떤 일이 발생하는지 확인하거나 또는 InputStreamReader 바이트를 사용하여 본문을 바이트 배열로 읽습니다.

결코 적은 것으로, http 몸체가 실제로 문자열이 될 것으로 기대할 수 없습니다. \r\n에 대해 아무것도 모르는 이진 시퀀스 일 수도 있습니다.

+1

정확히 말하면'readLine()'은 표준 라인 종단을 인식합니다. – EJP

관련 문제