Java / Android:在套接字上读/写字节数组

时间:2011-01-08 12:18:12

标签: java android

我有一个Android应用程序,我正在尝试将图片发送到服务器。我使用Base64编码完成了这项工作并且效果很好,但在发送之前对图片进行了大量的内存(和时间)编码。

我正在尝试将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周期。

到目前为止,我尝试过的所有方法都会导致数据损坏或抛出异常。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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[]{};
}

答案 1 :(得分: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;
 }

答案 2 :(得分:0)

如果您需要双向通信,服务器必须知道您何时准备就绪 - 您应该在发送方之前添加一个4字节长的字段,以指示要到达的字节数。

在服务器端,您可以阅读长度,然后继续聆听,直到所有内容都到达。然后你可以回复你的确认字符串。

如果仅发送图片就足够了,您只需发送数据然后关闭连接即可。服务器端的实现如@thejh所示。