마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

bufferedInputStream에서 blocking이 되지 않는 이유

0 추천
 byte[] tx = null;
            while((read = br.read(tx = new byte[br.available()])) != -1){
                pw.write("ok");
                pw.flush();
            }

 

위에를 보면 br.read()에서 현재 읽을 데이터가 없으면 blocking이 되어야 하지 않나요?

로그 찍어보면 read가 0이 나오면서 무한루프가 되네요...ㅠㅠㅠ

blocking이 되어 데이터를 보냈을때만 실행했다가 연결이 해제되면 finally로 소켓을 닫게 하려는건데

저렇게 하자니 무한루프가 돌고

br.available이 0이상일 때만 while이 돌게 하자니 연결하자마자 while문의 조건이 거짓으로 읽어 finally가 실행이 되네요...

 

방법이 없을까요...

빈길 (1,270 포인트) 님이 2019년 10월 9일 질문

1개의 답변

0 추천
 
채택된 답변

우선 socket이 blocking socket인지 non-blocking socket으로 연결 된건지 부터 확인이 되어야 할 듯 합니다.

blocking socket이면, br.read 에서 사이즈가 될 때까지 대기 하거나 time out 설정한 시간으로 종료 되기 때문에 굳이 available 로 체크할 필요가 없습니다.

non-blocking socket 으로 연결 되어 있다면, 현재 구조로 구현 할 수 밖에 없습니다. 그래서 보통 별도 Thread를 띄워 무한 루프 돌리면서, available 값이 존재할 때  read를 하는 방식으로 구현 됩니다. 

 

익명사용자 님이 2019년 10월 10일 답변
빈길님이 2020년 3월 5일 채택됨
...