|
Тема
|
Client/Server инсталация
|
|
Автор | coolman (Нерегистриран) |
Публикувано | 18.02.07 00:21 |
|
Здравейте,
Тези дни ми се върти една идея в главата и искам да попитам дали някой е правил нещо подобно. Значи, работи се на едно приложение на 3 компютъра в мрежа. Единият от тях е сървър другите станции. На сървъра се подновява версията т.е. EXE-то и още няколко файла, може ли по локалната мрежа да се подновят и останалите 2 компютъра от така наречен сървър? И как може да стане това?
Благодаря.
| |
Тема
|
Програмирането се ограничава от въображението :)
[re: coolman]
|
|
Автор |
NikB (любопитен) |
Публикувано | 18.02.07 11:05 |
|
Програмирането се ограничава от въображението :)
Може, разбира се.
В конкретния случей, явно едно и също приложение работи като сървър и клиент - ще трябва да организираш обмена така, че след като заредиш новите файлове на клиентите, те да стартират друг процес (приложение), да се затворят, да се сменят изпълнимите файлове и отново да се стартират.
| |
Тема
|
Re: Програмирането се ограничава от въображението :)
[re: NikB]
|
|
Автор | coolman (Нерегистриран) |
Публикувано | 18.02.07 11:42 |
|
Ами да така е, но забравих да спомена, че искам прехвърлянето на файлове да става през TCP не през sharing устройство. Например: Стартира се програмата на станция и той изпраща към сървъра запитване, "има ли нова версия" ако има, прехвърлят се файловете и се подновяват. Може ли и пример?
| |
Тема
|
И през ум не ми мина да ги шерваш :)
[re: coolman]
|
|
Автор |
NikB (любопитен) |
Публикувано | 18.02.07 12:43 |
|
И през ум не ми мина да ги шерваш :)
Но правлото е сървъра да решава - в смисъл - да пита "твоята версия коя е" и т.н., защото версията на клиента може да не подозира, че с новата версия ще трябва (примерно) да се изпрати още един файл :)
А ако клиент/сървъра ти не е с универсални сокети, а с някаква по-засукана технология (в смисъл, нивото на универсалните сокети да не е достъпно) - може да ти се наложи да си организираш сокет специално за обноваванията. Това не е съществено :)
За теб не е проблем да си организираш файл трансфер по сокетите, нали?
Впрочем, преди година-две, когато на мой клиент/сървър броя на конектите нарастна (WinXP) се оказа, че има гадно ограничение на броя на сокетите, които са в процес на конектване - за щастие, по форумите на Win имаше доста писано по въпроса.
| |
Тема
|
Re: И през ум не ми мина да ги шерваш :)
[re: NikB]
|
|
Автор | coolman (Нерегистриран) |
Публикувано | 18.02.07 12:57 |
|
"За теб не е проблем да си организираш файл трансфер по сокетите, нали? "
Точно, това не знам как става
| |
Тема
|
А клиент/сървър приложението кой го е писал?
[re: coolman]
|
|
Автор |
NikB (любопитен) |
Публикувано | 18.02.07 13:27 |
|
А клиент/сървър приложението кой го е писал?
Ако не си ти (и не разполагаш със сорсовете) ще трябва да правиш отделно приложение за UpDate.
Разбира се, по аксиомата, че в интернет има всичко, което можеш да си пожелаеш, добре ще е първо да потърсиш нещо готово (така и така ще е отделно приложение).
Ако решиш да пишеш - клиенски сокет, сървърски сокет, връзка, измисляш си твой протокол (с "твои" команди за определяне на текущите версии, за прехвърляне на файлове и т.н.).
3-5 дни работа, ако знаеш сокетите и започнеш проекта от 0.
Ама за 2-3 компютъра - по-добре ползвай VNC, примерно, и ги ъпдейтвай ръчно.
| |
Тема
|
Re: Client/Server инсталация
[re: coolman]
|
|
Автор |
Beco_ (Boogie chillun) |
Публикувано | 19.02.07 09:44 |
|
Първата ти задача е да сравниш версиите на 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().
| |
Тема
|
Re: Client/Server инсталация
[re: Beco_]
|
|
Автор |
Beco_ (Boogie chillun) |
Публикувано | 19.02.07 09:58 |
|
От клиентската страна:
- Слагаш 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". Нещата са опростени заради яснота.
| |
Тема
|
Re: Client/Server инсталация
[re: Beco_]
|
|
Автор | coolman (Нерегистриран) |
Публикувано | 19.02.07 22:49 |
|
Благодаря, много на всички. Остава да го реализирам , но насоката беше важна
| |
|
|
|
|