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:
Cliente (Android)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(); }
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);