2011-03-21 38 views
0

我目前正在研究一個學校,它包括爲我們在類中使用HTTP請求來自同伴的二進制文件塊創建的標準創建一個P2P客戶端。我們被允許使用Java的HTTP庫來提出這些請求,但是我遇到了這些庫的一個主要問題。文件的所有塊將以< = 64KB的塊形式提供,但是當我使用以下代碼時,即使響應的內容長度爲64KB,我收到的最大字節數也是15040左右:Java的URLConnection沒有收到整個二進制文件

String response = ""; 

URL url = new URL(uriPath); 
URLConnection conn = url.openConnection(); 

conn.setConnectTimeout(30 * 1000); 
conn.setReadTimeout(30 * 1000); 

InputStream stream = conn.getInputStream(); 
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 

int c; 
byte[] buffer = new byte[4096]; 

while ((c = stream.read(buffer)) != -1) 
{ 
    byteArrayOut.write(buffer,0,c); 
} 

body = byteArrayOut.toByteArray(); 


stream.close(); 
result.put(Constants.HEADER_CONTENT_LENGTH, conn.getHeaderField(Constants.HEADER_CONTENT_LENGTH)); 
result.put(Constants.HEADER_CONTENT_CHECKSUM, conn.getHeaderField(Constants.HEADER_CONTENT_CHECKSUM)); 
result.put(Constants.KEY_BODY, new String(body)); 

我們測試了我們的服務器組件,並且在使用wget訪問塊時或在瀏覽器中正確提供文件 - 此java客戶端是我們能夠找到的唯一有問題的客戶端。

這是Java的URLConnection類的問題,還是在我的代碼中有一些讀取響應中返回的二進制文件時出錯?

注意:我在Eclipse和命令行中使用Java 1.6。

+0

我沒有看到任何明顯的代碼錯誤。您的服務器組件是否爲Content-Length標頭提供了正確的數據? – 2011-03-21 13:33:35

+0

嘗試用''ByteStreams.toByteArray()''''conn.getInputStream()''替換所有內容[](http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/ByteStreams .html#toByteArray(java.io.InputStream))(來自[Guava Library](http://guava-libraries.googlecode.com/))。 – 2011-03-21 13:39:38

+1

ByteArrayOutputStream不是「toString」嗎? – 2011-03-21 13:40:44

回答

1

你怎麼知道最大字節數是15040?你有沒有byteArrayOut.toByteArray()。length或你做了新的String(byteArrayOut.toByteArray())。length()?

從具有二進制內容的字節數組中創建一個新的字符串可能會產生不可預知的結果。使用FileOutputStream並打開文件。