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

네트워크 사용시 버퍼에 들어오는 바이트 양을 꽉 채울 수 있나요?

0 추천
네트워크 사용시 버퍼의 크기를 고정시켜 선언해 두어도 데이터는 꽉차서 들어오지 않는 경우가 많습니다.

예를 들어 버퍼를 4096으로 선언했어도 네트워크를 사용하면 3890, 4090 이런 식으로 들어옵니다.

다운로드시 바이트 배열을 가지고 암호화 작업을 하기 때문에 만들어진 파일로 복호화를 할 경우 제대로 복호화가 되지 않습니다.

네트워크 사용시 버퍼에 들어오는 바이트의 양을 항상 꽉 채우는 방법이 없을까요?
준버기 (1,160 포인트) 님이 2018년 7월 11일 질문

2개의 답변

+1 추천
 
채택된 답변
private boolean readFully(InputStream is, byte[] data, int off, int length) {
        int read;
        while (length > 0) {
            read = is.read(data, off, length);
            if(read <=0){
                return false;
            }

            length -= read;
            off += read;
        }
        return true;
    }
익명사용자 님이 2018년 7월 11일 답변
준버기님이 2018년 7월 11일 채택됨
답변 정말 감사합니다. 혹시 각 변수가 무엇을 의미하지는지 설명해주실수 있으신가요?
+1 추천
모든 메시지를 4096 바이트으로 보낸다면, 아래 답변 하신 분처럼 하셔도 됩니다.

보통 통신 프로토콜은 메시지 헤더 + 길이 정보 + 데이터 이렇게 구성하죠. HTTP도 그렇게 되어 있습니다.

헤더를 읽고 길이 정보를 받아서 해당 사이즈가 될 때까지 루프를 돌아서 받고 처리하고,

다음 메시지를 읽고 처리하고 하는 방식입니다.

네트워크를 통하면서 데이터 패킷은 어김없이 쪼개서 들어옵니다.
Will Kim (43,170 포인트) 님이 2018년 7월 11일 답변
혹시 DataInputStream의 readFully 메서드도 같은 역할을 하나요?
프로토콜을 자체적으로 만든다면, 처리하는 로직은 자체적으로 만들어야 합니다.
샘플을 찾아 보고 활용해서 만들어야 할 것 같네요.
지금 당장은 추천할 만한 샘플은 없네요.
강좌를 순차적으로 들으면서 배우셔야 할 듯 싶네요.
...