views:

244

answers:

4

I need to transfer files fast over the Internet from a Java server to C++ clients, where often many clients would need the same files. I was looking at say transferTo() in Java which sounds like it would be a decently optimized function to send files. However, I'm not sure when I use transferTo() how to best receive that in C++ (i.e. is it just a raw data transfer, how do I determine when the file is over on the client side, etc.). I need this to work on both Windows and Linux. Also, other than transferTo(), would there be some way to be more efficient, especially by taking advantage of the fact that many clients will usually need the same files? I'm not sure how to do say multicast etc. Also, I'm using application-level security rather than a VPN, and on the Java server, encrypting with AES and using MAC digital signing, so I'm also looking for a cross-platform library recommendation to deal with the crypto on the C++ side with minimal pain. I'm very proficient in C++ but have no previous experience with network programming, so please consider than in any suggestions. Thanks.

A: 

Consider chunking the file and sending via UDP datagram. C++ can re-compile as it receives it. Have you considered implementing/embedding an existing P2P protocol implementation?

Xepoch
P2P seems too complicated and the clients will usually have very low upload speed anyway.
+1  A: 

An embedded webserver? http-transfers are efficient enough for you?

The simplest embeddable Java webserver I remember seeing is http://acme.com/java/software/Acme.Serve.Serve.html. We use embedded Jetty 6 in production at work, but that takes more elbow grease.

If your clients doesn't know where to find your webserver in the first place, consider announcing using Zeroconf. http://jmdns.sourceforge.net/

Thorbjørn Ravn Andersen
The servers have static IPs so there's no issue with discovery. And I was thinking more socket level rather than using http, because I'm trying to make things as lean as possible, and also I'm not sure that http would play nicely with application-level encryption.
+1  A: 

For scalability reasons, Thorbjørns suggestion of using http seems like a very good idea as it would allow you to easily set up http proxies for caching, use standard load balancing tools and so forth.

If you are looking to transfer more than just a blob of data, you might want to have a look at googles protocol buffers. They allow for very easy and fast encoding/decoding on the java and c++ end.

kasperjj
A: 

If you need effecient transfer to many clients then your bottleneck is the server.

For this please look at the bit-torrent protocol as it distributes the transfer between the clients.

Martin York
5 megabit upload is sufficient if I can get very high utilization of it.