Эффективная передача файлов с сервера Java на несколько клиентов C++?

Мне нужно быстро передавать файлы через Интернет с сервера Java на клиенты C++, где часто многим клиентам нужны одни и те же файлы. Я смотрел, скажем, на TransferTo() в Java, что звучит так, будто это была бы прилично оптимизированная функция для отправки файлов. Однако я не уверен, когда я использую transferTo(), как лучше всего получить это на С++ (т.е. это просто передача необработанных данных, как определить, когда файл закончился на стороне клиента и т. д.). Мне нужно, чтобы это работало как на Windows, так и на Linux. Кроме того, есть ли способ повысить эффективность, кроме как transferTo(), особенно за счет использования того факта, что многим клиентам обычно требуются одни и те же файлы? Я не уверен, как сделать многоадресную рассылку и т. д. Кроме того, я использую безопасность на уровне приложений, а не VPN, и на сервере Java шифрую с помощью AES и использую цифровую подпись MAC, поэтому я также ищу рекомендация кроссплатформенной библиотеки для работы с криптографией на стороне C++ с минимальными трудностями. Я очень хорошо разбираюсь в C++, но у меня нет предыдущего опыта сетевого программирования, поэтому, пожалуйста, рассмотрите любые предложения. Спасибо.


person user199425    schedule 30.10.2009    source источник
comment
Пожалуйста, определите, что для вас эффективно в данном случае.   -  person Thorbjørn Ravn Andersen    schedule 30.10.2009


Ответы (4)


Встроенный веб-сервер? http-переводы достаточно эффективны для вас?

Самый простой встраиваемый веб-сервер Java, который я видел, это http://acme.com/java/software/Acme.Serve.Serve.html. Мы используем встроенный Jetty 6 в производстве на работе, но это требует больше усилий.

Если ваши клиенты вообще не знают, где найти ваш веб-сервер, рассмотрите возможность объявления об использовании Zeroconf. http://jmdns.sourceforge.net/

person Thorbjørn Ravn Andersen    schedule 30.10.2009
comment
У серверов статические IP-адреса, поэтому проблем с обнаружением нет. И я думал о большем уровне сокетов, а не об использовании http, потому что я пытаюсь сделать вещи как можно более компактными, а также я не уверен, что http будет хорошо работать с шифрованием на уровне приложений. - person user199425; 01.11.2009

Из соображений масштабируемости предложение Торбьерна об использовании http кажется очень хорошей идеей, поскольку это позволит вам легко настроить http-прокси для кэширования, использовать стандартные инструменты балансировки нагрузки и так далее.

Если вы хотите передать больше, чем просто блок данных, вы можете взглянуть на буферы протокола Google. Они обеспечивают очень простое и быстрое кодирование/декодирование на стороне java и c++.

person kasperjj    schedule 30.10.2009

Рассмотрите возможность разделения файла на фрагменты и отправки через дейтаграмму UDP. C++ может перекомпилировать его по мере его получения. Рассматривали ли вы реализацию/встраивание существующей реализации протокола P2P?

person Jé Queue    schedule 30.10.2009
comment
P2P кажется слишком сложным, и клиенты обычно имеют очень низкую скорость загрузки. - person user199425; 01.11.2009

Если вам нужна эффективная передача на множество клиентов, то вашим узким местом является сервер.

Для этого посмотрите на протокол Bit-Torrent, поскольку он распределяет передачу между клиентами.

person Martin York    schedule 30.10.2009
comment
5-мегабитной загрузки достаточно, если я могу получить очень высокую ее загрузку. - person user199425; 01.11.2009