2011-01-08 13 views
6

Ho un'applicazione Android in cui sto cercando di inviare un'immagine a un server. L'ho fatto usando la codifica Base64 e ha funzionato abbastanza bene, ma ci voleva troppa memoria (e tempo) per codificare l'immagine prima di inviarla.Java/Android: lettura/scrittura di un array di byte su una presa

Sto provando a spogliare l'applicazione Android fino a dove semplicemente invia l'array di byte e non gira intorno con alcun tipo di schema di codifica in modo da risparmiare il maggior numero di cicli di memoria e CPU possibile.

Questo è quello che vorrei che il codice di Android per assomigliare:

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 " "; 
} 

Il server è scritto in Java. Come posso scrivere il codice del server in modo da poter recuperare correttamente lo stesso array di byte? Il mio obiettivo è quello di salvare quanti più cicli di CPU sull'Android possibile.

Finora, tutti i metodi che ho provato hanno portato a dati corrotti oa un'eccezione generata.

Qualsiasi aiuto sarà apprezzato.

risposta

2

Sulla base del commento di Robert e Zaki, ecco il codice modificato che dovrebbe funzionare meglio.

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

provare qualcosa di simile:

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

Funziona ma la lettura del byte per byte dal flusso è totalmente inefficiente e lenta. È meglio leggere almeno 1024 byte alla volta. – Robert

+0

Immagino che restituire null invece di nuovo byte [] {} sarebbe un'idea migliore. – Zaki

0

Se si desidera la comunicazione bidirezionale, il server deve sapere quando si è pronti - si deve anteporre un campo di lunghezza 4 byte al vostro fianco mittente indica il numero di byte a venire.

Sul lato server si legge la lunghezza e si resta in ascolto fino a quando tutto è arrivato. Quindi puoi rispondere alla tua stringa di conferma.

Se è sufficiente inviare solo l'immagine, è sufficiente inviare i dati e quindi chiudere la connessione. Il lato server è implementato come mostrato da @thejh.