Client/Server инсталация

8 отговора 0 прегледа
#1

Client/Server инсталация

Здравейте,
Тези дни ми се върти една идея в главата и искам да попитам дали някой е правил нещо подобно. Значи, работи се на едно приложение на 3 компютъра в мрежа. Единият от тях е сървър другите станции. На сървъра се подновява версията т.е. EXE-то и още няколко файла, може ли по локалната мрежа да се подновят и останалите 2 компютъра от така наречен сървър? И как може да стане това?
Благодаря.

Отговор
в отговор на coolman #2

Програмирането се ограничава от въображението :)

Програмирането се ограничава от въображението :)
Може, разбира се.
В конкретния случей, явно едно и също приложение работи като сървър и клиент - ще трябва да организираш обмена така, че след като заредиш новите файлове на клиентите, те да стартират друг процес (приложение), да се затворят, да се сменят изпълнимите файлове и отново да се стартират.

Отговор
в отговор на NikB #3

Re: Програмирането се ограничава от въображението :)

Ами да така е, но забравих да спомена, че искам прехвърлянето на файлове да става през TCP не през sharing устройство. Например: Стартира се програмата на станция и той изпраща към сървъра запитване, "има ли нова версия" ако има, прехвърлят се файловете и се подновяват. Може ли и пример?

Отговор
в отговор на coolman #4

И през ум не ми мина да ги шерваш :)

И през ум не ми мина да ги шерваш :)
Но правлото е сървъра да решава - в смисъл - да пита "твоята версия коя е" и т.н., защото версията на клиента може да не подозира, че с новата версия ще трябва (примерно) да се изпрати още един файл :)
А ако клиент/сървъра ти не е с универсални сокети, а с някаква по-засукана технология (в смисъл, нивото на универсалните сокети да не е достъпно) - може да ти се наложи да си организираш сокет специално за обноваванията. Това не е съществено :)

За теб не е проблем да си организираш файл трансфер по сокетите, нали?

Впрочем, преди година-две, когато на мой клиент/сървър броя на конектите нарастна (WinXP) се оказа, че има гадно ограничение на броя на сокетите, които са в процес на конектване - за щастие, по форумите на Win имаше доста писано по въпроса.

Отговор
в отговор на NikB #5

Re: И през ум не ми мина да ги шерваш :)

"За теб не е проблем да си организираш файл трансфер по сокетите, нали? "

Точно, това не знам как става

Отговор
в отговор на coolman #6

А клиент/сървър приложението кой го е писал?

А клиент/сървър приложението кой го е писал?
Ако не си ти (и не разполагаш със сорсовете) ще трябва да правиш отделно приложение за UpDate.
Разбира се, по аксиомата, че в интернет има всичко, което можеш да си пожелаеш, добре ще е първо да потърсиш нещо готово (така и така ще е отделно приложение).
Ако решиш да пишеш - клиенски сокет, сървърски сокет, връзка, измисляш си твой протокол (с "твои" команди за определяне на текущите версии, за прехвърляне на файлове и т.н.).
3-5 дни работа, ако знаеш сокетите и започнеш проекта от 0.
Ама за 2-3 компютъра - по-добре ползвай VNC, примерно, и ги ъпдейтвай ръчно.

Отговор
в отговор на coolman #7

Re: Client/Server инсталация

Първата ти задача е да сравниш версиите на exe-то на сървъра и кл. компютър. В директория ...\Examples\Controls\VersionInfo има компонент, който трябва да се компилира и инсталира. С негова помощ четеш версиите на exe-тата и ги сравняваш. Ако са различни, стартираш едно др. ехе, което затваря клиентското ехе, тегли новото ехе и го обновява със старото.
Тегленето на новото ехе, може да стане по 2 начина, със стартиран FTP сървър на компа, където е сървъра или по TCP с Indy. Вторият вариант е за предпочитане. Ето как става:
- слагаш TIdTCPServer компонента на сървъра
- Кода в обработка на събитието TIdTCPServer->OnExecute() :

try // C++ code!
{ String strTmp = ExtractFilePath(Application->ExeName) + String("NEW.EXE");
if (!FileExists(strTmp))
throw Exception("Липсва новото ехе на съврърчето");
TFileStream *fs = new TFileStream(strTmp,fmOpenRead|fmShareDenyWrite);
try
{ AThread->Connection->WriteStream(fs,true,true);
}
catch(Exception &e)
{ delete fs;
throw Exception(e.Message);
}
delete fs;


Athread e нишката, която автоматично се създава във ф-ята OnExecute().

Отговор
в отговор на Beco_ #8

Re: Client/Server инсталация

От клиентската страна:
- Слагаш TIdTCPClient(CliSock) и TIdAntiFreeze компоненти.
- Проверка, дали версиите на клиента и сървъра се различават. При разлика:

TFileStream *fs = new TFileStream(strNewExe,fmCreate);
try
{ CliSock->Connect();
CliSock->WriteLn("GetNewExe"); // Коментар-1
CliSock->ReadStream(fs,-1,false);
CliSock->Disconnect();
}
catch(Exception &e)
{ delete fs;
throw Exception(e.Message);
}

Коментар-1 - Сървъра трябва да "разбира" прости команди подадени като стрингове, Кодът от страна на сървъра ще изпрати новото ехе, само при получен стринг "GetNewExe". Нещата са опростени заради яснота.

Отговор
в отговор на Beco_ #9

Re: Client/Server инсталация

Благодаря, много на всички. Остава да го реализирам , но насоката беше важна

Отговор