2016-09-13 3 views
0

나는 자바에서 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 요청을 보내고 있습니다.

+0

아마도 스트림에서 데이터를 기다리고있는 reader.read()에 매달려있을 것입니다. 스트림에 쓰는 코드를 볼 수 있습니까? –

+0

코드가 없습니다. Google 크롬 (https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop) – Fabiotk

답변

3

'end of stream'과 'end of stream'이 합쳐져 있습니다.

소켓의 '스트림 끝'은 피어가 연결을 종료했음을 의미합니다. 스트림의 끝이없고 피어가 닫히지 않습니다. 이 소켓에 응답을 다시 작성하려는 경우 먼저 스트림의 끝으로 읽으려고 시도하는 것은 올바르지 않습니다.

단일 요청을 읽으려고 할 때 응용 프로그램 프로토콜에 무엇이 필요한지 알려줄 수있는 무언가가 필요합니다. 길이 단어 접두사. XML과 같은 자체 기술 프로토콜; STX/ETX; 타입 - 길이 - 값; ...

이 경우 프로토콜이 HTTP 인 경우 Content-Length 헤더를 구현해야합니다.이를 인식하고 헤더 끝까지 읽은 다음 스트림에서 정확히 많은 바이트를 읽습니다. DataInputStream.readFully().

+0

의 우편 배달부를 사용하고 있습니다. 또한 청크 분할 전송 인코딩을 처리해야 할 수도 있습니다. – EJP

관련 문제