2011-08-14 6 views
-1

이 코드를 사용하여 페이스 북 서버에서 내 이미지를 가져옵니다.안드로이드 및 자바를 통한 이진 데이터 소켓

String imageURL = "http://graph.facebook.com/"+id+"/picture?type=large";        
InputStream inputStream = new URL(imageURL).openConnection().getInputStream(); 
DataInputStream dataStream = new DataInputStream(inputStream); 
byte[] dataBuffer = new byte[4096]; 
ByteArrayOutputStream dataHolder = new ByteArrayOutputStream(); 
int n; 

while ((n=dataStream.read(dataBuffer))!=-1){ 
    dataHolder.write(dataBuffer, 0, n); 
} 

내 서버에서 내 이미지를 얻기 위해 같은 방법을 사용하여 :

FileInputStream inputStream = new FileInputSTream("/image.jpg"); 
DataOutputStream dataStream = new DataOutputStream(socket.getOutpustStream()); 
byte[] dataBuffer = new byte[4096]; 
int n; 

while ((n=inpuStream.read(dataBuffer))!=-1){ 
    dataStream.write(dataBuffer, 0, n); 
}//get -1 perfectly 

와 같은 안드로이드 앱을 통해 점점 :

DataInputStream dataStream = new DataInputStream(socket.getInputStream()); 
byte[] dataBuffer = new byte[4096]; 
ByteArrayOutputStream dataHolder = new ByteArrayOutputStream(); 
int n; 

while ((n=dataStream.read(dataBuffer))!=-1){ 
    dataHolder.write(dataBuffer, 0, n); 
}//-1 ?????????????? 

을하지만 안드로이드 앱이 얻을 질수 오른쪽 파일과 그것은 루프, 정확히 -1을 얻을 수 없다는 양식을 나가고 있지만 어제 내가 실수로 -1 내가있어, 내가 이해할 수없는 몇 가지 변화에서 -1있어 내 안드로이드 애플 리케이션에서 -1 얻을 수 없다 그러나 나는 그것을 얻을 수 있습니다 로부터 서버 while 루프

+0

필요한 것은 서버의 이미지입니까? – Ronnie

+0

귀하의 질문은 분명하지 않습니다. Android의 문제는 무엇입니까? 끝없는 반복을 얻거나 마침내 단순히 차단합니까? –

+0

예 오른쪽 이미지이지만 클라이언트가 많은 이미지를 필요로한다면 clent가 다음 이미지를 많이 요청합니다. –

답변

1

바이트를 읽는 대신 입력 스트림을 비트 맵으로 직접 변환 할 수 있습니다. 여기

Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);

+0

자바 1.4에 버그가 있다는 것을 잘 알고 있고 소켓에서 데이터를 말할 때 FIN을 보내지 않는다. 완료 및 전송이 이루어집니다 및 java 1.3 socket.getOutputStream(). close() doent 스트림 넣어 닫지 있지만 두 번째 측면에 FIN 보냅니다 및이 원하는,하지만 해당 Java 소켓 버그 및 수정 !!!! 자바 6까지 –

0

은 그냥 glassball 추측이다 : 당신은 서버 측에서 스트림을 닫나요?

작성 루프를 마치면 dataStream.close();을 입력하십시오.

+0

하지만 내가 닫으면 모든 소켓은 닫히고 자바 1.4-6에 나쁜 버릇이 있습니다. 내 의견을 여기에 봐주세요 : \ n 나는 자바 1.4에 버그가 있다는 것을 잘 알고있다. 그리고 그 소켓에서 데이터 r과 전송이 완료되었다고 자바 1.3 소켓에서 말하기 위해 FIN을 보낸다. close() doent는 put stream을 닫지 만 FIN을 두 번째 측면으로 보냅니다. 이것이 내가 원하는 것이지만 java 소켓과 아무런 버그가없는 버그 !!!! till java 6 –

+0

죄송합니다, 아직 당신의 문제를 이해하지 못했습니다. 스트림을 닫지 않으면 이미지가 완성되었다는 것을 리시버가 어떻게 알 수 있습니까? –

+0

look firend, 당신은 스트림이 Java에서 바이트를 읽는 동안 바이트 수가 -1이되면 (Java 스트림은 docs로 읽음) 스트림을 잘 알고 있지만 소켓을 통해 네트워크를 통해이 스트림을 시도합니다. 보낸 사람 스트림이 끝났음을 의미합니다. 또한 소켓 스트림을 사용하는 스트림을 닫는 것은 모든 소켓을 닫습니다. 따라서 나쁜 습관으로 스트림을 닫을 수 있으며 유일한 해결책은 읽는 바이트를 -1로 읽음과 끝 루프를 끝내는 것입니다. –

관련 문제