2014-02-12 6 views
0

자바 소켓에서 이미지 바이트를 읽는 데 문제가 있습니다. 내 iOS 클라이언트가 여기에 이미지를 보내고 있으며 전체 바이트를 읽고이를 서버 쪽 이미지로 저장해야합니다. iOS 시뮬레이터을 통해 테스트 할 때 매우 잘 작동합니다. 때문에 시뮬레이터에서 테스트하면 46,577 바이트까지 이미지를 보냅니다. 그것은 모두 매우 신속하고 올바르게 읽습니다. "45, 301 바이트"을 전송하는 동일한 코드를 iPhone 기기에서 보내는 코드를 테스트했지만 소켓 코드가 일부 "21, 720 바이트"만 읽을 수 있으므로 이미지의 절반 만 읽을 수 있습니다. (또는) 때로는 "4,000 바이트"의 경우에만 매우 적게 읽습니다.InputStream 읽기 API를 사용하여 모든 바이트를 읽을 수 없습니까?

왜 장치에서 오는 동일한 크기의 데이터를 읽을 수 없는지 이해할 수 없습니까? 누군가 나를 해결할 수 있도록 안내해 주시겠습니까?

InputStream input = socket.getInputStream(); 

      byte[] data = new byte[0]; 
      byte[] buffer = new byte[1024];    

      try { 
       do { 
       bytesRead = input.read(buffer); 
       System.out.println("Reading..bytesRead: " + bytesRead); 

       // construct an array large enough to hold the data we currently have 
       byte[] newData = new byte[data.length + bytesRead]; 
       // copy data that was previously read into newData 
       System.arraycopy(data, 0, newData, 0, data.length); 
       // append new data from buffer into newData 
       System.arraycopy(buffer, 0, newData, data.length, bytesRead); 
       // set data equal to newData in prep for next block of data 
       data = newData; 

       } while (input.available() != 0); 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 

      System.out.println("data: " + data.length); 
+0

while 루프의 종료 조건으로'input.read()! = -1'을 사용하여 한 번에 한 바이트 씩 읽어 들일 수 있습니까? 'InputStream.available()'은 no. 블로킹없이 읽을 수있는 바이트 수. 반드시 스트림이 종료되었음을 나타내는 것은 아닙니다. 뭔가 따라와 : 'while ((next = input.read())! = -1) {byteArrayOutputStream.write (next); } byte [] data = byteArrayOutputStream.toByteArray(); ' –

+0

나는 이것을 할 수 없었다. 전체 샘플을 제공해 주시겠습니까? – Stella

+0

나는 당신이 제안한 것처럼 시도했다. byte [] data = 새 바이트 [16384]; ByteArrayOutputStream byteBuffer = 새로운 ByteArrayOutputStream(); ((nRead = input.read (data, 0, data.length))! = -1) { \t \t \t \t \t \t byteBuffer.write (data, 0, nRead); byte [] dataOut = byteBuffer.toByteArray(); 클라이언트가 멈추지 않고 데이터를 전송하는 루핑을 유지하고 잠시 후 소켓이 모두 읽히고 클라이언트 애플리케이션이 손상되었습니다. – Stella

답변

0

당신은 오용하고 있습니다. available(). 스트림 끝 테스트는 유효하지 않습니다. Javadoc을 보라.

배열 복사를 모두 수행 할 필요는 없습니다. 이 시도 :

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 
byte[] data = out.toByteArray(); 

당신이 수신 측에 이미지를 저장하는 경우 당신은 대신 위의 ByteArrayOutputStreamFileOutputStream 직접 작성하고, 모두에 대한 data 잊지한다.

+0

안녕하세요, ByteArrayOutputStream 또는 FileOutputStream을 사용해야합니까? ByteArrayOutputStream을 사용하여 코드를 추가했지만 FileOutputStream에 대한 쓰기를 언급 했습니까? 그래서 ByteArrayOutputStream 또는 FileOutputStream을 사용해야합니까? – Stella

+0

문제는 모든 바이트를 완전히 읽지 않고이 루프에서 빠져 나오지 않는다는 것입니다. "while"루프는 바이트 크기를 완료하기 직전에 멈 춥니 다. 예를 들면 : 클라이언트가 50K 바이트의 이미지 데이터를 보내는 경우이 소켓 "While"은 약 49K 바이트를 읽습니다.이 루프를 종료하지 않으면 루프 자체에 머물러 있습니다. – Stella

+0

소켓에서 'While'루프를 읽었을 때 iOS 클라이언트 응용 프로그램을 종료하면 소켓에서 전체 이미지를 갑자기 가져옵니다. 이상한 점을 발견했습니다. 그래서,이 소켓 'While'루프는 어떻게 든 그것을 중단시킵니다. – Stella

관련 문제