Jeff Storey
Jeff Storey

Reputation: 57202

Reusing socket when copying large amounts of data

I am currently sending large amounts of data over a Java socket, and I am using the Apache Commons IOUtils library to copy using the copyLarge method to send/receive the data. The problem is that the copyLarge reads until the the input stream returns -1. I have copied a snippet below

while (-1 != (n = input.read(buffer))) {
   output.write(buffer, 0, n);
   count += n;
}

This method will block until the socket is closed, but the problem is I want to reuse the socket to additional large data. The alternatives I see are to either reopen a new socket for each data being transferred, or to write my own read method that looks for an end of stream token (i.e. a newline character).

It has been a while since I've written low level socket code like this, but am I missing something here? Or is there an easier way to do this?

Upvotes: 0

Views: 177

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1503200

Do you know how much data you have before sending it over? If so, I'd basically length-prefix the message.

That's much easier to handle cleanly than using an end-of-stream token and having to worry about escaping, over-reading etc.

But yes, you'll need to do something, because TCP/IP is a stream-based protocol. Unless you have some indicator for the end of data somehow, you never know whether there might be some more to come Real Soon Now.

Upvotes: 3

Related Questions