자바 소켓에서 이미지 바이트를 읽는 데 문제가 있습니다. 내 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);
while 루프의 종료 조건으로'input.read()! = -1'을 사용하여 한 번에 한 바이트 씩 읽어 들일 수 있습니까? 'InputStream.available()'은 no. 블로킹없이 읽을 수있는 바이트 수. 반드시 스트림이 종료되었음을 나타내는 것은 아닙니다. 뭔가 따라와 : 'while ((next = input.read())! = -1) {byteArrayOutputStream.write (next); } byte [] data = byteArrayOutputStream.toByteArray(); ' –
나는 이것을 할 수 없었다. 전체 샘플을 제공해 주시겠습니까? – Stella
나는 당신이 제안한 것처럼 시도했다. 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