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

时间:2014-02-12 04:34:28

标签: java sockets serversocket

我在java socket中读取图像字节时遇到问题。我的iOS客户端在此处发送图像,它需要读取总字节数并将其作为图像存储在服务器端。 当我通过iOS模拟器进行测试时,它非常好用。因为,如果我在模拟器中测试,它会将图像发送到 46,577字节。它读取所有内容非常快速和正确。如果我测试从iPhone设备发送图像的相同代码,它也发送“ 45,301字节”,但套接字代码只能读取一些“ 21,720字节“,所以只有一半的图像来了,(或)有时它只会在” 4,000字节 “的周围读得非常少。

我无法理解为什么它无法读取仅来自设备的相同大小的数据?有人可以指导我解决这个问题吗?

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);

1 个答案:

答案 0 :(得分:1)

你在滥用available()。它无法作为流结束的测试。见Javadoc。

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

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

如果您要将图像存储在接收端,则应直接写入FileOutputStream而不是上面的ByteArrayOutputStream,并完全忘记data