在inputstream.read中获取损坏的数据

时间:2013-12-15 22:51:14

标签: java sockets inputstream

好的,所以我正在尝试使用套接字发送文件。这是我在服务器端获得的代码。问题是,如果我让这个代码运行,我将得到一些喜欢丢失字节的奇怪输出。我试图在if语句中添加thread.sleep(),这似乎有助于一些,只有当它处理更大的文件时才会出现问题。我还尝试在行缓冲区= setbuffersize(binaryData,i,in)上放置一个断点;所以我在每个文件后停了下来。这似乎有助于解决这个问题。所以我想问题是代码继续读取,即使没有什么可读(客户端有时间发送它)。我真的不确定如何解决这个问题。我试图检查BUFFER_SIZE是否与in.available()一样大但是它似乎在一段时间后停止发送并且从未到达BUFFER_SIZE。

那么如何在尝试读取数据之前让代码等待数据传输呢?

while (byteRead != -1) {
commandlengh = msg.length();
binaryData = new byte[Integer.parseInt(ParameterValues.get(ParameterValues.size() - 1))];
in.read();
byte[] buffer = setbuffersize(binaryData, i, in);
while (in.read(buffer) != -1) {
for (int j = 0; j < buffer.length; j++) {
binaryData[i] = buffer[j];
i++;
}
buffer = setbuffersize(binaryData, i, in);
if(buffer.length == 0)
{
Parameters.clear();
ParameterValues.clear();
i = 0;
commandlengh = 0;
break;
}
}
byteRead = in.read();
}
private byte[] setbuffersize(byte[] binaryData, int i, InputStream in) throws IOException
{
    int BUFFER_SIZE = 65536;
    if(binaryData.length - i < BUFFER_SIZE)
    {
        BUFFER_SIZE = binaryData.length - i;
    }
    else
    {
        BUFFER_SIZE = 65536;
    }
    byte[] buffer = new byte[BUFFER_SIZE];
    return buffer;
}

1 个答案:

答案 0 :(得分:1)

您忽略了read()返回的计数,并假设它填充了缓冲区。检查Javadoc。这不是必须的。

我无法理解你的代码。您不需要从套接字读取所有内容。只需调用read,检查结果为-1;如果是的话,停止;否则处理缓冲区的字节0..count-1。