안녕하세요
안드로이드에서 이미지파일(jpg)을 Byte배열로 변환해서 자바서버로 보내고
자바서버에서는 Byte배열을 수신하여 원래의 이미지로 저장을 하는 프로그램을 만들었습니다.
자바서버 부분의 소스는 아래와 같은데요
File f = new File("2test9.jpg");
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f));
int i;
byte data[] = new byte[1024];
while((i = is.read(data))!= -1 ) //is는 소캣스트림
{
System.out.println("i의 값 : "+i);
bout.write(data, 0, i);
bout.flush();
System.out.println("버퍼의 남은 크기:" + is.available());
try
{
Thread.sleep(100);
if(is.available()==0)
{
break;
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
System.out.print("파일에 이미지 넣었슴");
bout.close();
==============================================================================
여기서 빨간색 부분을 추가안해주면 이미지의 정상 생성은 되지만 while문의 read 함수에서 무한 대기를 걸리게 됩니다.
그래서 while((i = is.read(data))!= -1 || is.available() !=0 )
으로 변경시키면 스트림의 최대버퍼의 크기보다 더 많은 크기의 바이트 수가 안드로이드에서 송신되기때문에 파일을
다 받지 않은 상태에서 while문을 탈출해버리더군요. (37555 크기의 바이트를 보내게 되면 서버에서 여러번 버퍼의 크기가 0 이 되는걸
확인했습니다. 즉 스트림의 버퍼 크기가 한 5000Byte정도 되는거같더군요 ) 그래서 생각낸 꼼수가 빨간줄인데 보통 저와같은 문제가 발생할 경우
코딩잘하시는 분은 어떻게 처리하시는지요??




단순하게 버퍼를 키워줘서 해결되는 문제가 아니군요..
기본 버퍼는 8192byte 일텐데...is.available()는 항상 0보다 큰값이 나오는게 아닙니다.
빨간색으로 처리된 부분에서 빠져나갈 확율이 다분한데
통상적으로 받아올 데이터의 크기를 알고 data(받아올 버퍼)의 크기를 지정하거나..
충분히 크게 생성을 하는게 좋지 않을까요? 아래 함수로 기본 버퍼의 크기는 키울수 있지만..
available는 남아있는 데이터의 량이 아니라 현재 읽을수 있는 데이터의 량을 나타내는 것 같습니다(?)
public BufferedOutputStream (OutputStream out, int size)