Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android和java上的二进制数据套接字_Java_Android_Binary Data - Fatal编程技术网

android和java上的二进制数据套接字

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

我正在使用此代码从facebook服务器获取我的图像

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个读取字节数来完成读取并结束循环