2011-03-21 40 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并打开文件。