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

안드로이드 TCP 파일 수신 관련

0 추천
class FileReceiver extends Thread{
        Socket socket;
        DataInputStream dis;
        FileOutputStream fos;
        BufferedOutputStream bos;

        public FileReceiver(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {                
                dis = new DataInputStream(socket.getInputStream());
                
                String fName = "sample.jpg";

                // 파일을 생성하고 파일에 대한 출력 스트림 생성
                File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + "temp" + File.separator+fName);
                fos = new FileOutputStream(f);
                bos = new BufferedOutputStream(fos);
                

                // 바이트 데이터를 전송받으면서 기록
                int len=0;
                int size = 8192;
                int cnt=0;
                byte[] data = new byte[size];
                while ((len = dis.read(data)) > -1) {
                    bos.write(data, 0, len);
                    cnt++;
                    Log.e("error",String.valueOf(cnt));                    
                }
                bos.flush();
                bos.close();
                fos.close();
                dis.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

이 코드에서 이상한 부분이 있는데 while문이 돌아가는것을 cnt 변수로 로그로 찍어보니 같은파일인데 일정하지가 않고

while문 밑의 코드가 실행이 안됩니다.

뭐가 잘못된것인가요?

안드잘하고싶 (3,310 포인트) 님이 2016년 4월 22일 질문

2개의 답변

0 추천
read에서 계속 0 반환하면 무한 루프일듯 한데요.. > 0 으로 하셔야 할 듯 합니다.

그리고 read에서 읽는 사이즈는 망이 좋으면 8192씩들어올테니 일정하겠지만. 나쁘거나 데이터가 부족하면 적게 들어올테니 cnt 개수가 일정하지 않을 수 있습니다.
익명사용자 님이 2016년 4월 22일 답변
저거 하고나서 > 0 해봤었는데 그대로에요 ㅠ
근데 중요한게 cnt++가 실행되고 로그에 찍히는게 몇번 하고나면 더이상 안찍히고 밑에 코드도 실행이 안되는데 이건 while문을 돌리다가 에러가 발생한거라고밖에 생각이 안드네요 그런데 그렇다고 로그캣 에서 따로 에러메시지를 뿜는것도 아닌것이 왜그런지 모르겠습니다 ㅠ
0 추천
stream의 read 메소드는 blocking 연산입니다.

데이터가 들어올 때 까지 계속 대기합니다.
익명사용자 님이 2016년 4월 22일 답변
그러면 제가 어떻게 해야할까요? ㅠ
len 값이 0보다 큰 경우가 있는지 확인해보세요.
항상 0이 나오거나 block된다면 데이터를 보내는 쪽에서 뭔가 잘못하고 있다는 뜻입니다.
이미지를 받아서 이미지뷰에 띄우는 코드를 while문안에 넣고
파일을 두번 보내면 그제서야 이미지가 뜨긴 뜹니다.
하지만 거듭할때마다 스트림이 닫히질 않아서 계속 파일 용량은 늘어나고
while문을 벗어나지는 못하네요
C#에서 파일을 보내는데 Socket.sendFile 함수를 보내서 파일을 보냅니다.
이전에 Socket.send로 그냥 글자 보내는건 잘됬었거든요
뭐가 문제일까요....
보내는 쪽에서 socket close는 하셨나요?
tcp를 통해서 서로 통신을 하는중인데 소켓을 닫으면 연결이 끊어지지않나요?
...