2011-07-28 41 views
1

問題

我已經通過從客戶端來的所有數據包嗅探器確認被完全發送,由服務器接收到的數據是完整的爲好,但有一個輕微問題。ServerSocket的文件傳輸缺失字節

這裏是服務器中客戶端線程相關部分的基本表示。

this.data_in = new DataInputStream(sock.getInputStream()); 
this.in = new InputStreamReader(this.data_in); 

服務器將使用的BufferedReader認證數據讀取,一旦認證完成它將從套接字讀取數據,就像這樣。變量'fos'是DataInputStream數據正在寫入的FileOutputStream。

int read = 0; 
byte[] buffer = new byte[8192]; 
while((read = data_in.read(buffer)) != -1) { 
    fos.write(buffer, 0, read); 
    bytes_received += read; 
} 

這一切似乎在概念上是正確的,但是,實際上讀入文件的第一個1450字節丟失。我曾嘗試使用新的DataInputStream(sock.getInputStream()),以防流中的位置很奇怪,但仍然沒有運氣。謝謝你的幫助!

更新1

所以我可以使用的BufferedReader功能我取得了串線,以閱讀,因爲我是之前使用它們的方法。見下面的代碼。

int input; 
boolean run = true; 
while((input = in.read()) != -1 && run) { 
    run = true; 
    char[] chars = Character.toChars(input); 
    for(char c : chars) { 
     if(c == '\n') { 
      run = false; 
      break; 
     } else if(c != '\r') { 
      sb.append(c); 
     } 
    } 
} 

作爲一個好的解決方案,它仍然有1450字節的信息丟失。也許我在這裏走錯了方向?

回答

1

對我來說,它看起來像BufferedReader的問題 - 8192根據http://ulibgcj.sourceforge.net/javadoc/java/io/BufferedReader.html是已經默認緩衝區大小......無論這個默認的緩衝區大小爲你的情況下,BufferedReader將推進data_in在默認緩衝步驟大小......所以即使你不使用它們,data_in通常位於你在認證期間消耗的最後一個字節之外的位置。

+0

聽起來像是最合理的答案,我會檢查它。 –

+0

查看主要問題主體中的更新。 –

+0

爲了確保我們不會追查錯誤的問題,請嘗試直接將'sock.getInputStream()'轉儲到文件中,而無需進一步處理,並檢查您期望的數據結構(認證信息+數據)的內容。 – Yahia

1

您似乎保留了兩個指向同一事物的單獨的流/讀取器:this.data_inthis.in。從任何一方讀取都將推進該流,然後從另一方讀取將看起來「錯過」在另一方讀取的數據。另外,通過使用read(byte[])方法,您可以像使用常規的舊InputStream一樣使用DataInputStream。 DataInputStream是一個具有特定用途的專用流。