我目前正在研究一个学校,它包括为我们在类中使用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