2011-01-08 8 views
6

Tengo una aplicación de Android donde intento enviar una imagen a un servidor. Hice esto usando codificación Base64 y funcionó bastante bien, pero tomó demasiada memoria (y tiempo) para codificar la imagen antes de enviarla.Java/Android: leer/escribir una matriz de bytes en un socket

Estoy tratando de quitar la aplicación de Android a donde simplemente envía la matriz de bytes y no juguetea con ningún tipo de esquema de codificación por lo que ahorrará la mayor cantidad de memoria y ciclos de CPU posible.

Esto es lo que me gustaría que el código de Android para que parezca:

public String sendPicture(byte[] picture, String address) { 
    try { 
     Socket clientSocket = new Socket(address, 8000); 
     OutputStream out = clientSocket.getOutputStream(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     out.write(picture); 
     return in.readLine(); 
    } 
    catch(IOException ioe) { 
     Log.v("test", ioe.getMessage()); 
    } 
    return " "; 
} 

El servidor está escrito en Java. ¿Cómo escribo el código del servidor para que pueda recuperar correctamente la misma matriz de bytes? Mi objetivo es ahorrar tantos ciclos de CPU en Android como sea posible.

Hasta ahora, todos los métodos que he probado dieron como resultado datos corruptos o una excepción lanzada.

Cualquier ayuda será apreciada.

Respuesta

2

Según el comentario de Robert y Zaki, aquí está el código modificado que debería funcionar mejor.

public byte[] getPicture(InputStream in) { 
    try { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    byte[] data = new byte[1024]; 
    int length = 0; 
    while ((length = in.read(data))!=-1) { 
     out.write(data,0,length); 
    } 
     return out.toByteArray(); 
    } catch(IOException ioe) { 
    //handle it 
    } 
    return null; 
} 
3

intentar algo como esto:

public byte[] getPicture(InputStream in) { 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     int data; 
     while ((data = in.read())>=0) { 
      out.write(data); 
     } 
     return out.toByteArray(); 
    } catch(IOException ioe) { 
     //handle it 
    } 
    return new byte[]{}; 
} 
+0

Funciona pero la lectura del byte de la secuencia es totalmente ineficiente y lenta. Mejor es leer al menos 1024 bytes a la vez. – Robert

+0

Supongo que devolver null en lugar de nuevo byte [] {} sería una mejor idea. – Zaki

0

Si desea una comunicación bidireccional, el servidor debe saber cuando esté listo - usted debe anteponer un campo de longitud de 4 bytes a su lado emisor indica el número de bytes por venir.

En el lado del servidor, lee la longitud y luego permanece atento hasta que todo haya llegado. Luego puede responder su cadena de confirmación.

Si es suficiente enviar solo la imagen, puede simplemente enviar los datos y luego cerrar la conexión. El lado del servidor se implementa como se muestra por @thejh.

Cuestiones relacionadas