android和java上的二进制数据套接字
我正在使用此代码从facebook服务器获取我的图像android和java上的二进制数据套接字,java,android,binary-data,Java,Android,Binary Data,我正在使用此代码从facebook服务器获取我的图像 String imageURL = "http://graph.facebook.com/"+id+"/picture?type=large"; InputStream inputStream = new URL(imageURL).openConnection().getInputStream(); DataInputStream dataStream = new DataInp
String imageURL = "http://graph.facebook.com/"+id+"/picture?type=large";
InputStream inputStream = new URL(imageURL).openConnection().getInputStream();
DataInputStream dataStream = new DataInputStream(inputStream);
byte[] dataBuffer = new byte[4096];
ByteArrayOutputStream dataHolder = new ByteArrayOutputStream();
int n;
while ( (n=dataStream.read(dataBuffer))!=-1 ){
dataHolder.write(dataBuffer, 0, n);
}
并使用相同的方法从服务器获取图像:
FileInputStream inputStream = new FileInputSTream("/image.jpg");
DataOutputStream dataStream = new DataOutputStream(socket.getOutpustStream());
byte[] dataBuffer = new byte[4096];
int n;
while ( (n=inpuStream.read(dataBuffer))!=-1 ){
dataStream.write(dataBuffer, 0, n);
}//get -1 perfectly
让他们在android应用程序上像这样:
DataInputStream dataStream = new DataInputStream(socket.getInputStream());
byte[] dataBuffer = new byte[4096];
ByteArrayOutputStream dataHolder = new ByteArrayOutputStream();
int n;
while ( (n=dataStream.read(dataBuffer))!=-1 ){
dataHolder.write(dataBuffer, 0, n);
}//-1 ??????????????
但是android应用程序不能得到正确的文件,它不能在循环时输出,确切地说不能得到-1,但是昨天我不小心从我做的一些更改中得到了-1,我真的不明白为什么我不能在android应用程序中获得-1,但是我可以在循环时从服务器上获得-1。你可以直接将输入流转换为位图,而不是读取字节
Bitmap myBitmap=BitmapFactory.decodeStream(inputStream)代码>这里只是一些猜测:您是否关闭了服务器端的流
放置一个dataStream.close()代码>在编写循环之后。您需要的只是服务器上的图像,对吗?您的问题不是很清楚。安卓有什么问题?你是否有一个无止境的循环,或者它最终只是阻塞了吗?是的,正确的图像,但是如果客户端需要大量图像,clent会一个接一个地请求大量图像。@Paulo:我没有得到Andless循环,我错过的是最后一个字节块,n=-1,这意味着流在nadroid应用程序上结束,但是我在android应用程序中有另一部分从中获取图像facebook使用相同的机制,它工作正常,得到n=-1你的问题是什么?我很清楚java 1.4上有一个bug,在socket中没有向第二方发送FIN,表示数据r完成,传输完成,在java 1.3 socket中。getOutputStream().close()不关闭输出流,但将FIN发送到第二方,这是我想要的,但它是java套接字中的一个bug,无法修复!!!!直到Java6,但如果我关闭流,所有套接字都将关闭,这在Java1.4-6上是一个坏习惯。请看我在这里的评论:\n我很清楚java 1.4和以上版本中有一个bug,套接字中没有将FIN发送到第二方,表示数据r已完成,传输已完成,而在java 1.3套接字中,getOutputStream().close()没有关闭输出流,而是将FIN发送到第二方,这就是我想要的,但它是java套接字中的一个bug,无法修复!!!!抱歉,我还不太明白你的问题。如果您不关闭流,接收者如何知道图像已完成?查看firend,您很清楚,在java中读取字节的流在获得-1个字节后即完成(查看java流读取文档)但是我尝试通过套接字在网络上传输,它不给我-1个读取字节数,这意味着发送方流已经完成,同时关闭使用套接字流的流会关闭所有套接字,因此关闭流是一个坏习惯,唯一的解决方案是获得-1个读取字节数来完成读取并结束循环