将图像从java服务器发送到Android应用程序

时间:2011-08-13 12:40:29

标签: java android sockets

我想使用以下代码将图像文件从java服务器发送到Android应用程序:

服务器(爪哇):

File file = new File("./clique.jpg");

FileInputStream stream = new FileInputStream(file);

DataOutputStream writer = new DataOutputStream(socket.getOutputStream());        

byte[] contextB = new byte[4096];

int n;
int i = 0;
while ( (n=stream.read(contextB))!=-1 ){
    writer.write(contextB, 0, n);
    writer.flush();
    System.out.println(n);
    i+=n;
}
writer.flush();
stream.close();

android app:

DataInputStream reader = new DataInputStream(socket.getInputStream());
            byte[] buffer = new byte[4096];
            ByteArrayOutputStream content = new ByteArrayOutputStream();

            int n;
            int i = 0;
            reader = new DataInputStream(socket.getInputStream());
            while ( (n=reader.read(buffer)) != null){                
                content.write(buffer, 0, n);
                content.flush();

            }

            Utility.CreateImageFile(content.toByteArray());

我注意到在android app n中,当我从4096大小的服务器字节块发送时读取的字节数不是4096,我也无法得到n = -1这是流的结尾,它会阻止,直到我关闭应用程序,然后我得到n = -1。

2 个答案:

答案 0 :(得分:0)

关于一次读取的字节数与您编写的字节数无关 - 这在很大程度上取决于网络条件,并且每个块都是可变的(基本上可以传输的字节数很多)你读取的时间很短,你将在阅读块中获得许多。

关于流的结束 - 在您的服务器代码中,您忘记关闭输出流(您只关闭输入流的流 - 您还应关闭编写器,而编写器又将关闭基础输出流。

两条评论:

1)我真的建议使用包装写入/读取器的缓冲读取器/写入器 - 您将获得的代码更好,您不必自己创建/管理缓冲区。

2)最后使用try {}并在finally子句中关闭你的流 - 这是确保即使在读/写时出现问题也会关闭流和释放资源的最佳实践。

答案 1 :(得分:0)

您的Android代码出现问题:

while ( (n=reader.read(buffer)) != null) {

n不能为空。

在服务器上循环后使用writer.close()而不是writer.flush()。