나는 자바에서 Socket
을 읽고 입력하려고하고있다. 그리고 함수를 호출하여 그것을 처리하려고한다. 텍스트로 읽는 것은 클라이언트에서 오는 요청으로 인해 몇 가지 오류를주기 때문에 텍스트로 읽지 않고 바이트로 읽어야합니다. 그래서 나는 클래스 BufferedInputStream
을 사용하기로 결정했다. 문제는 요청의 끝이 감지되지 않는다는 것입니다. 나는 스트림 그냥 교수형 또는 뭔가 ...BufferedInputStream을 사용하여 소켓에서 입력 스트림의 끝을 감지하는 방법은 무엇입니까?
documentation에 따르면되고는 read()
기능은 스트림 스트림이 종료 된 경우 또는 -1
에서 읽을 바이트를 반환 종료되지 않기 때문이라고 생각한다. 그래서, 내 코드는 바이트 단위로 읽고 문자열에 조인 한 다음 스트림이 끝나면 문자열을 보내서 처리합니다 (또는 최소한이 작업을 수행해야합니다). 여기에 코드입니다 :
BufferedInputStream reader = new BufferedInputStream(socket.getInputStream());
int dt;
String cmd = "";
while((dt = reader.read()) >= 0){
cmd += (char)dt == '\n' || (char)dt == '\r' ? ' ' : (char)dt; // add each byte read to the string
System.out.println(cmd);
}
processaInput(cmd);
문제는 기능 processaInput
이 프로그램은 루프에 갇혀 경우처럼 호출되고 있지 않습니다 있다는 것입니다. 그러나 스트림이 끝난 후에도 system.out.println이 호출을 멈추기 때문에 루프에 멈추지 않는 것이 더 이상합니다. 그런데 Thread (run() 함수)에서 실행되는 동안이 정보가 엉망이 될 수 있는지 모르겠으므로이 마지막 정보를 여기에 추가했습니다. 어쨌든, 내가 여기서 무엇을 놓치고 있니? 감사.
편집 : Google에서 테스트 한 POSTMAN 앱을 사용 중이기 때문에 클라이언트 측 코드가 없으므로 프로그램에 HTTP 요청을 보내고 있습니다.
아마도 스트림에서 데이터를 기다리고있는 reader.read()에 매달려있을 것입니다. 스트림에 쓰는 코드를 볼 수 있습니까? –
코드가 없습니다. Google 크롬 (https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop) – Fabiotk