2013-12-15 39 views
-1

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

那么如何让代码等待数据传输,然后再尝试读取呢?

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

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

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