2013-12-15 67 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。