Мне нужно быстро передавать файлы через Интернет с сервера Java на клиенты C++, где часто многим клиентам нужны одни и те же файлы. Я смотрел, скажем, на TransferTo() в Java, что звучит так, будто это была бы прилично оптимизированная функция для отправки файлов. Однако я не уверен, когда я использую transferTo(), как лучше всего получить это на С++ (т.е. это просто передача необработанных данных, как определить, когда файл закончился на стороне клиента и т. д.). Мне нужно, чтобы это работало как на Windows, так и на Linux. Кроме того, есть ли способ повысить эффективность, кроме как transferTo(), особенно за счет использования того факта, что многим клиентам обычно требуются одни и те же файлы? Я не уверен, как сделать многоадресную рассылку и т. д. Кроме того, я использую безопасность на уровне приложений, а не VPN, и на сервере Java шифрую с помощью AES и использую цифровую подпись MAC, поэтому я также ищу рекомендация кроссплатформенной библиотеки для работы с криптографией на стороне C++ с минимальными трудностями. Я очень хорошо разбираюсь в C++, но у меня нет предыдущего опыта сетевого программирования, поэтому, пожалуйста, рассмотрите любые предложения. Спасибо.
Эффективная передача файлов с сервера Java на несколько клиентов C++?
Ответы (4)
Встроенный веб-сервер? http-переводы достаточно эффективны для вас?
Самый простой встраиваемый веб-сервер Java, который я видел, это http://acme.com/java/software/Acme.Serve.Serve.html. Мы используем встроенный Jetty 6 в производстве на работе, но это требует больше усилий.
Если ваши клиенты вообще не знают, где найти ваш веб-сервер, рассмотрите возможность объявления об использовании Zeroconf. http://jmdns.sourceforge.net/
Из соображений масштабируемости предложение Торбьерна об использовании http кажется очень хорошей идеей, поскольку это позволит вам легко настроить http-прокси для кэширования, использовать стандартные инструменты балансировки нагрузки и так далее.
Если вы хотите передать больше, чем просто блок данных, вы можете взглянуть на буферы протокола Google. Они обеспечивают очень простое и быстрое кодирование/декодирование на стороне java и c++.
Рассмотрите возможность разделения файла на фрагменты и отправки через дейтаграмму UDP. C++ может перекомпилировать его по мере его получения. Рассматривали ли вы реализацию/встраивание существующей реализации протокола P2P?
Если вам нужна эффективная передача на множество клиентов, то вашим узким местом является сервер.
Для этого посмотрите на протокол Bit-Torrent, поскольку он распределяет передачу между клиентами.