Jump to content
¯\_( ツ)_/¯
  • TAD GROUP are currently hiring penetration testers. Please read the topic in Career Central subforum.
  • Sponsored Ad
ТУК НЕ СЕ ПРЕДЛАГАТ ХАКЕРСКИ УСЛУГИ ! ×
Sign in to follow this  
Avatara

Как да създадем собствен сървър ...

Recommended Posts

КАК ДА СИ НАПРАВИМ TCP КЛИЕН-СЪРВЪР СИСТЕМА ЗА ОБМЕН НА СЪОБЩЕНИЯ?

И така, време е да се завърнем към това, с което започнахме: КАК СЕ ПРАВИ ....

До тук внесохме малки пояснение как функционира мрежата. За пореден път искам да подчертая:

ВСИЧКИ КОДОВЕ, КОИТО ЩЕ БЪДАТ ПУБЛИКУВАНИ В ОТГОВОР НА ТОЗИ ВЪПРОС НЕ СА ПРЯКО ОБВЪРЗАНИ С КОНКРЕТНА ОПЕРАЦИОННА СИСТЕМА?

Това е мрежово програмиране. В случая предлагам решение за Windows, но всички функции и процедури без никакви изменения се използват и за Linux, UNIX, iOS, Android и още куп операционни системи, за много от които дори не сте чували.

Друг важен момент, на който искам да обърна внимание е, че

МАШИННАТА ЛОГИКА СЕ РАЗЛИЧАВА ДИАМЕТРАЛНО ОТ ЧОВЕШКАТА ЛОГИКА.

машинната логика е последователно и логично обоснована. Това се нарича "дигитализация" (има гръцки произход и няма нищо общо с дискретните процеси).

Ние ще следваме машинната, а не човешката логика.

И така ... Нека да започнем с най-важното:

КАКВО ИСКАМЕ ДА НАПРАВИМ?

1. Искаме да направим TCP сървър.

Това е нашата ОСНОВНА ЦЕЛ.

Дали този сървър ще е добър или негоден за нищо не е важно. Важно е да ползва TCP.

Какво обаче следва от тази основна цел?

1.1. Сървърът трябва да работи като приложение, а не като процес. Ние ще го ползваме за тестове и с образователна цел. Ако е като приложение ще може да го включваме и изключваме когато и както ни хареса.

1.2. Нужно е да получаваме информация за това какво се случва. Казано още по-просто: ДА СМЕ В СЪСТОЯНИЕ ДА СЛЕДИМ ВСИЧКИ ПРОЦЕСИ, КОИТО СЕ СЛУЧВАТ СЪС СЪРВЪРА.

1.3. Когато клиентът се свърже със сървъра ние трябва да получим информация за клиента. Тази информация трябва да ни казва от кой IP адрес се е свързал, кой порт ползва, кога се е случило това и т.н..

1.4. Трябва да получаваме информация, за броят на клиентите, които ползват сървъра.

1.5. Необходимо е да изпращаме уведомителни съобщения до ВСИЧКИ КЛИЕНТИ, които са свързани със сървъра. Това се нарича Broudcasting и е много важна функция, на която ще отделим специално внимание в последващите ни разглеждания.

1.6. Преди да бъде изключен сървърът всички клиенти, които го ползват трябва да бъдат коректно изключени и уведомени. 

Мисля, че това е достатъчно като начало.

Сега нека видим как се прави всичко, това.

Като начало е нужно да създадем следните папки:

 

TCP_CLIENT_SERVER 

  |_________ TCP_SERVER

  |_________ TCP_CLIENT

Това ще бъдат директориите, в които ще съхраняваме нашият проект (прилагам кодовете, така, че може просто да ползвате това, което е в архива, но ако сте решили сами да направите нещо е добре то да бъде добре структурирано/подредено).

Сега малко отклонение.

Примерите в архива са за OS Windows. За другите се ползва FireMonkey. Функциите обаче са си същие без разлика.

И така ...

В ТОВА КОЕТО ЩЕ НАМЕРИТЕ В АРХИВА Е ПРОЦЕДИРАНО ПО СЛЕДНИЯ НАЧИН:

File -> VCL Forms Application  ....

АКО ОБАЧЕ ДЪРЖИТЕ НА НАДПЛАТФОРМЕНО ПРИЛОЖЕНИЕ (да работи на Linux, iOS, Android, Windows и пр.) СЛЕДВАТЕ ПОСЛЕДОВАТЕЛНОСТТА:

File ->  Multi-Devise Application -> Blank Application ... след което си избирате операционната система, за която ще го правите.

Pic_001.jpg.6077f7e6f8d8669e629c319bada0483f.jpg

 

Съветът, който мога да ви дам и който се базира на дългогодишен опит е: ПЪРВО ГО НАПРАВЕТЕ ЗА WINDOWS ТАКА, ЧЕ ДА РАБОТИ БЕЗ ПРОБЛЕМИ!

Ако сте се справили с тази задача всичко друго е не само много лесно, но и няма да имате никакви проблеми с преноса. 

Следващата стъпка е да създадем нашият сървър.

В това няма нищо сложно. Просто на формата поставяме няколко визуални компомента както следва: два компонента TPanel; три компонента TButton; три компонента TLabel; един компонент ТМемо и един компонент TIdTCPServer, така както е показано на изображението.

 

Pic_002.jpg.9dafc432ee4b966c29b7bb9d873080c2.jpg

 

Тук отново се налага да направя малко отклонение.

Много често в internet ще прочетете мнението на всякакви "експерти" които надълго и нашироко ще ви обясняват как използването на визуални компоненти правело приложението по-бавно и, че това не бил "правилния начин". За съжаление това е поредната заблуда, която масово се тиражира. 

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

Но нека да продължим ...

НИЕ СЪЗДАДОХМЕ НАШИЯТ СЪРВЪР!

Прекрасно, но ...

ВЪПРЕКИ, ЧЕ РАЗПОЛАГАМЕ С НАПЪЛНО ПЪЛНОЦЕНЕН СЪРВЪР, ТОВА НЕ ОЗНАЧАВА, ЧЕ ТОЙ ЩЕ РАБОТИ ТАКА КАТО НА НАС НИ СЕ ИСКА! 😊

Преди обаче да пристъпим към истинската работа ще направим и клиента, който ще се свързва със сървъра.

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

 

Pic_003.jpg.6576c7a7f25b72a4730b95f9de1b32aa.jpg

 

Тук имаме два нови компонента, както следва TIdTCPClient и TIdThreadComponent.

Разбира се, че двата проекта (TCP_Server и TCP_Client) ще бъдат записани в различни папки, за да не допускаме грешка.

ВАЖНО!

Delphi предоставя възможността отделните проекти да бъдат обединявани в групи. Това е много голямо предимство, когато имате проект от клас A или АА и се налага да обедините повече от едно приложение. За сега обаче ще оставим този въпрос за едни по нататъшни разглеждания и ще се концентрираме върху мрежовото програмиране. По-късно ще обясня как да обединим двата проекта (сървъра и клиента) в един общ.

Преди да продължим последователно компилираме така създадените приложения за да видим как изглеждат.

Pic_004.thumb.png.f9a5c7803c12e2245b879f4e87a73ccf.png

 

Както виждате изглеждат доста прилично. Но предполагам, че тук ще възникне уместният въпрос:

АЛООООО. НЕЩО ПРЕМЪЛЧАВАШ. ЗАЩО АЗ КАТО ГИ ПРАВЯ НЕ ИЗГЛЕЖДАТ ТАКА, А?

И мисля, че ще бъдете напълно прави. 

Аз просто ползвам стилове. Тези стилове, силно наподобяват познатите ви CSS, но става дума за нещо много по-различно. 

НАЙ-МНОГО ТРУД Е НЕОБХОДИМ, КОГАТО ТРЯБВА ДА НАПРАВИТЕ ДОБРО ИНТЕРФЕЙСНО РЕШЕНИЕ ЗА КРАЙНИТЕ ПОТРЕБИТЕЛИ!

То не просто трябва да е красиво, но и трябва да е функционално. Не забравяйте, че ако желаете да продадете това, което правите то трябва да привлича клиенти. Стиловете имат точно тази задача. Те могат да направят едно приложение да изглежда различно. 

В използването на стилове няма нищо сложно. След като сте създали приложението си следвате последователността:

 

Project -> Options -> Application ... Тук си избирате иконка за приложението.

 

Pic_005.jpg.2f9e5905d68ab74878895227c66f107d.jpg

 

Project -> Options -> Application -> Appearance ... Тук си избирате стил, който ще ползвате във вашето приложение.

 

Pic_006.jpg.0d58930a54e522f1b449f880532a16f9.jpg

Важно е да знаете, че може да предоставите на крайният потребител повече от един стил. По този начин, той би могъл да избира как да изглежда приложението. Понякога това погрешно се нарича "Skin"(кожа). Правилно е да се нарича "СТИЛ" защото включва доста елементи, за които ще говорим по-късно.

 

ВАЖНО!

Предполагам, че на някой му е направило впечатление, че в Delphi Compiler има опция Output - C/C++

Това е много ценна възможност, защото ви позволява да заблудите де що е експерт, че най-яките приложения се правят на ... C++ (или C# или каквото е модерно).

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

 

И така след като се справихме с интерфейса е нужно да накараме нашето приложение да заработи така както НИЕ ИСКАМЕ.

Преди обаче да пристъпим към таи важна задача е редно да повторим една основна максима:

ИНТЕРФЕЙСЪТ СЕ ПОДЧИНЯВА НА ФУНКЦИОНАЛНОСТТА НА ПРИЛОЖЕНИЕТО!

Първо в детайли го разработвате, а след това към всеки един от елементите добавяте кода, който го управлява.

 

Изходните кодове и изпълнимите файлове може да изтеглите от този архив:  Lesson_004A.rar  или на адрес: http://g-92.com/LESSONS/

 

В следващите разглеждания ще обсъждаме всеки един елемент на изходните кодове.

 

 

 

 

Share this post


Link to post
Share on other sites

... И така нека да пристъпим към най-важното: КАК ДА НАКАРАМЕ НАШИЯТ СЪРВЪР ДА РАБОТИ?

 

Като начало е нужно да направим следната декларация:


const
  // Listening port
  GUEST_CLIENT_PORT = 20010;

var
  ServerForm: TServerForm;

implementation

{$R *.dfm}
 

Важно е да се знае, че когато клиентът се свърже със сървъра, това е порта, през който те ще комуникират.

Друга особеност е как да определим, кога се е случило едно или друго събитие на сървъра. За целта създаваме следната функция:

// 1. GET NOW DATE TIME
function TServerForm.GetNow() : String;
begin
    Result:= FormatDateTime('hh:nn:ss.zzz', Now) + ' ms';
end;

Важно е да знаете, че В НАЙ-ЛОШИЯТ СЛУЧАЙ НИЕ ЩЕ РАБОТИМ НА МИЛИСЕКУНДИ.

Знам, че в UNIX и Linux се вярва, че секундата е най-малката времева единица, но това просто не е вярно. 

АКО СТЕ ИСТИНСКИ ПРОФЕСИОНАЛИСТИ ЩЕ РАБОТИТЕ И В МИКРО И НАНО СЕКУНДИ!

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

И така ... ВРЕМЕ Е ДА АКТИВИРАМЕ НАШИЯТ СЪРВЪР.

// ON START BUTTON CLICK
procedure TServerForm.StartButtonClick(Sender: TObject);
begin

    // Clear the Bindings property ( ... Socket Handles )
    TCPServer.Bindings.Clear;

    // Bindings is a property of class: TIdSocketHandles;
    // Add listening ports.
    // Add a port for connections from guest clients.

    TCPServer.Bindings.Add.Port:= GUEST_CLIENT_PORT;

    // Active the Server.
    TCPServer.Active:= TRUE;

    // Message log.
    DebugMemo.Lines.Add('[ ' + GetNow() + ' ] - Server started.');

    SetButtons;

    StatusLabel.Font.Color:= clSkyBlue;
    StatusLabel.Caption   := 'Server ON';

end;
 

Мисля, че тук няма нищо сложно. Просто установяваме свойството Active на TIdTCPServer в TRUE. Преди това обаче изчистваме всички глупости и задаваме порта, посредством който ще осъществяваме комуникация с клиентите.

Може би си мислите, че след като сме направили това всичко ще работи. Грешите. Нищо няма да се случи. ☺️

Дори сървърът ще откаже да се стартира. 

За да сработи сървъра е нужно да кажем КАКВО ЩЕ СЕ СЛУЧИ, КОГАТО СЪРВЪРЪТ ЗАПОЧНЕ ДА РАБОТИ!

 

Pic_007.jpg.600e9458288e9b9f2c9988cca3ebd7de.jpg

 

 

// ON SERVER EXECUTE
procedure TServerForm.TCPServerExecute(AContext: TIdContext);
var
    Port: Integer;
    PeerPort : Integer;

    PeerIP: String;

    MsgFromClient: String;
    MsgToClient: String;

begin

    // OnExecute is a TIdServerThreadEvents event handler used to execute
    // the task for a client connection to the server.

    // Received a message from a client

    // Getting IP address, Port and PeerPort from Client that connected
    Port         := AContext.Binding.Port;
    PeerIP    := AContext.Binding.PeerIP;
    PeerPort:= AContext.Binding.PeerPort;


    // Get message from client
    MsgFromClient:= '[ ' + GetNow() + ' ] - ';
    MsgFromClient:= MsgFromClient + 'Port: ' + IntToStr(Port) + '; ';
    MsgFromClient:= MsgFromClient + 'Peer IP: ' + PeerIP + '; ';
    MsgFromClient:= MsgFromClient + 'Peer Port: ' + IntToStr(PeerPort) + ' ';
    MsgFromClient:= MsgFromClient + 'CLIENT MESSAGE > ';

    MsgFromClient:= MsgFromClient + AContext.Connection.IOHandler.ReadLn;

    DebugMemo.Lines.Add(MsgFromClient);

    // Send response from Server to Client
    MsgToClient:= 'Response from server ...';
    AContext.Connection.IOHandler.WriteLn( msgToClient );

end;

 

Тук има два много специфични момента. 

- Прочитане на съобщение, получено от сървъра и изпратено от краен клиент - AContext.Connection.IOHandler.ReadLn;

- Изпращане на съобщение изпратено от сървъра към краен клиент - AContext.Connection.IOHandler.WriteLn( msgToClient );

Обърнете внимание, че в кода е използвано IOHandler, а не Socket.

ВМЕСТО SOCKET АЗ ПОЛЗВАМ ОБРАБОТЧИК НА ВСИЧКО КОЕТО КАСАЕ ВХОДА И ИЗХОДА (Input/Output Handler)!

Това е много по-добро решение поради куп причини. 

Спомняте ли си когато обсъждахме socket-тите какво споменах? 

В тези разглеждания изрично споменах, че СЪЩЕСТВУВАТ РАЗЛИЧНИ ВИДОВЕ СОКЕТИ.

Също така споменах, че "сивите" сокети СА МНОГО БЪРЗИ (спомняте ли си за бързодействието и за визуалните компоненти). 

Изборът на подходящ сокет, а не гениалността на програмния код определя бързодействието на комуникацията.

Обработчика на входа и изхода ( Input / Output Handler ) позволява да използвате какъвто ви харесва източник за вход и какъвто ви харесва начин за изход. 

На практика вие извършвате обмен на "СИВИ TCP" данни.

Това означава, че всички операции свързани с входа и изхода, които стандартно ползват сокети ще се обслужват от TIdIOHandlerSocket по подразбиране.

Всеки един TCP клиент притежава свойство IOHandler.  

Дори да не сте указали какъв IOHandler ще ползвате, автоматично ще се създаде TIdIOHandlerSocket.

TIdIOHandlerSocket реализира всички операции свързани с входа и изхода, като използва TCP soket.

Pic_008.jpg.a74430cea48638362bf96830f5a0dc1e.jpg

 

На практика използването на IOHandler предоставя възможности, за които само бихме могли да мечтаем ако се придържахме към класическите решения.

 

Edited by Avatara

Share this post


Link to post
Share on other sites

За тези, които имаха конкретни въпроси относно V-Server ...

След като си разархивирате пакета и го стартирате, имате само един активен бутон - този за избор на начална странница. Дали ще е index.html, mypage.html или някаква друга няма значение. Просто я изберете за да се зареди във web брокера.

V_001.png.560e90485fa84fbf63f993a46b8ee3ec.png

Ако точно тази странница или основна директория, която си избрал не ти допада към момента ще се наложи да затвориш приложението. Важно е да се отбележи, че директорията, в която се съхранява файла, който си избрал, ще се счита за root директория. Имай в предвид, че може и да е на флашка или външен диск. Все тая. В нормалните версии (все пак тази е само учебна) може даже да е някъде на друг сървър. Важно е да има web документ.

V_002.png.40bf8f8bf2b06c3f4d98e2fbdbd20336.png

 

За демонстрация е включен сървърен метод Inverse String. За методите ще си говорим по-късно. Не са като скриптовете. Много различно е.

V_004.png.aed921608400a192a764f7f7e54af81d.png

Тествах с Еdge, Chrome, Mozilla, Safari. Няма проблем с браузъри UTF-8 и други кодировки (дори web-дизайнера да е омазал всичко пак го коригира).

За използваните СУБД, вече знаеш. Поддържа всичко де що е структоритрано и ползва SQL, както и всички неструктурирани. 

Дерзай. 😉

 

 

  • Like 1

Share this post


Link to post
Share on other sites

ДА РАЗБИЕМ НАЙ-ГОЛЯМАТА ЗАБЛУДА ...

Братя и ... сестри (ако тук има такива),

Дойде време да разбием най-голямата заблуда. Заблудата за "суперсложната разработка на суперсложните сървъри". 

Имайте в предвид, че визирам REST сървъри, които ползват най-големите компании в света, като Google, Microsoft, Yandex, IBM, Oracle и др..

Визирам онези "мега, ама мега сложни технологии, които изискват специализиран хардуер и тълпа от експерти за техническа поддръжка".

Уважаеми колеги,

ЛЪЖАТ ВИ!

Лъжат ви нагло и безочливо. Разработката на сървъри е нещо елементарно и не изисква кой знае какви познания. Разработката на крайни приложения обаче е кошмар.

Може би си мислите, че пиша някакви глупости без покритие? Грешите. Време е да разбием мита, в който все още вярват мнозина.

Като начало нека видим ... как може да си направим "мега" сървър, който "... да върши работата на Google, Yandex, Bing и де що е търсачка взети заедно", но ... много по добре и без дразнещи дивотии, като повторение на един и същи резултат по хиляда пъти (примерно).

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

Повярвайте трима от колегите ви тук вече го направиха и сега искат още (някои дори задълбаха в дебрите на сървърните методи и то много здраво, но това е друга тема).

Като начало нека да видим колко код ще се наложи да напишем за да създадем REST-сървър, който да поддържа до 50 000 клиента, които са решили да се закачат към него за да видят дали наистина работи.

Искам да подчертая, че сега ще разгледаме САМО И ЕДИНСТВЕНО КОДЪТ НА СЪРВЪРА И НИЩО ДРУГО.

Модулите за СУБД, контейнерите, системните настройки, филтрите и другите благини, ще оставим за един по-късен етап, когато ве видим "как се прави сървър-чудовище" и какво следва от това.

Искам само да спомена, че нашето малко "чудо" ще бъде в състояние да работи с всякакви СУБД (DB2, Intrabase, MS SQL, Firebird, ORACLE, My SQL и pr.), както и с де що е неструктурирана плява. И понеже и това ни е малко ще го накараме да ползва data mining методи, за които онези от Google само могат да мечтаят. Така де. Нека им докажем, че в България не ядем домата с колците.

И така стига празни приказки. Практиката е най-великия учител.

 

1. ИЗБОР НА ПЛАТФОРМА ЗА РАЗРАБОТКА

Знам какво биха казали мнозина - Linux и нищо друго!

Повярвайте ще бъдат напълно прави. 

Предимствата, които Linux предлага, като сървърна ОС, са безспорни, но нашата цел е ДА СЕ УЧИМ ДА СЪЗДАВАМЕ ВИСОКО НАДЕЖДНИ УНИВЕРСАЛНИ РЕШЕНИЯ.

Съгласете се, че никога няма да се научите да плувате, ако през цялото време стоите във вода, която достига до коляното ви. За да станете добри плувци ще се наложи да се гмурнете надълбоко.

И така ...

Като среда за разработка ще ползваме Windows (32/64 бит).

След като приключим с разработката, абсолютно същият код ще пренесем на Android и iOS (за което ще се наложи да ползваме сложната последователност от команди - copy/paste). 

Важно е да се научим да работим с потоци (нишки, при това динамично създадени), да синхронизираме работата между тях (когато са повече от един, но с еднакъв приоритет) да видим какво е това "критична секция" и защо е нужно да я използваме, както и много други неща, за които няма да прочетете в internet, а и никой няма да ви каже.

 

2. ИЗБОР НА ЕЗИК ЗА ПРОГРАМИРАНЕ

А, а, а, а, а тук е ясно - C++, C# или Python. Е може и Java, ама ...

Това вероятно ще е въпросът, който неминуемо ще предизвика скандал и определено ще накара мнозина да ме намразят.

НЕ! НИТО ЕДИН ОТ ИЗБРОЕНИТЕ ЕЗИЦИ !

АЗ СЪМ МЪРЗЕЛИВ ИНДИВИД, А И СЪМ ДОСТА СТИСНАТ !

Защо да си губя времето в писане на глупости, последващо тестване и тежки процедури по сертифициране и документиране (за рефакторинга няма да говоря)?

Това беше като бях млад, красив, и ... глупав (макар да не помня да съм бил красив, но да не издребняваме)

Мдааа ...

Ще използваме RAD Studio и любимият на цяло поколение "динозаври" Delphi. 

А защо точно Delphi ... ще обсъдим в процеса на разглежданията и повярвайте някои от нещата, които ще видите са доста ... любопитни.

Пак повтарям, че няма да ги намерите в internet. Там има всякакви други дивотии, но да не коментираме глупостите, които често се тиражират в мрежата.

И така да пристъпим към ...

 

3. РЕАЛИЗАЦИЯ

Искаме следните неща:

1. Сървърът да работи като приложение - Това няма да изисква да изключваме апаратната част, ако го направим като dll-библиотека или като процес.

2. Приложението трябва да позволява визуализация на протичащите процеси в реално време - Идеята е да виждаме всичко, което се случва. Все пак това е учебен сървър и служи като пособие, подпомагащо образователния процес.

3. Дори потребителят да бъде най-голямото говедо, това нещо да не забива и да си работи, както се очаква от него - Това е трудно изпълнимо, особено, ако някой е решил да залее монитора с бира или клавиатурата с кафе, но поне ще опитаме.

 

За да изпълним някои от условията написваме следният ужааааааааасно дълъг код:


{------------------------------------------------------------------------------}
{                                                                                                                                             }
{                                     V-SERVER CONTROL FUNCTIONS                                           }
{                                                    (Windows Version)                                                       }
{                                                                                                                                             }
{                       author: Georgi Todorov Gerasimov (CSA NGIT)                                   }
{                       personal ID: SPSS-GD92-SMSA-6192                                                  }
{                                                                                                                                             }
{                                        e-mail: g.gerasimov@g-92.com                                            }
{                                                                                                                                             }
{                                                   Date: 07.04.2016                                                           }
{                                                            Bulgaria                                                                  }
{                                                                                                                                             }
{         Copyright(c) 2010-2018 G-92 Developers Group. All rights reserved.          }
{                                                                                                                                             }
{------------------------------------------------------------------------------}

// 1. TERMINATE THEADS
procedure TerminateThreads;
begin
  if TDSSessionManager.Instance <> nil then TDSSessionManager.Instance.TerminateAllSessions;
end;


// 2. SET SYSTEM BUTTON STATUS
procedure TControlPanelForm.ButtonStatus;
begin

    StartButton.Enabled:= not VServer.Active;

    StopButton.Enabled:= VServer.Active;
    WebButton.Enabled := VServer.Active;

    ProcessIndicator.Enabled:= VServer.Active;

end;

 

МАЛКО АНАЛИЗИ ...

Процедурата TerminateThreads има една единствена основна цел - да затвори всички отворени сесии (ако има такива), когато някой реши да излезе от приложението по идиотски начин.

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

 

 

{------------------------------------------------------------------------------}
{                                                                                                                                             }
{                                         V-SERVER FORM FUNCTIONS                                              }
{                                                    (Windows Version)                                                       }
{                                                                                                                                             }
{                       author: Georgi Todorov Gerasimov (CSA NGIT)                                   }
{                       personal ID: SPSS-GD92-SMSA-6192                                                  }
{                                                                                                                                             }
{                                        e-mail: g.gerasimov@g-92.com                                            }
{                                                                                                                                             }
{                                                   Date: 07.04.2016                                                           }
{                                                            Bulgaria                                                                  }
{                                                                                                                                             }
{         Copyright(c) 2010-2018 G-92 Developers Group. All rights reserved.          }
{                                                                                                                                             }
{------------------------------------------------------------------------------}

// 1. ON FORM CREATE
procedure TControlPanelForm.FormCreate(Sender: TObject);
begin
    EditIPAddress.Text:= GetIPAddress;
    VServer:= TIdHTTPWebBrokerBridge.Create(Self);
end;


// 2. ON FORM SHOW
procedure TControlPanelForm.FormShow(Sender: TObject);
begin
    // TCP_Connections:= TObjectDictionary <TIdTCPConnection, TDSTCPChannel>.Create;
    DebugMemo.SetFocus;
end;

 

МАЛКО АНАЛИЗИ ...

В процедурата FormCreate(Sender: TObject) указваме какво трябва да се случи, когато създаваме формата на контролния панел. В конкретният случай трябва да вземем текущото IP на компютъра, на който е инсталиран сървъра. Искам да отбележа, че не е задължително това да е IP-адреса, който ще се вижда от любопитковците. Това ни е нужно за да си вършим работата.

По важно е в случая какво прави  VServer:= TIdHTTPWebBrokerBridge.Create(Self) ?

Ами какво прави - СЪЗДАВА REST СЪРВЪР КАКЪВТО НИ Е НУЖЕН.

Това, че го създава, не означава, че ще го пусне да работи. Няма да го пусне. Ще го пуснем да работи, когато ние искаме, а не когато пуснем приложението. Това важи и за спирането.

 

В процедурата FormShow(Sender: TObject) ще укажем какво ще се случи, когато формата се визуализира на монитора. Обърнете внимание, че това е процес, който следва (логично) този на създаването й.

Тук имаме един безкрайно интересен ред:

 TCP_Connections:= TObjectDictionary <TIdTCPConnection, TDSTCPChannel>.Create;

В те това ще го намерите къде ли не в internet и всички ще се кълнат, колко е cool и как ефективно работи.

Хайде сега да помислим. Защо точно това сме го сложили в коментар? Защо се отказваме от това гениално прозрение на програмиската мисъл?

Това, колеги на разбираем език се нарича "РЕЧНИК НА ОБЕКТИТЕ".

Повярвайте това наистина е много полезен инструмент, но в нашия случай изрично подчертахме, че като апаратна платформа ЩЕ ИЗПОЛЗВАМЕ НЯКОЯ ДЪРТА ЩАЙГА ЗА ОКОЛО 200 ЛЕВА, КУПЕНА НА СТАРО !

Какво означава това?

Най-вероятно някой Pentium и max.4 GByte RAM, бавен диск и ревящо на умряло захранване.

Ако използваме речник на обектите за съхранение на информацията за TCP-връзките и отворените сесии ще ни трябва нещо по-добро. Но нали не сте забравили, че искахме да обслужим до 50 000 клиента?

Налага се да мислим различно. Повярвайте различното мислене е тежък и неблагодарен процес.

Ако ползваме речник на обектите ще съхраняваме всичко, свързано с работната сесия, до момента на нейното приключване. Добре, но реално колко от информацията ни е нужна? Оказва се, че ни трябва много малко да да си вършим работата, а всичко друго е баласт, известен като "информационен шум". 

Защо Да ползваме речник на обектите, когато сървърът ни е изграден на Data Snap технология? 

Извинявайте, но това е като да имате последен модел Ferrari и да впрегнете кон да го тегли, защото не познавате нещо по различно от селска каруца.

Така не става. След като имаме Data Snap просто ще я използваме.

За да се случи това поставяме това уродливо изчадие на ООП в коментар и насочваме фокуса към извеждането на оперативна информация за протичащите процеси.

 

{------------------------------------------------------------------------------}
{                                                                                                                                             }
{                                         V-SERVER PROCESS FUNCTIONS                                        }
{                                                    (Windows Version)                                                       }
{                                                                                                                                             }
{                       author: Georgi Todorov Gerasimov (CSA NGIT)                                   }
{                       personal ID: SPSS-GD92-SMSA-6192                                                  }
{                                                                                                                                             }
{                                        e-mail: g.gerasimov@g-92.com                                            }
{                                                                                                                                             }
{                                                   Date: 07.04.2016                                                           }
{                                                            Bulgaria                                                                  }
{                                                                                                                                             }
{         Copyright(c) 2010-2018 G-92 Developers Group. All rights reserved.          }
{                                                                                                                                             }
{------------------------------------------------------------------------------}


// 1. START V-SERVER
procedure TControlPanelForm.StartServerActionExecute(Sender: TObject);
var
  S: String;

begin

    InitParams;

    S:= StartPageEdit.Text;

    if S = '' then
      begin
        S:= 'templates\index.html';  // Ако не щете да си избереше нещо различно си караме по стандартния ред.
        StartPageName:= S;
        LoadProjectButton.Enabled:= FALSE;
      end;


    try

      with VServer do
        begin

          if not Active then
            begin
              Bindings.Clear;
              DefaultPort:= StrToInt(EditPort.Text);
              Active:= TRUE;
            end;

        end;

    except
      Exit;
    end;

    ButtonStatus;

    S:= GetDateTimeAsString + ' ... ';
    S:= S + 'Start server';

    DebugМemo.Lines.Add(S);

end;


// 2. STOP V-SERVER
procedure TControlPanelForm.StopServerActionExecute(Sender: TObject);
var
  S: String;

begin

    try

      TerminateThreads; // Бастисваме де що е отворена сесия, за да ни е мирна главата.

      with VServer do
        begin
          Active:= FALSE;
          Bindings.Clear;
        end;

    except
      Exit;
    end;

    ButtonStatus;

    S:= GetDateTimeAsString + ' ... ';
    S:= S + 'All sessions terminated.';  // Да се знае, че всички сесии са бастисани.
    DebugМemo.Lines.Add(S);

    S:= GetDateTimeAsString + ' ... ';
    S:= S + 'Stop server.';
    DebugМemo.Lines.Add(S);

    InitParams;

end;


// 3. OPEN BROWSER
procedure TControlPanelForm.OpenBrowserActionExecute(Sender: TObject);
var
  ServerURL: String;

begin

  ServerURL:= Format('http://localhost:%s', [EditPort.Text]);

 // Ей това нещо долу, отваря браузъра, който ви е по подразбиране и ви показва какви сте ги надробили ...

  ShellExecute(0, nil, PChar(ServerURL), nil, nil, SW_SHOWNOACTIVATE); 

end;


// 4. SELECT START PAGE
procedure TControlPanelForm.SelectStartPageActionExecute(Sender: TObject);
begin

    if VServer.Active then Exit;

    try

      with LocalFile do
        begin

          FileName:= '';
          FunctionIndex:= 1;
          Execute;

          if FileName = '' then FileName:= 'templates\index.html';

          StartPageEdit.Text:= FileName;

          StartPageName:= StartPageEdit.Text;

        end;

    except
      Exit;
    end;

    LoadProjectButton.Enabled:= FALSE;
    StartButton.Enabled:= TRUE;

end;


end.

 

Последни четири процедури и сървърът ни е напълно готов за употреба.

Ама какво не сте разбрали?

Пускаме сървъра. Спираме сървъра. Ако искаме да видим какво ще видят потребителите в internet, като наберат URL-a имаме си бутонче, което даже ще ни отвори браузъра и ще зареди каквото е нужно та да се не мъчим.

Що се отнася до избора на начална странница (абе, не е задължително да се казва index.html, може да се казва mnogo_cool_page.skrito_pokrito, или каквото се сетите и с каквото си желаете разширение, все тая)  вече съм писал. Може да наврете файловете където и както желаете, дори на място, за което не е прието да се споменава. Web Broker-а ще го изчете и ще го преведе в разбираем за браузърите вид.

С това работата ни приключи.

Разполагаме със супер мощен REST сървър с доста интересни възможности, за които някои от тук присъстващите могат да ви разкажат.

Надявам се да съм бил полезен и да имате конкретни въпроси. С радост ще отговоря.

 

Забележка: Този сървър е доста старичък. На две години е. Сега сме много по-напред, но нали трябва да се научим.

Имате право да ползвате кодовете където и както ви харесва.

Това е истински "ОТВОРЕН КОД", а не онези дивотии, за които в един момент започват най-нагло разни "червени шапчици" и други подобни да ви искат пари.

За този код никой и по никакъв повод (освен лично аз) няма право да ви поиска и стотинка (а аз няма да ви поискам).

Ако някой се опитва да ви иска пари или да ви предявява права, че сте ползвали кодовете информирайте ме.

Вече имаме две много големи компании, които получиха доста сериозни санкции за подобни своеволия.

Ако нещо е забранено за ползване (или не е мое) просто няма да го публикувам, а още по-малко да го обсъждам тук.

 

Edited by Avatara
  • Thanks 1

Share this post


Link to post
Share on other sites

Най якото на V-Server е възможността да ползвате  Dynamic DNS Host Name.  

Не знам дали схващате що за благина е това, но ако се замислите няма как да не разберете, че това много мощен инструмент, с който може да си направите on-line радио, телевизия или каквото се сетите. 

Само имайте в предвид, че ако сте на "неограничен трафик" провайдерът ви леко ще се изнерви. 😉 

А за това как да си гарантирате неограничен трафик за мобилни услуги съм писал. Нарича се TTL и върши прекрасна работа.

А сега си представете как обръщате таблета си (примерно, защото и със смартфон става) на ... сървър. Мъничък сървър, но съвсем истински. 😉

При това не нарушавате закона.

Никъде не е казано къде и как може да разполагате сървъра си.

Правно регламентирано е само какво съдържание нямате право да ползвате.

Няма да коментирам дали може да се променя IMEI или да се избира конкретна клетка. Това не е тема на дискусията. 😉

Хайде сега да помислим какво може да се направи. Досетихте ли се?

Като начало може да си спретнете анонимен пощенски сървър или анонимен чат. Може и други неща.

Например можете да си пуснете on-line фотоалбуми (само каките да са прилично облечени) или нещо като аматьорско yotube, с видео от вашия смартфон.

  • Like 1

Share this post


Link to post
Share on other sites

Малка илюстрация към въпроса на Kestena ...

 

V_005.png.83b5c520abaaa02b66d89ddcee537a15.png

 

Тук IP адресът на сървъра съвпада с този на клиента, но не това е важно.

На практика след като сесията е налична сървърът получава много добра информация за клиента, но и обратното е вярно.

Ако бях ползвал Dinamic Host Name в полето referer щеше да пише http://mysite.com или нещо подобно.

Сесийният номер (Session ID) е нещо много различно от IP адреса.

Методът е вида на заявката, която сървъра изпълнява в рамките на текущата сесия.

Най-хубавото на REST сървърите е, че като ти изпълнят заявката всичко което трябва да се затвори се затваря без много приказки.

По този начин няма какво да му мисли за памет, за претоварване на процесори и прочие дивотии.

Между другото сървърът от картинката е този, чиито код съм публикувал.

V_008.png.66047d72164c2a1c1678d8782d93ba8e.png

 

Другото е web-дизайн и полет на фантазията ... 😉

 

 

Edited by Avatara
  • Like 1

Share this post


Link to post
Share on other sites

КАКВО Е ДИНАМИЧЕН ДЕСКРИПТОР И ЗА КАКВО СЛУЖИ?

Това е изключително мощен инструмент, когато се налага да се създават сървърни приложения от клас A и АА. 

В най-обобщения си вид динамичните дескриптори изглеждат така:

<#CustomTag Param1=SomeValue "Param2=Some Value with Spaces">

Важно е да запомните нещо много важно:

БРАУЗЪРИТЕ НЕ ИЗПЪЛНЯВАТ ДЕСКРИПТОРА.

Браузърите са "тънък клиент" и нищо повече. Дескрипторите се изпълняват от сървъра. 

Как изглежда това "отвътре".

Да кажем, че имате следния код:

<HTML>
<HEAD>
<TITLE> Мy Cool Homepage </TITLE>
</HEAD>
<BODY>
Howdy
<#Name> ! Thanks for stopping by my web site !
</BODY>
</HTML>

В обработчика на събития на Page Produces-a добавяме следната проверка:

if TagString = 'Name' then ReplaceText := 'Partner';

Горният код изпълнява нещо много елементарно. 

Кoгато в HTML  срещне <#Name> ще го замени със символния низ Partner (или с каквото ни харесва).

В резултат на това, браузърът ще види следния код:

<HTML>
<HEAD>
<TITLE>My Cool Homepage</TITLE>
</HEAD>
<BODY>
Howdy
Partner ! Thanks for stopping by my web site !
</BODY>
</HTML>

 

Може да го замени например и с нещо по-сложно, като:

<a href="cool_images.asp">Partner</a>

if TagString = 'Name' then ReplaceText := '<a href="cool_images.asp">Partner</a>';

и тогава браузърът ще види следното:

<HTML>
<HEAD>
<TITLE>My Cool Homepage</TITLE>
</HEAD>
<BODY>
Howdy
<a href="cool_images.asp">Partner</a> ! Thanks for stopping by my web site !
</BODY>
</HTML>

 

Може и с други неща в т.ч. и някакъв скрипт.

Edited by Avatara

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.