Ефективно прехвърляне на файлове от Java сървър към множество C++ клиенти?

Трябва да прехвърля файлове бързо по интернет от Java сървър към C++ клиенти, където често много клиенти ще се нуждаят от едни и същи файлове. Гледах да кажем transferTo() в Java, което звучи като прилично оптимизирана функция за изпращане на файлове. Не съм сигурен обаче, когато използвам transferTo() как най-добре да получа това в C++ (т.е. дали това е просто прехвърляне на необработени данни, как да определя кога файлът е приключил от страна на клиента и т.н.). Имам нужда от това, за да работи както на 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

От съображения за мащабируемост предложението на Thorbjørns за използване на 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