Hola a todos, he creado un modelo servidor (Java) / cliente (Android) mediante el cual, el servidor (Java) enviara imagenes de un directorio y el cliente (Android) las recibe y las almacena en la tarjeta SD.
El problema viene cuando intento transferir mas de 1 imagen, ya que se bloquea y no consigue enviar las imagenes y no entiendo porque...
Se bloque en la parte cliente (android) en esta linea: Bitmap bitmap = BitmapFactory.decodeStream(in);
Servidor (Java)
Código:
try {
servidor = new ServerSocket(puerto);
while(true){
try{
esperarConexion();
envioDatos = new
DataOutputStream(conexion.getOutputStream());
envioDatos.writeInt(Principal.getDirectorioImagen().list().length);
System.out.println("Se van a enviar "+Principal.getDirectorioImagen().list().length+" imagenes");
do{
// Enviamos las imagenes
System.out.println("Preparando para enviar imagen "+"detMov"+j+".jpg");
if( j <= Principal.getDirectorioImagen().list().length){
image = (BufferedImage) ImageIO.read(new File(Principal.getDirectorioImagen(),"detMov"+j+".jpg"));
if (image != null) {
try{
System.out.println("Enviando imagen "+"detMov"+j+".jpg...");
OutputStream out = conexion.getOutputStream();
ImageIO.write(image, "JPEG", out);
System.out.println("Se ha enviado: "+"detMov"+j+".jpg");
out.flush();
j++;
} catch (IOException excepcionES ) {
System.out.println( "\nError al escribir el objeto" );
}
} else {
System.out.println("No se ha podido leer la imagen...");
}
}
// Espero hasta que cliente almacene la imagen
System.out.println("Esperando confirmacion del cliente...");
reciboDatos = new DataInputStream(conexion.getInputStream());
modo = reciboDatos.readUTF();
System.out.println("Confirmacion recibida: "+modo);
}while(modo.equals("OK"));
} catch (EOFException exceptionES) {
exceptionES.printStackTrace();
} finally {
cerrarConexion();
}
}
} catch (IOException e) {
e.printStackTrace();
}
Cliente (Android)
Código:
try {
cliente = new Socket(ip,puerto);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
// Recibimos el numero de imagenes que van a ser recibidas.
try {
reciboDatos = new DataInputStream(cliente.getInputStream());
imgRecibidas = reciboDatos.readInt();
} catch (Exception e) {
e.printStackTrace();
}
Log.e("DescargarDatos", "Se van a descargar "+imgRecibidas+" imagenes");
do{
try {
InputStream in = cliente.getInputStream();
Log.e("DescargarDatos", "Entrando en decodeStream");
Bitmap bitmap = BitmapFactory.decodeStream(in);
in.reset();
Log.e("DescargarDatos", "Saliendo de decodeStream");
if(bitmap==null)
Log.e("DescargarDatos", "bitmap ha devuelto null!");
else
Log.e("DescargarDatos", "Bitmap no ha devuelto null!");
// Carpeta dodne guardamos la captura
// En este caso, la raiz de la SD Card
File sd = Environment.getExternalStorageDirectory();
dir = new File(sd + "/Videovigilancia/");
// El archivo que contendra la captura
File f = new File(dir, "deteccionMovimiento"+ dir.list().length + ".jpg");
Log.e("DescargarDatos", "Recibiendo imagen...");
f.createNewFile();
OutputStream os = new FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, os);
os.close();
cuenta++;
//in.close();
} catch (OptionalDataException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
Log.e("DescargarDatos", "Imagen "+cuenta+" descargada correctamente!");
Log.e("DescargarDatos", "Enviando confirmacion al servidor...");
try {
envioDatos = new DataOutputStream(cliente.getOutputStream());
if(cuenta != imgRecibidas)
envioDatos.writeUTF("OK");
else
envioDatos.writeUTF("cliente finaliza conexion");
} catch (IOException e) {
e.printStackTrace();
}
Log.e("DescargarDatos", "Enviada confirmacion al servidor correctamente");
Log.e("DescargarDatos", "----------------------------------------------------------");
}while(cuenta != imgRecibidas);