linusthe3rd
linusthe3rd

Reputation: 3566

Java's URLConnection not receiving entire binary file

I am currently working on a school that encompasses creating a P2P client for a standard we came up with in class that uses HTTP to request chunks of a binary file from peers. We are allowed to us Java's HTTP libraries to make these requests, however I am hitting a major problem with these libraries. All chunks of a file will be served up in chunks that are <=64KB, but when I use the following code, the max amount of bytes that I receive is around 15040 even though the content-length of the response is 64KB:

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));

We've tested our server component, and that serves the file correctly when accessing a chunk with wget or in a browser - this java client is the only problematic client we were able to find.

Is this a problem with Java's URLConnection class, or is there something in my code that is wrong with reading a binary file that is returned in a response?

Note: I am using Java 1.6 in Eclipse and from the command line.

Upvotes: 0

Views: 1898

Answers (1)

Sripathi Krishnan
Sripathi Krishnan

Reputation: 31528

How do you know that the max amount of bytes is 15040? Did you byteArrayOut.toByteArray().length or did you do new String(byteArrayOut.toByteArray()).length()?

Creating a new String from a byte array that has binary content is likely to give unpredictable results. Use a FileOutputStream and open the file.

Upvotes: 1

Related Questions