【发布时间】:2011-08-13 12:40:29
【问题描述】:
我想使用此代码将图像文件从 java 服务器发送到 android 应用程序:
服务器(Java):
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();
安卓应用:
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());
我注意到的是,在我从 4096 大小的服务器字节块发送时,在 android 应用程序 n 中读取字节数不是 4096,我也无法得到 n=-1,这是流的结尾,它会阻塞,直到我关闭应用程序然后我得到 n=-1。
【问题讨论】:
-
请问你为什么做的这么复杂?您可以使用 http 来传输该文件,这非常简单。您应该在循环之后调用 writer.close() 而不是 writer.flush()。不接收确切的 4k 数据包应该没问题,因为您正在通过不支持大数据包的互联网传输。
-
我也尝试了 128 个字节,它每次也传输 8 个字节
-
我有没有提到,你真的应该使用 http?
-
是的,但使用 http 不会使其流畅和迅速。是的,这种方式有点复杂,但很有效
-
嗯,http 的开销在大多数情况下是可以的,而且它的扩展性更好。