通过套接字发送图像而不破坏它
send images via sockets without corrupting it
大家好,我正在尝试编写一个 android 应用程序,用于通过套接字在 PC 上发送图像。
我有一个 android 客户端和一个 Java SE 服务器。
有时图像会损坏,我不知道为什么。
我已尝试发送 175 张照片,其中 9 张已损坏。
这是 android 客户端的代码:
PS:我使用 ObjectInputStream 和 ObjectInputstream。
try {
//Get image
//the variable "uri" is the uri of image
InputStream is = contentResolver.openInputStream(uri);
final Bitmap bitmap = BitmapFactory.decodeStream(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte array[] = baos.toByteArray();
int length = array.length;
Log.d("MY-DEBUG", "length: " + length);
//Send lenght of image
out.writeInt(length);
out.flush();
int remainent = length;
int send = 0;
int size = SIZE;
while (remainent > 0) {
if (remainent < size)
size = remainent;
//System.out.println("ATTUALE: " + send + ", GRANDEZZA ARRAY: " + size);
out.write(array, send, size);
int percentage = (100 * send) / length;
publishProgress(percentage);
System.out.println("\n === FINE === \n");
send += size;
remainent -= size;
Log.d("MY-DEBUG", "Send " + send + "/" + length + " - remainent: " + remainent);
}
out.flush();
Log.d("MY-DEBUG", "Immagine inviata");
publishProgress(0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
这是 Java SE
中服务器的代码
try {
//Read length
int length = (int) in.readInt();
File target = new File(percorso + "\img-" + sequenza + ".jpg");
outs = new FileOutputStream(target, true);
System.out.println("Grandezza: " + length);
int remainent = length;
int read = 0;
int total = 0;
int size = SIZE;
byte buffer[] = new byte[size];
while ((read = in.read(buffer, 0, size)) != -1) {
total += read;
remainent = length - total;
System.out.println("read: " + read + " - Received: " + total + "/" + length + " - remainent: " + remainent);
int percentuale = (100 * total) / length;
progressBar.setValue(percentuale);
outs.write(buffer);
outs.flush();
Thread.sleep(1);
if (remainent == 0) break;
}
progressBar.setValue(0);
//Thread.sleep(100);
//in.read();
System.out.println("END");
} catch (IOException e1) {
System.err.println(e1.getMessage());
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (outs != null) {
try {
outs.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
outs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Thread.currentThread().interrupt();
}
SIZE 变量声明如下
private static final int SIZE = 1024;
如果我设置的值 > 1024 所有照片到达时都已损坏。
如果我使用 1024,有些照片会损坏。
非常感谢
问题出在这一行:
outs.write(buffer);
您正在无条件地写出整个缓冲区,它总是 SIZE
字节长。但是 如果你有一个 "short" 读 会怎么样?试试这个,而不是:
outs.write(buffer,0,read);
大家好,我正在尝试编写一个 android 应用程序,用于通过套接字在 PC 上发送图像。 我有一个 android 客户端和一个 Java SE 服务器。 有时图像会损坏,我不知道为什么。 我已尝试发送 175 张照片,其中 9 张已损坏。 这是 android 客户端的代码: PS:我使用 ObjectInputStream 和 ObjectInputstream。
try {
//Get image
//the variable "uri" is the uri of image
InputStream is = contentResolver.openInputStream(uri);
final Bitmap bitmap = BitmapFactory.decodeStream(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte array[] = baos.toByteArray();
int length = array.length;
Log.d("MY-DEBUG", "length: " + length);
//Send lenght of image
out.writeInt(length);
out.flush();
int remainent = length;
int send = 0;
int size = SIZE;
while (remainent > 0) {
if (remainent < size)
size = remainent;
//System.out.println("ATTUALE: " + send + ", GRANDEZZA ARRAY: " + size);
out.write(array, send, size);
int percentage = (100 * send) / length;
publishProgress(percentage);
System.out.println("\n === FINE === \n");
send += size;
remainent -= size;
Log.d("MY-DEBUG", "Send " + send + "/" + length + " - remainent: " + remainent);
}
out.flush();
Log.d("MY-DEBUG", "Immagine inviata");
publishProgress(0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
这是 Java SE
中服务器的代码try {
//Read length
int length = (int) in.readInt();
File target = new File(percorso + "\img-" + sequenza + ".jpg");
outs = new FileOutputStream(target, true);
System.out.println("Grandezza: " + length);
int remainent = length;
int read = 0;
int total = 0;
int size = SIZE;
byte buffer[] = new byte[size];
while ((read = in.read(buffer, 0, size)) != -1) {
total += read;
remainent = length - total;
System.out.println("read: " + read + " - Received: " + total + "/" + length + " - remainent: " + remainent);
int percentuale = (100 * total) / length;
progressBar.setValue(percentuale);
outs.write(buffer);
outs.flush();
Thread.sleep(1);
if (remainent == 0) break;
}
progressBar.setValue(0);
//Thread.sleep(100);
//in.read();
System.out.println("END");
} catch (IOException e1) {
System.err.println(e1.getMessage());
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (outs != null) {
try {
outs.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
outs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Thread.currentThread().interrupt();
}
SIZE 变量声明如下
private static final int SIZE = 1024;
如果我设置的值 > 1024 所有照片到达时都已损坏。 如果我使用 1024,有些照片会损坏。 非常感谢
问题出在这一行:
outs.write(buffer);
您正在无条件地写出整个缓冲区,它总是 SIZE
字节长。但是 如果你有一个 "short" 读 会怎么样?试试这个,而不是:
outs.write(buffer,0,read);