好的,所以我正在尝试使用套接字发送文件。这是我在服务器端获得的代码。问题是,如果我让这个代码运行,我将得到一些喜欢丢失字节的奇怪输出。我试图在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;
}
答案 0 :(得分:1)
您忽略了read()返回的计数,并假设它填充了缓冲区。检查Javadoc。这不是必须的。
我无法理解你的代码。您不需要从套接字读取所有内容。只需调用read,检查结果为-1;如果是的话,停止;否则处理缓冲区的字节0..count-1。