Java에서 Socket
및 BufferedReader
클래스 만 사용하여 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 앱을 사용하고 있습니다.
나는 정확히 this 스레드에서 설명한 것과 같은 문제에 봉착하지만 해결책이 작동하지 않았다 제안했다. 요청은 여전히 마지막 헤더까지 올라가며 더 이상 발생하지 않습니다. 미리 감사드립니다.
편집 : 문제가 해결되었습니다. 바이너리가 가능 요청의 body
부분에 도달하기 위해 만든로 읽기
reader = new DataInputStream(socket.getInputStream());
String comando = "";
while((dt = reader.readByte()) >= 0){
comando += dt;
//... do the rest of the stuff
}
: 대답에 제안 된 제안에 따라, 나는에 읽기를 변경했습니다.
문제는 RFC 2616을 읽지 않은 것입니다. HTTP 요청의 본문은 줄로 구성 될 필요가 없으며 기본적으로 스트림의 끝으로 종료되지 않습니다. – EJP
DataInputStream는 적절한 해결책이 아닙니다. 평범한 BufferedInputStream을 원한다. – bmargulies
문제가 해결되지 않았습니다. 여전히'Content-length'를 구현하지 않았고 해결책이 불완전합니다. .'DataInputStream'은 부적절 할뿐만 아니라 불필요하며, 코딩 한'readByte()'루프가 올바르지 않습니다. 입력의 임의의 지점에서 멈 춥니 다. 이 메소드는 스트림의 마지막에 -1을 리턴하지 않습니다. – EJP