2011-01-08 102 views
6

我有一個Android應用程序,我試圖將圖片發送到服務器。我使用Base64編碼完成了這個工作,它工作得很好,但是在發送之前花費太多內存(和時間)對圖片進行編碼。Java/Android:通過套接字讀取/寫入字節數組

我試圖剝離Android應用程序到它只是簡單地發送字節數組,並沒有擺弄任何種類的編碼方案,所以它會盡可能節省內存和CPU週期。

這是我想了Android的代碼是什麼樣子:

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

服務器是用Java編寫。如何編寫服務器代碼,以便我可以正確檢索完全相同的字節數組?我的目標是儘可能多地在Android上節省CPU週期。

到目前爲止,我嘗試過的所有方法都會導致數據損壞或引發異常。

任何幫助將不勝感激。

回答

2

根據Robert's和Zaki的評論,這裏是修改後的代碼應該更好。

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

嘗試這樣:

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

工作,但從流讀取字節的字節是完全低效和緩慢。更好的辦法是一次至少讀取1024個字節。 – Robert 2011-01-08 13:02:12

0

如果你想雙向通信,服務器必須知道當你準備好 - 你應該在前面加上一個4字節長度字段您發送方顯示的號碼字節來。

在服務器端,您讀取長度,然後保持聆聽,直到所有內容都到達。然後你可以回覆你的確認字符串。

如果只發送圖片就足夠了,您可以簡單地發送數據,然後關閉連接。服務器端的實現如@thejh所示。