我目前正在研究一個學校,它包括爲我們在類中使用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。
我沒有看到任何明顯的代碼錯誤。您的服務器組件是否爲Content-Length標頭提供了正確的數據? – 2011-03-21 13:33:35
嘗試用''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
ByteArrayOutputStream不是「toString」嗎? – 2011-03-21 13:40:44