Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Java 无法使用InputStream读取API读取所有字节?_Java_Sockets_Serversocket - Fatal编程技术网

Java 无法使用InputStream读取API读取所有字节?

Java 无法使用InputStream读取API读取所有字节?,java,sockets,serversocket,Java,Sockets,Serversocket,我在java套接字中读取图像字节时遇到问题。我的iOS客户端正在这里发送一个映像,它需要读取总字节数并将其作为映像存储在服务器端。 当我通过iOS模拟器进行测试时,它工作得非常好。因为,如果我在模拟器中进行测试,它会发送高达46577字节的图像。它读起来很快,也很准确。如果我测试同一个代码从iPhone设备发送图像,它也会发送大约“45301字节”,但套接字代码只能读取一些“21720字节”,因此只有一半图像出现,(或者)有时它只能读取大约“4000字节”的图像 我不明白为什么它不能读取来自设备

我在java套接字中读取图像字节时遇到问题。我的iOS客户端正在这里发送一个映像,它需要读取总字节数并将其作为映像存储在服务器端。 当我通过iOS模拟器进行测试时,它工作得非常好。因为,如果我在模拟器中进行测试,它会发送高达46577字节的图像。它读起来很快,也很准确。如果我测试同一个代码从iPhone设备发送图像,它也会发送大约“45301字节”,但套接字代码只能读取一些“21720字节”,因此只有一半图像出现,(或者)有时它只能读取大约“4000字节”的图像

我不明白为什么它不能读取来自设备的相同大小的数据?有人能指导我解决这个问题吗

InputStream input = socket.getInputStream();

            byte[] data = new byte[0];
            byte[] buffer = new byte[1024];             

            try {
                do {
                bytesRead = input.read(buffer);
                System.out.println("Reading..bytesRead: " + bytesRead);

                // construct an array large enough to hold the data we currently have
                byte[] newData = new byte[data.length + bytesRead];
                // copy data that was previously read into newData
                System.arraycopy(data, 0, newData, 0, data.length);
                // append new data from buffer into newData
                System.arraycopy(buffer, 0, newData, data.length, bytesRead);
                // set data equal to newData in prep for next block of data
                data = newData;

                } while (input.available() != 0);
            } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }

            System.out.println("data: " + data.length);

您误用了
available()
。它作为流结束的测试无效。请参阅Javadoc

您也不需要所有的数组复制。试试这个:

ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
byte[] data = out.toByteArray();

如果您在接收端存储图像,您应该直接写入
文件输出流
,而不是上面的
ByteArrayOutputStream
,并且完全忘记
数据

您可以尝试使用
input.read()
input.read()一次读取一个字节吗-1
作为while循环的终止条件?因为
InputStream.available()
返回可以无阻塞读取的字节数;它不一定表示流已经结束。类似于:
while((next=input.read())!=-1){byteArrayOutputStream.write(next);}byte[]data=byteArrayOutputStream.toByteArray()我不能这样做。请给我完整的样品好吗?我按照你的建议试过了。字节[]数据=新字节[16384];ByteArrayOutputStream byteBuffer=新建ByteArrayOutputStream();当((nRead=input.read(data,0,data.length))!=-1{byteBuffer.write(data,0,nRead);byte[]dataOut=byteBuffer.toByteArray();客户端不停地循环发送数据,一段时间后,套接字全部读取并使客户端应用程序崩溃。
InputStream in=null;重试{int next;ByteArrayOutputStream out=new ByteArrayOutputStream();while((next=in.read())!=-1){out.write(next);}byte[]data=out.toByteArray();}catch(IOException e){//handle error}
让我也试试你的代码。嗨,我应该使用ByteArrayOutputStream还是FileOutputStream?你用ByteArrayOutputStream添加了代码,但你提到了写入FileOutputStream?那么,我应该使用ByteArrayOutputStream还是FileOutputStream?问题是,它没有完全读取所有字节并从这个循环中出来。“While”循环在完成字节大小之前卡住。例如:如果客户端发送50K字节的图像数据,那么这个套接字“While”读取大约49K字节,之后它不会退出此循环,而是卡在循环本身中。发现一个奇怪的事情,当它在套接字中的“While”循环中读取时,如果我退出iOS客户端应用程序,那么套接字会突然获得完整的图像。因此,此套接字“While”循环不知怎的挂起了它。@Stella你的客户端没有关闭套接字。
while()。