2011-01-08 101 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所示。