Аппараттық және бағдарламалық қамтамасыз етуді орнату

Delphi-де Indy көмегімен клиент-сервер қосымшаларын әзірлеу. Delphi-де қолданылатын Indy компоненттері

Бір сөзбен айтқанда, Indy - бұл компоненттер ыңғайлы жұмыстанымал интернет протоколдарымен. Олардың жұмыс істеу принципі блоктау режимінде розеткаларды пайдалануға негізделген. Инди қызықты және ыңғайлы, себебі ол абстракцияланған. Ал Indy тіліндегі бағдарламалау сызықтық бағдарламалауға түседі. Айтпақшы, аударылған мақала интернетте кеңінен таралып жатыр, онда «блокировка режимі шайтан емес» деген сөздер бар :)) Бір кездері бұл аударма мені қатты қызықтырды. Мақала Гувер мен Хариридің «Инди тереңдігі» кітабының бір бөлігі. Негізінде, Indy-мен жұмыс істеу үшін оның барлығын оқудың қажеті жоқ, бірақ мен сізге Интернет протоколдарының принциптерімен танысуды ұсынамын. «Ібіліс» режиміне келетін болсақ. Бұғаттау розеткасының қоңырауы өз тапсырмасын орындамайынша шынымен қайтарылмайды. Қоңыраулар негізгі ағында жасалған кезде қолданба интерфейсі ілінуі мүмкін. Бұл жағымсыз жағдайды болдырмау үшін үнділік әзірлеушілер TIdAntiFreeze компонентін жасады. Оны пішінге тастау жеткілікті - блоктау қоңырауларын орындау кезінде пайдаланушы интерфейсі тыныш қайталанады.

Сіз Delphi-дегі әртүрлі «Indy (...)» қойындыларының мазмұнымен бұрыннан таныс болған шығарсыз. Көптеген компоненттер бар және олардың әрқайсысы пайдалы болуы мүмкін. Мен өзім олардың барлығымен жұмыс істеген жоқпын, өйткені мен оларды нақты тапсырмасыз зерттеудің қажеті жоқ деп есептеймін.

Delphi базалық дистрибуциясына пеннилері бар Indy v.9 кіреді. Бірден көбірек жаңартқан жөн болар жаңа нұсқасы(мысалы, менде қазір 10.0.76 бар, бірақ кейінгілері де бар).

Бірдей протоколдармен жұмыс істеу үшін клиент пен сервер құрамдастары бар. Indy розеткаларда бірдей функционалдылықты дамыту опциясынан айырмашылығы, қолданбаларды әзірлеуді шынымен жеңілдетеді. Мысалы, серверге қосылу үшін Connect әдісін шақыру жеткілікті. Сәтті қосылым орнату ерекшеліксіз әдістен қайтару арқылы белгіленеді. Егер қосылым орнатылмаса, ерекше жағдай шығарылады.

«Академиялық» мысал (код жұмыс істемейді, оны іске қоспаңыз :)):

IndyClient көмегімен жасаңыз
баста
Хост:= "test.com";
Порт:= 2000;
қосу;
тырысу
// деректермен жұмыс (оқу, жазу...)
ақырында
Ажырату;
Соңы;
Соңы;

Хост пен портты нысан инспекторында немесе орындалу уақытында орнатуға болады.

Тапсырмаларды талдауда Indy компоненттерін не үшін пайдалануға болады? Қолданба әртүрлі! Ең қарапайымы - IdHTTP компоненті арқылы бет мазмұнын алу (бәрі мұнымен кездескен болуы мүмкін):

Var
rcvrdata:TMMemoryStream;
idHttp1: TidHttp;
баста
idHttp1:= TidHttp.Create(нөл);
rcvrdata:= TMemoryStream.Create;
idHttp1.Request.UserAgent:= "Mozilla/4.0 (үйлесімді; MSIE 5.5; Windows 98)";
idHttp1.Request.AcceptLanguage:= "en";
idHttp1.Response.KeepAlive:= true;
idHttp1.HandleRedirects:= true;
тырысу
idHttp1.Get(Edit1.Text, rcvrdata);
ақырында
idHttp1.Free;
Соңы;
rcvrdata.Size > 0 болса, бастаңыз
ShowMessage("Алынған" + inttostr(rcvrdata.Size));
rcvrdata.SaveToFile("c:\111.tmp");
Соңы;
rcvrdata.Free;
Соңы;

Көріп отырғаныңыздай, сіз беттің мазмұнын алып қана қоймай, нақты клиенттен құжатты жүктеуді модельдей аласыз. Indy құрамдастары әдетте тақырыптар мен POST сұрауларын жасау үшін ыңғайлы. Бұл туралы келесі жолы мысалдармен толығырақ.

Блог жаңартуларынан хабардар болу үшін, мүмкін

Индиге кіріспе

Индиге кіріспе
Авторы: Чад З. Хоуэр
Негізгі бет: http://www.atozedsoftware.com
Аудармасы: Анатолий Подгорецкий
кіріспе
Мен бұл мақаланы қазіргі нұсқасы Indy 8.0 болғанда жаздым. Бұл мақаланың көп бөлігі Indy бағдарламасының болашақ нұсқаларында жарамды және өте пайдалы. Егер сізге бұл мақала ұнаса және егжей-тегжейлі мақалаларды оқығыңыз келсе, онда Indy Indy кітабын қараңыз.
Indy блоктау режимінде жұмыс істейді
Indy бұғаттау розеткаларын пайдаланады. Блоктау режимі файлды оқу-жазу сияқты. Деректерді оқу немесе жазу кезінде функция операцияның соңына дейін басқаруды қайтармайды. Файлдармен жұмыс істеуден айырмашылығы, сұралған деректер әлі қол жетімді болмағандықтан, қоңырау ұзағырақ болуы мүмкін, бұл желіңіздің немесе модеміңіздің жұмыс істеу жылдамдығына байланысты.
Мысалы, жай ғана әдіс шақыруын жасаңыз және басқару қоңырау шалушыға қайтарылғанша күтіңіз. Қоңырау сәтті болса, басқару әдісінен қайтарылады, қате бойынша ерекше жағдай көтеріледі.
Блоктау режимі қауіпті емес
Блоктау режимі болғандықтан, бізді қарсыластарымыз бірнеше рет ұрды, бірақ блоктау режимі шайтан емес.
Мәселе Winsock Windows жүйесіне тасымалданғаннан кейін пайда болды. Unix-те мәселе әдетте шанышқымен шешілді (көп ағындыға ұқсас, бірақ ағындардың орнына бөлек процестер). Unix клиенттері мен демондары блоктау режимін іске қосу және пайдалану үшін процестерді ажыратуға мәжбүр болды. Windows 3.x параллельдеу мүмкін болмады және көп ағынды қолдамайды. Блоктау интерфейсін пайдалану пайдаланушы интерфейсін тоқтатып, бағдарламаларды жауапсыз қалдырды. Сондықтан WinSock-қа блоктамайтын режимдер қосылды, бұл Windows 3.x-ке өзінің шектеулерімен Winsock-ті негізгі және жалғыз бағдарлама ағынын блоктаусыз пайдалануға мүмкіндік береді. Бұл әртүрлі бағдарламалауды талап етті, Microsoft және басқалары жасыру үшін блоктау режимдерін қатаң айыптады Windows жүйесінің кемшіліктері 3.x.
Содан кейін көп ағынды қолдауға қабілетті Win32 келді. Бірақ осы уақытқа дейін милар ұнтақты болды (яғни әзірлеушілер розеткаларды блоктауды шайтанның өнімі деп санады), және олардың істегенін өзгерту қиын болды. Сондықтан бұғаттау режимдерін қаралау жалғасуда.
Шындығында, Unix-те тек блоктау розеткалары бар. Бұғаттау розеткаларының да өз артықшылықтары бар және олар көптеген жіптерді, қауіпсіздікті және басқа аспектілер үшін әлдеқайда жақсырақ. Кейбір кеңейтімдер де блокталмаған ұяшықтар үшін Unix-ке қосылды. Дегенмен, олар Windows жүйесіне қарағанда мүлдем басқаша жұмыс істейді. Олар сондай-ақ стандартты емес және өте кең таралған емес. Unix-тегі блоктау розеткалары барлық дерлік жағдайларда қолданылады және әлі де қолданыла береді.
Блоктау режимінің артықшылықтары Бағдарламалау оңайырақ - блоктау режимдерін бағдарламалау оңайырақ. Барлық пайдаланушы коды бір жерде болуы және табиғи, дәйекті тәртіпте орындалуы мүмкін. · Unix-ке тасымалдау оңайырақ - Unix блоктау розеткаларын пайдаланатындықтан, бұл жағдайда портативті кодты жазу оңайырақ. Инди бұл фактіні дәйекті код жазу үшін пайдаланады. · Жіптермен жұмыс істеу ыңғайлырақ - блоктау розеткалары тұқым қуалаушылықпен алынған реттілікке ие болғандықтан, оларды жіптерде пайдалану өте оңай.
Блоктау режимінің кемшіліктері UI клиенттерде қатып қалады - блоктау розеткасының қоңырауы өз тапсырмасын орындамайынша қайтарылмайды. Қолданбаның негізгі ағынында мұндай қоңырау жасалғанда, қолданба пайдаланушы хабарламаларын өңдей алмайды. Осыған байланысты пайдаланушы интерфейсі қатып қалады, терезелер жаңартылмайды және басқару блоктау ұясынан қайтарылмайынша басқа хабарларды өңдеу мүмкін емес.
TIdAntiFreeze компоненті
Индиде мұздату мәселесін шешетін арнайы компонент бар пайдаланушы интерфейсі. Қолданбаңыздың кез келген жеріне бір TIdAntiFreeze компонентін қосыңыз және пайдаланушы интерфейсін қатырмай блоктау қоңырауларын жасай аласыз.
TIdAntiFreeze қоңыраулар стекінен тыс ішкі таймерде жұмыс істейді және күту уақыты біткен кезде Application.ProcessMessages шақырады. Indy-ге сыртқы қоңыраулар блоктауды жалғастыруда, сондықтан TIdAntiFreeze құрамдас бөлігін пайдаланбастан дәл солай жұмыс істейді. TIdAntiFreeze пайдалану розеткаларды кемшіліктерсіз блоктаудың барлық артықшылықтарын алуға мүмкіндік береді.
Код ағындары (Threading)
Блоктау розеткалары әрқашан дерлік код ағындарын пайдаланады. Блокталмайтын розеткалар да ағындарды пайдалана алады, бірақ бұл кейбір қосымша өңдеуді қажет етеді және бұғаттау розеткаларымен салыстырғанда бұл жағдайда олардың артықшылықтары жоғалады.
Ағындардың артықшылықтары·Басымдықтарды орнату - Жеке ағындардың басымдықтарын конфигурациялауға болады. Бұл жеке тапсырмаларға көп немесе аз CPU уақытын бөлуге мүмкіндік береді. · Инкапсуляция - әрбір қосылым басқа қосылыммен интерфейстің кейбір ұқсастығын қамтуы мүмкін. ·Қауіпсіздік - әрбір ағынның әртүрлі қауіпсіздік атрибуттары болуы мүмкін. · Бірнеше процессорлар – бірнеше процессорлары бар жүйелерде артықшылық береді. · Серияландырудың қажеті жоқ - толық параллельділікті қамтамасыз етеді. Көп ағынсыз, барлық сұраулар бір ағында өңделуі керек. Сондықтан әрбір тапсырманы тез орындау үшін шағын бөліктерге бөлу керек. Бір блок орындалып жатқанда, қалғандары оның аяқталуын күтуге мәжбүр. Бір блоктың соңында келесі блок орындалады және т.б. Көп ағынмен әр тапсырманы бір етіп бағдарламалауға болады және операциялық жүйе уақытты барлық тапсырмалар арасында бөледі.
Тақырыпты сұрау
Жіптерді жасау және жою өте ресурсты қажет етеді. Бұл қысқа мерзімді қосылымдары бар серверлер үшін өте қиын тапсырма. Әрбір сервер ағынды жасайды, оны қысқа уақытқа пайдаланады, содан кейін оны жояды. Бұл ағындардың өте жиі жасалуына және жойылуына әкеледі. Бұған мысал ретінде веб-серверді келтіруге болады. Бір сұраныс жіберіліп, қарапайым жауап қайтарылады. Веб-сайтты шолу кезінде браузерді пайдалану кезінде жүздеген қосылымдар мен ажыратулар орын алуы мүмкін.
Сауалнама ағындары бұл жағдайды түзете алады. Сұраныс бойынша ағындарды жасаудың және жоюдың орнына, ағындар пайдаланылмаған, бірақ бұрыннан жасалған ағындар тізімінен пулдан таңдалады. Жіп қажет болмай қалғанда, ол жойылудың орнына пулға қайтарылады. Пулдағы ағындар пайдаланылмаған деп белгіленеді, сондықтан олар CPU уақытын тұтынбайды. Одан да жоғарырақ жақсарту үшін ағындар жүйенің ағымдағы қажеттіліктеріне динамикалық түрде реттей алады.
Indy ағынды сұрауды қолдайды. Indy ішіндегі ағын пулы TIdThreadMgrPool компоненті арқылы қол жетімді.
Бірнеше ағындар
Қатты жүктелген сервер жүздеген, тіпті мыңдаған ағындарды қажет етуі мүмкін. Жүздеген және мыңдаған ағындар сіздің жүйеңізді өлтіруі мүмкін деген жалпы сенім бар. Бұл қате сенім.
Көптеген серверлерде ағындар деректерді күтуде. Блоктау қоңырауын күту кезінде ағын белсенді емес. 500 ағыны бар серверде бір уақытта тек 50 белсенді болуы мүмкін.
Жүйеде жұмыс істейтін ағындардың саны сізді таң қалдыруы мүмкін. Жұмыс істеп тұрған серверлердің ең аз саны және көрсетілгендей іске қосылған қолданбалар арқылы менің жүйемде жасалған 333 ағын бар, тіпті 333 ағынмен процессор тек 1% жүктеледі. қатты жүктелген IIS сервері(Microsoft Internet Information Server) жүздеген немесе мыңдаған ағындарды жасай алады.
Тақырыптар және ғаламдық бөлімдер
Бірнеше ағындармен оларға қатынасу кезінде деректер тұтастығын қамтамасыз ету керек. Бұл ағынды емес бағдарламашылар үшін қиын болуы мүмкін. Бірақ, әдетте, көптеген серверлер жаһандық деректерді пайдаланудың қажеті жоқ. Көптеген серверлер оқшауланған функцияларды орындайды. Әрбір жіп өзінің оқшауланған тапсырмасын орындайды. Жаһандық оқу/жазу бөлімдері көптеген көп ағынды қолданбалардың мүмкіндігі болып табылады, бірақ серверлерге тән емес.
Әдістеме Инди
Indy сіз үйреніп қалған басқа Winsock компоненттерінен ерекшеленеді. Егер сіз басқа компоненттермен жұмыс істеген болсаңыз, ең жақсы шешім - олардың қалай жұмыс істейтінін ұмыту. Көптеген басқа компоненттер блокталмаған (асинхронды) шақыруларды пайдаланады және асинхронды түрде жұмыс істейді. Олар оқиғаларға жауап беруі, күй машинасын жасауы және жиі күту циклдерін орындауы керек.
Мысалы, басқа құрамдастармен қосылымға қоңырау шалған кезде, қосылым оқиғасының іске қосылуын күтуіңіз керек немесе қосылымның орын алғанын көрсету үшін сипат арқылы айналым жасауыңыз керек. Indy көмегімен Connect әдісіне қоңырау шалып, оның қайтарылуын күтуге болады. Қосылым сәтті болса немесе ақаулық туындаған жағдайда ерекшелік жойылса, қайтару жасалады. Сондықтан Indy-мен жұмыс істеу файлдармен жұмыс істеуге өте ұқсас. Indy барлық кодты әртүрлі оқиғаларға таратудың орнына бір жерге қоюға мүмкіндік береді. Сонымен қатар, Indy жіптермен жұмыс істеу кезінде өте қарапайым және ең ыңғайлы.
Индидің айырмашылығы қандай
Қысқаша шолу · Қоңырауларды блоктауды пайдаланады · Оқиғаға бағдарланбаған - оқиғалар бар, бірақ олар ақпараттық мақсаттар үшін пайдаланылады және шын мәнінде қажет емес. ·Жіптерге арналған - Indy жіптерге арналған, бірақ оны жіпсіз пайдалануға болады. Тізбекті бағдарламалау
Егжей-тегжейлі қарастыру
Indy тек блоктау қоңырауларын (синхронды) қолданып қана қоймайды, сонымен қатар осылай жұмыс істейді. Индидегі әдеттегі сеанс келесідей көрінеді:
IndyClient арқылы басталады
қосу; тырысу
// Істеріңізді осында жасаңыз
соңында ажырату; Соңы;
Соңы;
Басқа компоненттермен ол келесідей көрінеді:
процедура TFormMain.TestOnClick(Жіберуші: TComponent);
баста
SocketComponent көмегімен бастаңыз
қосу; тырысу
Қосылмай тұрып бастаңыз
егер IsError болса, бастаңыз
аборт;
Соңы;

OutData:= "Жіберілетін деректер";
ұзындығы (OutData) > 0 болғанда басталады
Application.ProcessMessages;
Соңы;
соңында ажырату; Соңы;
Соңы;
Соңы;
процедура TFormMain.OnConnectError;
баста
IsError:= True;
Соңы;
TFormMain.OnRead процедурасы;
var
i: бүтін;
баста
i:= SocketComponent.Send(OutData);
OutData:= Көшіру(OutData, i + 1, MaxInt);
Соңы;
Көптеген компоненттер бағдарламалаушыны стектен оқшаулау үшін өте жақсы жұмыс істемейді. Көптеген құрамдас бөліктер пайдаланушыны стектің күрделілігінен оқшаулаудың орнына, пайдаланушыны онымен жалғыз қалдырады немесе стектің үстіне орауыш береді.
Индидің ерекше жолы
Indy басынан бастап көп ағынды болу үшін жасалған. Indy-де серверлер мен клиенттерді құру Unix-те серверлер мен клиенттерді құруға ұқсас. Unix қолданбалары әдетте абстракция қабаты аз немесе мүлде жоқ стекке тікелей шақырады.
Әдетте, Unix серверлерінде клиенттің кіріс сұрауларын тыңдайтын бір немесе бірнеше тыңдаушы процестері болады. Қызмет көрсету қажет әрбір клиент үшін жаңа процесс жасалады. Бұл бағдарламалауды жеңілдетеді, әрбір процесс тек бір клиентке арналған. Әрбір процесс тыңдау процесі немесе бар құқықтарға, сәйкестікке немесе басқа нәрселерге негізделген процесс арқылы орнатылатын өзінің қауіпсіздік контекстінде жұмыс істейді.
Indy серверлері бірдей жұмыс істейді. Windows, Unix-тен айырмашылығы, процестерді жақсы тарата алмайды, бірақ ол ағындармен жақсы жұмыс істейді. Indy серверлері әрбір клиент қосылымы үшін жеке ағын жасайды.
Indy серверлері бағдарламаның негізгі код ағынынан бөлек тыңдау ағынын тағайындайды. Тыңдау ағыны клиенттердің кіріс сұрауларын тыңдайды. Ол жауап беретін әрбір клиент үшін клиентке қызмет көрсету үшін жаңа ағын жасалады. Тиісті оқиғалар контексте қызмет етеді берілген ағын.
Indy тұтынушыларға шолу
Indy абстракцияның өте жоғары деңгейін қамтамасыз етуге арналған. TCP/IP стекінің күрделілігі мен егжей-тегжейлері бағдарламашыдан жасырылады.Индидегі әдеттегі клиент сеансы әдетте келесідей көрінеді:
IndyClient арқылы басталады
Хост:= "zip.pbe.com"; // шақыру үшін хост
Порт:= 6000; // Серверді шақыру үшін порт
қосу; тырысу
// Істеріңізді осында жасаңыз
соңында ажырату; Соңы;
Соңы;
Indy серверлеріне шолу
Indy серверінің компоненттері бағдарламаның негізгі кодтық ағынынан оқшауланған тыңдау ағынын жасайды. Тыңдау ағыны клиенттердің кіріс сұрауларын тыңдайды. Ол жауап беретін әрбір клиент үшін клиентке қызмет көрсету үшін жаңа ағын жасалады. Сәйкес оқиғалар содан кейін сол ағынның мәтінмәнінде қызмет көрсетіледі.

Практикалық мысалдар
Келесі мысалдар сізге арналған құрамдастарды бастауға көмектеседі оңай пайдалану, бірақ көрсету үшін мысалдар ретінде жасалған қарапайым қолданбалар. Кейбір жобалар әртүрлі жағдайларды көрсету үшін жасалған. Бұл мысалдарды zip файлдары ретінде жүктеп алуға болады.
Аудармашыдан ескерту: сайттағы сілтеме жұмыс істемейді.
1-мысал - Пошта индексін тексеру
Бірінші жоба мүмкіндігінше қарапайым етіп жасалған. Пошта индексі бойынша іздеу, клиент серверден көрсетілген пошта индексінің қай қалаға және мемлекетке жататынын сұрайды.
АҚШ-тан тыс жерде тұратын және пошта индексінің не екенін білмейтіндер үшін бұл жеткізу орнын көрсететін пошта индексі. Пошталық индекстер 5 цифрдан тұрады.
Протокол
Сервер мен клиентті құрудың бірінші қадамы хаттамаларды әзірлеу болып табылады. Стандартты хаттамалар үшін бұл сәйкес RFC арқылы анықталады. Пошта индексі үшін хаттама төменде анықталған.
Көптеген алмасу хаттамалары мәтіндік режимде жұмыс істейді. Алмасу пәрмен жіберілгенін және жауап күй және мүмкін деректер екенін білдіреді. Хаттамалар алмасумен шектелмейді, бірақ әлі де қарапайым мәтін қолданылады. Пошталық индексті анықтау хаттамасы да мәтіндік болып табылады. Қарапайым мәтін хаттамаларды жөндеуді жеңілдетеді және әртүрлі бағдарламалау тілдері мен операциялық жүйелердің байланысуына мүмкіндік береді.
Қосылғаннан кейін сервер сәлемдесу хабарламасын жібереді, содан кейін пәрменді қабылдайды. Бұл пәрмен «ZipCode x» (Мұндағы x — пошта индексі) немесе «Шығу» болуы мүмкін. Пошта индексі пәрменіне жауап ретінде жауап жауаппен бір жол ретінде немесе код табылмаса бос жол ретінде жіберіледі. Шығу пәрмені сервердің қосылымды тоқтатуына әкеледі. Шығу пәрмені жіберілмес бұрын сервер бірнеше пәрмендерді қабылдауы мүмкін.
Сервердің бастапқы коды

unitServerMain;

интерфейс

пайдаланады

түрі

TformMain = сынып (TForm)

IdTCPServer1: TIdTCPServer;

процедурасы FormCreate(Жіберуші: TObject );

процедура FormDestroy(Жіберуші: TObject );

процедура IdTCPServer1Connect(AThread: TIdPeerThread) ;

жеке

Пошталық индекстер тізімі: TStrings;

қоғамдық

Соңы ;

FormMain: TformMain;

жүзеге асыру

(R*.DFM)

процедура TformMain.IdTCPServer1Connect (AThread: TIdPeerThread) ;

баста

AThread.Connection .WriteLn("Indy пошталық индекс сервері дайын." );

Соңы ;

SCommand: string ;

баста

SCommand:= ReadLn ;

Соңы ;

Соңы ;

Соңы ;

процедура TformMain.FormCreate (Жіберуші: TObject );

баста

ZipCodeList:= TStringList.Create ;

ZipCodeList.LoadFromFile (ExtractFilePath (Application.EXENname ) + "ZipCodes.dat" );

Соңы ;

процедура TformMain.FormDestroy (Жіберуші: TObject );

баста

ZipCodeList.Free ;

Соңы ;

Соңы.

Жобадағы жалғыз Indy-арнайы бөліктер IdTCPServer1 құрамдас бөлігі, IdTCPServer1Connect және IdTCPServer1Execute әдістері болып табылады.
Пішінде TIdTCPServer түрінің IdTCPServer1 құрамдас бөлігі бар. Келесі сипаттар өзгертілді: ·Active = True - Бағдарлама іске қосылғаннан кейін сервер тыңдайды. ·DefaultPort = 6000 - осы жоба үшін порт мәні. Сервер осы порттағы клиент сұрауларын тыңдайды.
IdTCPServer1Execute әдісі сервердің OnExecute оқиғасымен байланысты. OnExecute оқиғасы клиенттік қосылым қабылданғаннан кейін іске қосылады. OnExecute оқиғасы сіз білетін басқа оқиғалардан ерекшеленеді. OnExecute ағынның контекстінде орындалады. Жіп оқиғасы іске қосылады және әдіске жіберілген AThread аргументі жіберіледі. Бұл маңызды, себебі бірнеше OnExecute оқиғалары бір уақытта орындала алады. Бұл сервер жаңа құрамдас жасамай жұмыс істей алатындай етіп жасалады. Сондай-ақ ұрпақты құру кезінде қайта анықталатын әдістер бар.
OnConnect оқиғасы қосылым қабылданғаннан кейін және ол үшін ағын жасалғаннан кейін іске қосылады. В бұл сервербұл клиентке сәлемдесу хабарламасын жіберу үшін пайдаланылады. Мұны қажет болса, OnExecute оқиғасында да жасауға болады.
OnExecute оқиғасы қосылым ажыратылғанға немесе жоғалғанша бірнеше рет іске қосылуы мүмкін. Бұл оқиға ішіндегі циклде қосылымды ажырату немесе жоғалту үшін тексеру қажеттілігін жояды.
IdTCPServer1Execute екеуін пайдаланады негізгі функциялар, ReadLn және WriteLn. ReadLn қосылымнан жолды оқиды, ал WriteLn жолды қосылымға жібереді.
sCommand:= ReadLn;
Жоғарыдағы код клиенттен жолды алып, оны sCommand жергілікті жол айнымалысына қояды.

егер SameText (sCommand, "QUIT" ) болса, бастаңыз

end else if SameText (Көшіру (sCommand, 1 , 8 ) , "ZipCode" ), содан кейін бастаңыз

WriteLn (ZipCodeList.Values ​​[ Көшіру (sCommand, 9 , MaxInt) ] );

Соңы ;


Содан кейін sCommand жарамды пәрмендер үшін тексеріледі.
Егер пәрмен «Шығу» болса, Ажырату орындалады. Ажыратылғаннан кейін оқуға немесе жазуға рұқсат етілмейді. Оқиға аяқталғаннан кейін тыңдау ағыны енді оны шақырмайды, бірақ ағынды тазартады және қосылымды тоқтатады.
Егер пәрмен «Пошта коды» болса, онда пәрменнен кейінгі параметр шығарылады және кесте қала мен штаттың болуы үшін ізделеді. Содан кейін қала мен штат клиентке беріледі немесе сәйкестік болмаса, бос жол беріледі.
Содан кейін әдіс шығады. Жаңа пәрмен келген бойда сервер оқиғаны қайта көтереді, бұл клиентке бірнеше пәрмендерді жіберуге мүмкіндік береді.
Клиенттің бастапқы коды

unitClientMain;

интерфейс

пайдаланады

Windows, хабарлар, SysUtils, сыныптар, графика, басқару элементтері, пішіндер, диалогтар,

StdCtrls, ExtCtrls, IdAntiFreezeBase,

IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

түрі

TformMain = сынып (TForm)

Клиент: TIdTCPClient;

IdAntiFreeze1: TIdAntiFreeze;

Панель 1: TPanel;

Панель 2: TPanel;

MemoInput:TMMemo;

LboxResults: TListBox;

Панель 3: TPanel;

1 түймесі: TB түймесі;

2 түймесі: TB түймесі;

Label1: T Label;

процедура Button2Click(Жіберуші: TObject );

процедура Button1Click(Жіберуші: TObject ) ;

жеке

қоғамдық

Соңы ;

FormMain: TformMain;

жүзеге асыру

(R*.DFM)

процедура TformMain.Button2Click (Жіберуші: TObject );

баста

MemoInput.Clear ;

LboxResults.Clear ;

Соңы ;

процедура TformMain.Button1Click (Жіберуші: TObject );

I: integer ;

S: жол

баста

ButnLookup.Enabled := true ; тырысу

LboxResults.Clear ;

Клиенттен бастаңыз

қосу; тырысу

LboxResults.Items .Add (ReadLn ) ;

for i:= 0 to memoInput.Lines .Count - 1 басталады

WriteLn("Пошта коды" + memoInput.Lines[ i] );

LboxResults.Items .Add(memoInput.Lines[ i] );

S:= ReadLn ;

s = "" болса, бастаңыз

S:= "-- Бұл пошта индексі үшін жазба табылмады.";

Соңы ;

LboxResults.Items .Қосу(лар) ;

LboxResults.Items .Қосу ("" );

Соңы ;

WriteLn («Шығу» );

соңында ажырату; Соңы ;

Соңы ;

соңында butnLookup.Enabled := true ; Соңы ;

Соңы ;

Соңы.


Клиент компонентіне тән бөліктер ғана Button1Click әдісі болып табылады.
Клиент компоненті TIdTCPClient түріне жатады және пішінде орналастырылған. Келесі сипаттар өзгертілді: Хост = 127.0.0.1 - Сервер клиентпен бір құрылғыда орналасқан. Порт = 6000 - Сервер порты
Button1Click әдісі Button1 компонентінің OnClick оқиғасымен байланысты. Түймені басқан кезде бұл әдіс шақырылады. Бұл әдістің Indy бөлігін келесіге дейін азайтуға болады: 1.Серверге қосылу (Connect;) 1.Серверден сәлемдемені оқу. 1. TMemo-да пайдаланушы енгізген әрбір жол үшін: 1. Серверге сұраныс жіберу (WriteLn("ZipCode" + memoInput. Lines[i]);) 1. Серверден жауапты оқу (s:= ReadLn; ) 1. Шығу пәрменін жіберу (WriteLn("Quit");) 1. Ажырату (Ажырату;)
Тестілеу
Бұл мысал тексерілген және орнатылған TCP/IP көмегімен жұмыс істейді. Оны бір компьютерден екіншісіне желі арқылы жұмыс істеу үшін өзгертуге болады. Серверді басқа компьютерде іске қосу және клиенттегі сервердің атын немесе IP мекенжайын өзгерту арқылы.
Жобаларды сынау үшін серверді құрастырыңыз және іске қосыңыз. Содан кейін клиентті құрастырыңыз және іске қосыңыз. Жазба өрісіне пошталық индексті енгізіп, іздеу пернесін басыңыз.
Түзету
Мәтіндік хаттамаларды жөндеу өте оңай, себебі оларды Telnet арқылы тексеруге болады. Ол үшін сервер портын білу жеткілікті. Пошта индексін іздеу сервері 6000 портты тыңдауда.
Пошта индексін іздеу серверін қайта іске қосыңыз. Содан кейін консольді ашыңыз (мысалы, Dos терезесі). Енді енгізіңіз:
telnet 127.0.0.1 6000
Сіз енді серверге қосылдыңыз. Кейбір серверлер сәлемдесу хабарын да жібереді. Кейбіреулер жоқ. Сіз енгізген жолдарды көрмейсіз. Көптеген серверлер трафикті үнемдеу үшін жаңғырмайды. Дегенмен, "Echo On" опциясын орнату арқылы telnet параметрлерін өзгертуге болады. Әртүрлі telnet клиенттерінде бұл әртүрлі тәсілдермен жүзеге асырылады және олардың бірқатарында мұндай мүмкіндік мүлдем жоқ. Енді енгізіңіз:
пошта индексі 37642
Сіз сервердің жауабын көресіз:
CHURCH HILL, TN
Серверден ажырату үшін мынаны енгізіңіз:
шығу
2-мысал – мәліметтер қорына кіру
Бұл мысал ұяшық қоңырауларынан басқа блоктау тапсырмаларын орындауы керек серверді эмуляциялайды. Көптеген серверлер мұндай жағдайларда жұмыс істеуге мәжбүр. Дерекқорға қол жеткізуді, сыртқы процедура шақыруларын немесе есептеулерді қажет ететін серверлер көбінесе бұл қоңырауларды үзе алмайды, себебі олар сыртқы қоңыраулар немесе мұны істеудің күрделілігіне байланысты. Негізгі қоңырауды шағын бөліктерге бөлуге болмайды және әзірлеуші ​​негізгі операцияның аяқталуын күтуі керек. Бұл дерекқорға қол жеткізудің ғана емес, сонымен қатар қысу, есептеулер және сол түрдегі басқа өңдеу сияқты басқа операциялардың мүмкіндігі.
Көрсету мақсатында сервер 5 секундқа созылатын дерекқор шақыруын жасады делік. Жеңілдету үшін мұны кідірту арқылы орындайық, бұл үшін қоңырау шалудың орнына Sleep(5000) функциясын пайдаланыңыз.
Бұл мысал да алдыңғы мысалға қарағанда аз егжей-тегжейлі талап етеді, себебі көптеген ұғымдар әлі түсінілмеген.
Дереккөз

негізгі блок;

интерфейс

пайдаланады

Windows, хабарлар, SysUtils, сыныптар, графика, басқару элементтері, пішіндер, диалогтар,

IdBaseComponent, IdComponent, IdTCPServer;

түрі

TformMain = сынып (TForm)

IdTCPServer1: TIdTCPServer;

процедура IdTCPServer1Execute(AThread: TIdPeerThread) ;

жеке

қоғамдық

Соңы ;

FormMain: TformMain;

жүзеге асыру

(R*.DFM)

процедура TformMain.IdTCPServer1Execute (AThread: TIdPeerThread) ;

I: integer ;

баста

AThread арқылы. Қосылым басталады

WriteLn («Сәлеметсіз бе. ДБ сервері дайын.» ) ;

I:= StrToIntDef (ReadLn , 0 );

// Ұйқы ұзақ МБ немесе басқа қоңырауға ауыстырылады

Ұйқы (5000);

WriteLn (IntToStr (i * 7 ) );

Соңы ;

Соңы ;

Соңы.

Execute оқиғасы ағынның контекстінде орын алатындықтан, өңдеу коды кез келген ұзындықта болуы мүмкін. Әрбір клиенттің өз ағыны бар және басқа клиенттерді блоктамайды.
Тестілеу
МҚ серверін тексеру үшін оны құрастырыңыз және іске қосыңыз. Оған 6001 портындағы Telnet арқылы қосылыңыз. Сервер сәлемдесу хабарымен жауап береді. Нөмірді енгізіңіз. Сервер сұрауыңызды «өңдейді» және 5 секунд ішінде жауап береді.

Delphi 6-да қолданылатын Indy компоненттері.

Негізгі Интернет қызметтері мен хаттамаларынан басқа, кең ауқымы бар қосымша қызметтер, мүмкіндіктерін Интернет әзірлеушілері жиі пайдаланады. Сонымен қатар, ақпаратты шолғыш арқылы көрсету мүмкіндігі әрқашан Интернет қолданбалары үшін қолайлы шешім бола бермейді. Бұл жағдайда деректермен алмасу үшін Интернет-инфрақұрылымын пайдалану және ақпаратты көрсетуді, мысалы, Delphi-де жасалған күрделірек клиенттік қосымшалар арқылы қамтамасыз ету орынды.

Стандартты веб-серверлерге кіріктірілмеген пайдаланушылық серверлік логиканы іске асырғыңыз келеді делік. Есептердің осы класын шешу үшін Delphi Nevrona Designs (http://www.nevrona.com/Indy/) ұсынған Internet Direct (Indy) кітапханасын қамтиды. Borland Delphi үшін арнайы әзірленген бұл кітапханада қазірдің өзінде сегіз нұсқасы бар, олардың соңғысы Delphi-дің жаңа нұсқасына енгізілген. Компоненттер жинағы үш топқа бөлінеді: клиент (Indy Client), сервер (Indy Servers) және көмекші (Indy Misc).

Indy клиенттері және Indy серверлері

Indy Client және Indy Servers құрамдастарының көпшілігі протоколдар мен қызметтердің клиенттік және серверлік бөліктеріне сәйкес жұптар болып табылады (TunnelMaster және TunnelSlave сияқты бөлек, негізінен серверге негізделген құрамдастарды қоспағанда) және сияқты хаттамаларды пайдалануға мүмкіндік береді. TCP/IP, UDP, NNTP, SMTP, FTP, HTTP, сонымен қатар ECHO, FINGER, WHOIS қызметтері және т.б.

Indy клиентінің құрамдастары розеткалардың көмегімен жазылады. Клиент жағындағы ұяшық серверге қосылуды қажет етеді. Қосылым орнатылғаннан кейін клиент пен сервер хабар алмасуды бастай алады. Бұл хабарламалар әртүрлі сипатта болады, бірақ әдетте алмасу белгілі бір протоколға сәйкес жүзеге асырылады (мысалы, HTTP)

TIdTCPClient және TIdTCPServer

Бұл компоненттер негізгі желі протоколдарының бірін қолдау үшін пайдаланылады - TCP (Transmission Control Protocol), сонымен қатар TIdSMTP және TIdFTP компоненттері үшін базалық сыныптар болып табылады. TIdTCPServer сыныбының әдепкі мәні нөлге тең болатын ThreadMgr қасиеті бар. TIdTCPServer қосылғанда ThreadMgr нөл болса, TIdThreadMgrDeafault сыныбы жасырын түрде жасалады. Әйтпесе, орнатылған процесс менеджері пайдаланылады.

TIdUDPClient және TIdUDPServer

Бұл компоненттер қолдау үшін пайдаланылады желілік протокол UDP (User Datagram Protocol) және басқа Indy құрамдастарының қатары үшін негізгі сыныптар болып табылады.

TIdChargenServer

Компонент кездейсоқ таңбаларды генерациялау үшін пайдаланылады, әдетте сынақ мақсаттары үшін.

TIdDayTime және TIdDayTimeServer

Құрамдас бөліктер уақыт қызметін қамтамасыз ету үшін пайдаланылады. Клиент сұрайды және сервер ағымдағы күн мен уақытты хабарлайды.

TIdDNSResolver

Бұл сұрауларға қызмет көрсететін клиент құрамдас бөлігі DNS серверлері(Домендік атау қызметі). DNS серверінің сұраулары компьютер атауын оның IP мекенжайымен ауыстыруға арналған. TIdDNSResolver — TIdUDPClient қосалқы сыныбы.

TIdDICTServer

Сөздік серверінің протоколы (DICT) сервер компоненті – клиентке табиғи тіл сөздігіне қол жеткізуге мүмкіндік беретін TCP негізіндегі сөздік сервері.

TIdDISCARDServer

Жазбалар серверіне қолдау көрсететін сервер құрамдас бөлігі. Жазбаларды жөндеу және өлшеу құралы ретінде пайдалануға болады. Жазбалар қызметі кез келген деректерді оны алғысы келетіндерге жай ғана береді.

TI dEcho және TI dECHOServer

Құрамдас бөліктер әдетте желінің жұмысын тексеру үшін пайдаланылатын жауап беру қызметін қамтамасыз етуге арналған. Клиент серверге мәтіндік хабарлама жібереді, сервер хабарламаны клиентке қайтарады. Егер хабарлама бұзылса, желі дұрыс жұмыс істемейді.

TIdFinger және TIdFingerServer

Құрамдас бөліктер пайдаланушыға жүйеде басқа пайдаланушылардың болуы туралы деректерді сұрауға мүмкіндік беретін протоколды қамтамасыз етуге арналған. Кейбір серверлер мұндай клиент сұрауларын өңдейді. Бұл құрамдас бөліктерді пайдалану жүйеде басқа пайдаланушылардың бар-жоғын анықтайтын клиент сұрауларына қызмет көрсетуге мүмкіндік береді.

Компонентте файлдарды тасымалдау протоколына толық қолдау кіреді - FTP (File Transfer Protocol). Пассивті және белсенді деректерді тасымалдауға, сонымен қатар GET және PUT, каталогтарды жою, квоталарды алу, файл және каталог өлшемдері сияқты операцияларға қолдау көрсетіледі. TI dFTP өз жұмысында TIdSimpleServer класын пайдаланады. FTP файлын тасымалдау орындалып жатқанда, қосымша TCP қосылымы деректерді тасымалдау үшін ашық және деректер тасымалданған кезде жабылады. Бұл қосылым «деректер сілтемесі» деп аталады және тасымалданатын әрбір файл үшін бірегей болып табылады.

TIdGopher және TIdGopherServer

Бұл компоненттер жақында HTTP протоколымен WWW (World Wide Web) ығыстырылған желілік протоколды қамтамасыз ету үшін жасалған. Бұл хаттаманы жүзеге асыратын сервер иерархияны қамтамасыз етеді бөлінген жүйеқұжат айналымын қолдау. demosindyGopherClient және demosindy GopherServer каталогтарында орналасқан құрамдастардың осы жұбын пайдалану мысалы осы протоколды қамтамасыз ету үшін қалай пайдалануға болатынын көрсетеді. жергілікті желікомпьютердегі файлдар, соның ішінде жабық файлдар туралы ақпарат.

TIdHostNameServer

Жергілікті сервер атауын клиенттерге беруге арналған сервер құрамдас бөлігі.

TIdHTTP және TIdHTTPServer

Құрамдас бөліктер HTTP желілік протоколын қамтамасыз ету үшін пайдаланылады (1.0 және 1.1 нұсқаларына, соның ішінде GET, POST және HEAD операцияларына қолдау көрсетіледі). Сонымен қатар, аутентификацияға және прокси серверлерді пайдалануға қолдау көрсетіледі. Сервер құрамдас бөлігі осы протоколды қолдайтын басқа веб-серверге қызмет көрсету үшін пайдаланылады. TIdHTTPServer cookie файлдары, күйді басқару және т.б. сияқты мүмкіндіктерді енгізуді жеңілдетеді.

TIdIcmpClient

ICMP (Internet Control Message Protocol) протоколын қамтамасыз етуге арналған клиент құрамдас бөлігі, оның көмегімен пинг операциясы және желіні бақылау орындалады.

POP (Post Office Protocol) протоколын қамтамасыз етуге арналған клиент құрамдас бөлігі, соның ішінде MIME кодтауы мен декодтауына қолдау көрсету, сондай-ақ көпбайттық таңбаларды тасымалдау.

TIdIMAP4 сервері

Сервердегі IMAP (Internet Message Access Protocol) операцияларын қолдауға арналған сервер құрамдас бөлігі. Протокол хабарламаларды іздеуге мүмкіндік береді Электрондық поштасерверде. IMAP пен POP арасындағы айырмашылық мынада: POP протоколы деректерді сақтау үшін қосымша жадты қажет етеді, ал IMAP протоколы клиенттік машинаның орнына серверге қатынасады. IMAP4 POP3 ауыстыру үшін жасалған, бірақ POP3 протоколы әлі де кеңінен қолданылатын стандарт болып табылады.

TIdIRCServer

Интернетте жиі қолданылатын қызмет операцияларын қолдауға арналған сервер құрамдас бөлігі, әдетте чат (достық сөйлесулер үшін) деп аталады. Құрамдас IRC (Internet Relay Chat) сервері үшін негізгі құрылыс блоктарын қамтамасыз етеді.

TIdMappedPortTCP

Прокси серверлерде жиі қолданылатын салыстырылған порттарды жасауға арналған сервер компоненті. Бұл компоненттің әдістері бір портты екіншісіне салыстыруға мүмкіндік береді. Мысалы, 80-портты 3000-портқа салыстыруға болады және бірінші портқа (80-порт) барлық сұраулар екінші портқа (3000 порт) қайта жіберіледі.

TIdNNTP және TIdNNTPSсервері

Бұл құрамдас бөліктер жаңалықтар қызметтерінде қолданылатын желілік жаңалықтарды тасымалдау протоколын (NNTP) қамтамасыз ету үшін қажет. Клиент компоненті MIME кодтауы мен декодтауын қолдауды, сондай-ақ көпбайтты таңбаларды және балама кодтауды қолдауды қамтиды. Сервер компоненті жаңалықтар серверлерін жасауға мүмкіндік береді. TIdNNTPServer толық мүмкіндіктері бар жаңалықтар сервері емес, мұндай сервер үшін негізгі функционалдылықты қамтамасыз ететін құрамдас екенін ескеру маңызды.

TIdQOTD және TIdQOTDServer

Құрамдас бөліктер «Күннің бағасы» қызметін қамтамасыз ету үшін пайдаланылады. Клиент құрамдас бөлігі күнделікті бағаны алу үшін сервер құрамдас бөлігінің данасына қосылады. Әрбір сервер данасы бірегей тырнақша дерекқорын қамтиды.

Қарапайым поштаны тасымалдау протоколы (SMTP) қолданбаларында пайдалануға арналған клиент құрамдас бөлігі аутентификацияға, MIME кодтауына және декодтауына және көпбайттық таңбаларға қолдау көрсетеді.

SNTP (Simple Network Time Protocol) қамтамасыз етуге арналған клиенттік компонент – уақыт қызметі. Ағымдағы күн мен уақытты анықтау үшін кез келген уақыт қызметіне қосылу үшін пайдалануға болады.

TIdSimpleServer

Жеңіл TCP серверін қамтамасыз ететін сервер құрамдас бөлігі. Нүктеден нүктеге байланысты ұйымдастыруға мүмкіндік береді. Бір пайдаланушымен серверлерді құру үшін қолданылады, яғни бір уақытта тек бір қосылымға қызмет көрсете алады. TIdTCPServer құрамдас бөлігінен айырмашылығы, ол клиенттерден сұрауларды күту және осы сұрауларды өңдеу кезінде қосымша процестерді тудырмайды. Басқаша айтқанда, егер сервер қандай да бір клиенттің сұрауына қызмет көрсетсе және сол уақытта басқа клиент қосылу үшін оған қатынасса, онда ол бірінші сұрауды өңдеудің соңына дейін блокталады.

TIdTelnet және TIdTelnetServer

Клиент компоненті басқа компьютерде қашықтағы сеанстарды, соның ішінде консольдық келіссөздерді және аутентификацияны ұйымдастыру үшін пайдаланылады. Байланыс хаттамасы сервермен интерактивті өзара әрекеттесуді жүзеге асыратын адамның болуын болжайды. Клиенттік құрамдас дисплей қолдауын немесе терминал эмуляциясын қамтамасыз етпейді, тек қосылымды қамтамасыз етеді сервер бөлігі. Әдетте ұйымдастыру үшін TIdTelnetServer сервер протоколы пайдаланылады қашықтағы базалартұтынушылармен интерактивті әрекеттесу үшін мәтіндік интерфейсі бар деректер.

TIdTime және TIdTimeServer

Клиент құрамдас бөлігі уақытты анықтауға арналған TIdSNTP компонентіне балама болып табылады. Бұл екі хаттаманың форматтары әртүрлі екенін атап өткен жөн. TIdTime RFC 868 пішіміне негізделген (барлық қажетті түрлендірулерді орындай отырып, UNIX ОЖ ішкі стандартында уақытты қайтарады). Сервер құрамдас бөлігі жұмысы бойынша DayTime серверіне ұқсас. Уақыт қызметін іске асыру үшін пайдалануға болады жергілікті компьютер. Қосымша кодталап етілмейді, серверлік компьютердің ішкі сағатының уақытын қайтаратын TIdTimeServer данасын жасау жеткілікті.

TIdTrivialFTP және TIdTrivialFTPServer

Бұл компоненттер ең қарапайым файлдарды тасымалдау протоколын ұйымдастыру үшін қажет. Бұл протоколдың клиенттік құрамдас бөлігі сәйкес сервер компонентінің данасына қосылу үшін пайдаланылады. Протокол файлдарды тасымалдаудың жеке, жеңіл, жергілікті жағдайларына, мысалы, жергілікті желілерде немесе маршрутизаторларға маршруттау кестелерін жүктеуге (жүктеп салуға) арналған. Бұл хаттаманың әлсіз сипаттамаларына байланысты аутентификация алгоритмдерін немесе кез келген басқа қауіпсіздік механизмдерін пайдалану кезінде оны пайдалану ұсынылмайды. Бұл хаттаманың негізгі мақсаты файлдарды аппараттық құрылғыға өзгерту үшін оны тасымалдау болып табылады.

TIdTunnelMaster және TIdTunnelSlave

Сервер туннельінің құрамдас бөліктері бір физикалық (туннель) арқылы бірнеше логикалық қосылымдарды ұйымдастыру үшін прокси серверлерде пайдаланылады. Бұл сыныптарды әртүрлі мақсаттарда қолдануға болады, мысалы, құпия емес арналар арқылы құпия байланыс орнату.

TIdWhois және TIdWhoIsServer

Бұл клиент компоненті домендер туралы ақпаратты алуға мүмкіндік беретін кез келген стандартты Whois серверіне қосылады. Сервер құрамдас бөлігі NIC серверінің негізгі функционалдығын қамтамасыз етеді.

Indy Misc

Indy Miscellaneous Components палитрасы бетінде BASE64, UUE, Quoted Printable және басқа да жалпы электрондық пошта байланыс пішімдері, құпия сөздерді сақтау үшін пайдаланылатын криптографиялық стандарттарға арналған кодтауыштар (MD2, MD4 және MD5) бар. электрондық қолтаңбаларқайтымсыз (шифрын ашу қиын) пішінде, сондай-ақ Интернет-қосымшаларды әзірлеуде жиі қолданылатын басқа да көптеген пайдалы компоненттер мен утилиталар.

TIdAntiFreeze

Indy құрамдас алгоритмдерінің бұғатталуына байланысты, қосылым жұмыс істеп тұрған кезде қолданба жиі «ілулі тұратын» сияқты. Қосымшаның қатып қалуын (қатып қалуын) болдырмау үшін коммуникацияларды ұйымдастыру кезінде қайталама процестерді (жіптерді) пайдалануды болдырмау үшін пішінде көрсетілген компонентті орналастыру жеткілікті.

Компонент TCP/IP протокол стекінен сұрауларды талдау және сыртқы қосылымдар бұғатталған кезде кешігу кезінде қолданбаға хабарламаларды жіберу арқылы жұмыс істейді, бұл іске қосылған код елесін жасайды. Құрамдас блокталған қосылымдарға тек негізгі процесс үшін әсер ететіндіктен, қолданбаның қосымша процестерінде TIdAntiFreeze пайдалану қажет емес. TIdAntiFreeze құрамдас бөлігі қосылымдарды баяулататынын есте сақтаңыз, себебі негізгі процесс хабарламаларды өңдеу үшін мерзімді түрде үзіледі. Бұдан шығатыны, әзірленіп жатқан қолданба OnClick, OnPaint, OnResize және т.б. қоса, хабарламаларды өңдеуге тым көп уақыт жұмсамау керек. Мұны белгілі бір дәрежеде TIdAntiFreeze класының қасиеттері арқылы басқаруға болады. Бұл компонентті пайдалану міндетті емес, бірақ қолданбаның визуалды интерфейсімен қосылымдарды синхрондау мәселесін шешуге мүмкіндік береді.

TIdDateTimeStamp

Интернет протоколдарының әртүрлі күн мен уақыт пішімдерін пайдалануына байланысты күн мен уақыт математикасын орындауға арналған сынып; сонымен қатар, клиенттер мен серверлер әртүрлі уақыт белдеуінде болуы мүмкін.

TIdIPWatch

Бұл компьютердің IP мекенжайындағы өзгерістерді үнемі бақылайтын таймер негізіндегі компонент. Өзгеріс анықталған кезде құрамдас оқиғалары іске қосылады. Көрсетілген компонент әдетте компьютердің Интернетке немесе кез келген басқа желіге қосылғанын анықтау үшін қолданылады. Бұл жағдайда IP мекенжайының өзгеруі жаңа желіге қосылу кезінде DHCP (Динамикалық хост конфигурациясының протоколы) серверінің IP мекенжайын тағайындауымен байланысты болуы мүмкін.

TIdLogDebug

Бұл құрамдастың мақсаты кез келген клиенттің немесе сервер құрамдас бөлігінің оқиғаларын тоқтату және оқиға жазбасын орналастыру болып табылады көрсетілген файл. Бұл компонент Indy құрамдастарын жөндеу үшін өте пайдалы.

TIdMessage

Компонент басқа құрамдастармен бірге хабарламалардың шифрын дұрыс шешу немесе кодтау үшін пайдаланылады. Бұл POP, SMTP және NNTP құрамдастары болуы мүмкін. Класс MIME шифрлауды және шифрды шешуді, көпбайтты таңбаларды және ISO кодтауын қолдайды.

TIdNetworkCalculator

Қосымшаларды құру кезінде пайдалануға болатын бірнеше Indy құрамдастарының бірі. Желілік калькуляторды IP мекенжайларында, соның ішінде желі маскаларында, ішкі желілерде, желі сыныптарында және т.б. есептеулерді орындау үшін пайдалануға болады.

TIdThreadMgrDefault

Құрамдас әдепкі бойынша қосалқы процестерді басқаруды қамтамасыз етеді. Процесті басқаруды қолдайтын кез келген Indy компонентінде анықталған TIdThreadManager сыныбының данасы болмаған кезде жасалады. Құрамдас қосалқы процестерді басқарудың негізгі мүмкіндіктерін ғана қамтамасыз етеді: ол оларды сұраныс бойынша жасайды және жояды.

TIdThreadMgrPool

TIdThreadMgrDefault қарағанда жетілдірілген процесті басқару компоненті, себебі ол сұраныс бойынша оларды жасау немесе жоюдың орнына процестерді біріктіреді.

TIdVCard

VCard – визитканың электрондық баламасы, иесінің жеке мәліметтері, графикалық деректер болуы мүмкін.

TIdIMFDecoder

Интернет-хабарламаларды декодтау үшін жасалған. Бұл кодтаудың барлық басқа құрамдас бөліктері сияқты TIdCoder класының ұрпағы. TIdCoder класы 1982 жылы тамызда ұсынылған ARPA RFS-822 интернет мәтіндік хабарлама пішімінің стандартына және 1987 жылдың желтоқсанында ұсынылған USENET хабар алмасу RFC 1036 стандартына сәйкес декодтауды орындайды.

Құрамдас тақырып контекстінен RFS-822 пішімін анықтауға мүмкіндік беру үшін TIdCoder сыныбының мүмкіндіктерін кеңейтеді, қабылдау шифрын шешу режимін және MIME шифрлауын және шифрын шешуді қамтамасыз етеді. TIdIMFDecoder компоненті TIdMessageClient сыныбында қабылданған және жіберілген хабарламаларды декодтау үшін пайдаланылады.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder көрсетілген пішімдегі мәтіннің шифрын ашуға мүмкіндік береді. Жаңа кодтау түрін қамтитын хабарламаларды жіберуге мүмкіндік беретін, көрсетілген кодтау түрі бар дербес құрамдас ретінде қызмет ете алады.

TIdBase64Encoder

Басып шығарылмайтын таңбаларды жіберуге мүмкіндік беретін басқа шифрлау алгоритмін жүзеге асырады.

TIdUUEкодер

Бірінші шифрлау алгоритмдерінің бірін, UU кодтауын жүзеге асырады. Кейде жаңалықтар қызметінде мақалаларды жариялау кезінде қолданылады.

TIdXXEncoder

Бұл шифрлау әдісін ешқашан пайдалану екіталай. Бұл негізінен бірдей UU кодтауы, бірақ шифрлау кестесі басқаша.

TIdCoderMD2

MD (Message Digest) шифрлау алгоритмінің әртүрлі сорттары бар компоненттер. Олардың барлығы араластыруға негізделген, бір жақты және шифрды шешу алгоритмдері жоқ.

Протокол клиенті мен сервер құрамдастары негізгі (ClientSocket, ServerSocket) және Интернет пен Fastnet палитрасының басқа компоненттерімен бірге немесе олардың орнына серверлік және клиенттік Интернет қосымшаларын әзірлеу үшін пайдаланылуы мүмкін. Indy құрамдастары WebBroker архитектурасын пайдаланбайды, Интернет хаттамалары мен қызметтерін тікелей бастапқы кодында (бастапқы кодтары қоса беріледі) төмен деңгейде қолдауды жүзеге асырады.

TIdConnectionInterceptOpenSSL және TIdServerInterceptOpenSSL

SSL протоколы – Secure Sockets Layer (Secret Socket Level) екі қолданба арасындағы байланыстың құпиялылығы мен сенімділігін қамтамасыз етеді, екі деңгейге ие. Көп деңгейлі тасымалдау протоколының төменгі деңгейінде (мысалы, TCP) SSL жазу протоколы болып табылады және әртүрлі хаттамаларды инкапсуляциялау үшін қолданылады. жоғары деңгей. SSL артықшылығы - бұл тәуелсіз хаттама. қолданбалы бағдарлама, ал жоғары деңгейлі протоколды SSL арқылы пайдалануға болады.

SSL байланыс қауіпсіздігін қамтамасыз етеді, оның үш негізгі функциясы бар: құпия қосылымды қамтамасыз ету; көмегімен шифрлау ашық кілт(адресаттың аутентификациясы үшін пайдаланылады); деректерді беру сенімділігін қолдау.

  • Симметриялық криптография деректерді шифрлау үшін қолданылады (мысалы, DES, RC4 және т.б.).
  • Цифрлық қолтаңбаасимметриялық ашық кілт шифрлауымен қамтамасыз етілген (мысалы, RSA, DSS және т.б.).
  • Байланыс сенімділігі, хабарды тасымалдау MAC түзету кодтары, қауіпсіз хэш функциялары (мысалы, SHA, MD5 және т.б.) арқылы MAC есептеулері арқылы хабардың тұтастығын тексеруді қамтиды.

HTTP протоколымен және сервердің аутентификациясымен бірге SSL протоколы қажетті шифрлау функцияларын қамтамасыз етеді және веб-серверді қайта аутентификациялау арқылы орнатылған қосылымды одан әрі сақтайды, т.б. SSL тек деректерді тасымалдау кезінде байланысты қорғайтынын және басқа қауіпсіздік механизмдерін алмастырмайтынын түсіну маңызды.

TIdConnectionInterceptOpenSSL және TIdServerInterceptOpenSSL құрамдастары SSL протоколына сәйкес клиенттік және серверлік қосылымдарды қамтамасыз етеді. Айта кету керек, TIdConnectionInterceptOpenSSL және TIdServerInterceptOpenSSL құрамдастары тек Delphi 6-да қол жетімді, бірақ Kylix-те жоқ. Бұл Windows іске асыру жағдайында операциялық жүйе функцияларына негізделген хаттаманың күрделілігіне байланысты.

Indy компоненттерін пайдалану мысалдарын /Delphi6/Demos/Indy каталогтарынан табуға болады. Барлығы 8.0 нұсқасындағы Indy кітапханасы 69 құрамды қамтиды. 9.0 нұсқасында көрсетілген кітапхана 86 компоненттен тұратыны айтылған. Барлық компоненттер біріктірілген және Delphi 6 және Kylix екеуінде де қамтылған, бұл оларды кросс-платформалық қосымшаларды әзірлеу үшін пайдалануға мүмкіндік береді. Барлық Indy құрамдастары көп ағынды қолдайды.

Indy компоненттері кестеде анық көрсетілген Интернетте және Fastnet құрамдастарында қол жетімді барлық дерлік функцияларды жүзеге асырады.

Құрамдас бөліктер Indy компоненттері Компоненттердің мақсаты
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket TCP/IP протоколы арқылы екі компьютердің (клиент пен сервер) өзара әрекеттесуі
2 TNMDayTime TIdDayTime, TIdDayTimeServer Ағымдағы уақытқа арналған сервер сұрауы
3 TNMEcho TIdEcho, TIdEchoServer Жауап серверімен байланысу үшін қолданылады
4 TNMFinger TIdFinger, TIdFingerServer Интернет іздеу серверінен пайдаланушы ақпаратын алу үшін пайдаланылады
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer FTP протоколы арқылы файлдарды тасымалдауды қамтамасыз ету
6 TNMHTTP TIdHTTP, TIdHTTPSсервер Деректер алмасу үшін HTTP протоколын пайдаланыңыз
7 TNMMsgServ, TNMMsg Клиенттен серверге қарапайым мәтіндік хабарламаларды жіберу үшін қолданылады
8 TNMNNTP TIdNNTP, TIdNNTPSсервер Жаңалықтар серверімен деректер алмасуды қолдау
9 TNMPOP3 TIdPOP3 POP3 протоколы арқылы пошта серверінен электрондық поштаны алу үшін пайдаланылады
10 TNMSMTP TIdSMTP арқылы электрондық поштаны жіберу үшін пайдаланылады пошта серверіғаламтор
11 TNMStrm, TNMStrmServ TCP/IP протоколы арқылы ағынға жазылған екілік деректерді тасымалдаңыз
12 TNMUDP TIdUDP, TIdUDPSсервер UDP протоколы арқылы деректерді жіберу
13 TpowerSock, TNMGeneralServer Жеке клиенттерді (Powersock) және серверлерді (NMGeneralServer) жазу үшін негізгі құрамдас бөліктер ретінде инкапсуляцияланған сыныптар
14 TNMUUпроцессоры TIdUUEncoder, TIdUUDecoder Екілік файлдарды MIME немесе UUENCODE форматына түрлендіру
15 TNMURL Жолдарды HTML пішіміне түрлендіреді және оларды қайта кодтайды

Ерекшелік TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL сияқты сыныптар болып табылады, олар не ескірген хаттамаларды жүзеге асырады немесе баламалы сыныптардың үлкен тобында іске асырылған функционалдығы бар.

Дегенмен, оның предшественниктерінен - ​​Internet және Fastnet құрамдастарынан айырмашылығы, Indy сервері мен деректерді қайта кодтау және шифрлау құрамдастары, сондай-ақ аутентификацияны қолдау (Indy Misc палитрасы) бар. Жоғарыдағы кестеден көріп отырғанымыздай, негізгі хаттамалар мен қызметтерді тек клиент қана емес, сонымен қатар сервер компоненттері де қамтамасыз етеді. Бұл уақыт, жауап беру, пайдаланушы туралы ақпарат алу қызметтері, сонымен қатар HTTP протоколдары, NNTP, UDP және тіпті FTP-нің ең қарапайым нұсқасы.

Indy компоненттерін пайдаланудың кейбір мысалдары

Delphi-дің Indy құрамдастарында IP мекенжайы Host сипатында анықталады, әдетте тек клиенттік қолданбаларда. Серверде орналастырылған құрамдастарда сәйкес портты сұрауды бастау немесе тоқтату әдістері бар - мысалы, IdTCPServer компонентінің Белсенді сипатын өзгерту сәйкес портты сұрауды бастайды немесе тоқтатады. Клиент пен сервер арасында байланыс орнатылғаннан кейін деректерді тасымалдауды бастауға болады.

Indy компоненттері деректердің қауіпсіздігі мен сенімділігіне көп көңіл бөледі. Мысалы, IdTCPClient компонентінде Қосылу және Ажырату әдістері бар. Төмендегі кодтағыдай бағдарламалау техникасын клиент тарапынан қолдану:

TCPClient көмегімен Қосылуды бастаңыз; lstMain.Items.Add(ReadLn) қолданып көріңіз; соңында ажырату; Соңы; Соңы;

және сервер жағынан TIdPeerThread сыныбының AThread данасына параметр ретінде берілген Қосылым сипатын пайдалану:

AThread.Connection көмегімен WriteLn («Негізгі Indy сервер серверінен сәлем.») басталады; Ажырату; Соңы;

тұрақты қосылымның орындалуына немесе қатені дұрыс өңдеуге сене аласыз.

Сәйкес класстардың ReadLn және WriteLn әдістеріне назар аударыңыз - олар стандартты Паскаль енгізу-шығару операторларына ұқсайды. Бұл UNIX бағдарламалау техникасына құрмет, мұнда көптеген жүйелік операциялар сәйкес файлдарды оқу және жазу арқылы орындалады.

Fastnet компоненттері сияқты, Indy құрамдас сыныптарында оқиғаларды басқаруды ұйымдастыру үшін пайдалануға болатын оқиғалар бар. Мысалы, клиентке қосылу кезінде пішінде хабарды көрсетуді ұйымдастыруға болады:

Процедура TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Клиентке қызмет көрсету ]"; Соңы;

Indy осы кітапханаға ғана тән клиент және сервер бөліктері бар протоколдарды жүзеге асыратын құрамдастарды қамтамасыз етеді. TIdGopherServer және TIdGopher құрамдастары клиент жағындағы GetExtendedMenu, GetFile, GetMenu, GetTextFile әдістерінің және сервер жағындағы ReturnGopherItem, SendDirectoryEntry арқасында файлдарды шолуға көмектеседі. әртүрлі түрлері, соның ішінде жасырын деп белгіленгендер, сондай-ақ каталогтар қашықтағы компьютер(MS-DOS операциялық жүйесіндегі dir *.* командасының орындау тәсіліне ұқсас).

IdSMTP және IdMessage құрамдастарын пайдаланып, SMTP протоколы арқылы хат жібере алатын жеке веб-бағдарламаңызды оңай жасауға болады.

Сонымен қатар, IdMessage класы (Indy Misc бетіндегі 23 құрамдас бөліктің бірі) оның атынан туындайтын хабарламаны жасауға жауап береді, ал IdSMTP пошта серверімен байланыс орнатуға жауапты.

Индиде қолданылатын технология оқу мен жазуды блоктауды пайдаланады. Indy қолданбасында қолданылатын кез келген Connect әрекеті қосылымның аяқталуын күтеді. Indy клиент құрамдастарымен жұмыс істегенде, әдетте келесі әрекеттерді орындау қажет:

  • серверге қосылуды сұрау;
  • серверге оқу және жазу үшін сұраныстар жасау (сервер түріне байланысты қадам бір рет орындалады немесе бірнеше рет қайталанады);
  • серверге қосылуды тоқтатыңыз және ажыратыңыз.

Indy компоненттері абстракцияның өте жоғары деңгейін қамтамасыз етуге арналған. TCP/IP стекінің қыр-сырлары мен егжей-тегжейлері бағдарламашыдан жасырылған, сондықтан ол назарын берілген тапсырмаға аудара алады.

Келесі шағын мысалда әдеттегі клиент сеансы көрсетілген:

IndyClient көмегімен Host:= "zip.pbe.com" басталады; // Қоңырау шалатын хост Порт:= 6000; // Қосылуда серверді шақыратын порт; көріңіз // Сіздің кодыңыз осында келеді, соңында Ажыратыңыз; Соңы; Соңы;

Мысалда серверге қосылым орнатылмаса да, try-finally операторының қолданылуына байланысты байланыс әдемі түрде тоқтатылады.

Indy серверінің құрамдас бөліктері қажеттіліктеріңізге және протоколыңызға байланысты пайдалануға болатын әртүрлі сервер үлгілерін сипаттайды.

TIdTCPServer қолданбаның негізгі процесінен тәуелсіз қосымша процесті жасайтын ең жиі қолданылатын сервер құрамдас бөлігі болып табылады. Жасалған процесс кіріс сұрауларын күтуде әлеуетті клиенттер. Ол жауап беретін әрбір клиент үшін жеке қосалқы процесс жасалады. Техникалық қызмет көрсету процесінде орын алатын оқиғалар сәйкес процестердің контекстімен байланысты.

Басқаша айтқанда, әрбір клиент қосылымы үшін TIdTCPServer сыныбы сол ағынның OnExecute оқиға өңдеушісін шақыру арқылы бірегей қосымша ағынды пайдаланады. OnExecute әдісінің ресми параметрі жасалған ағынға сәйкес келетін Athread сыныбының данасына сілтеме болып табылады. Бұл сыныптың Қосылым қасиеті клиент сұрауын өңдеу үшін жасалған TIdTCPConnection сыныбына сілтеме болып табылады. TIdTCPConnection қосылым арқылы оқуды және жазуды, сондай-ақ сеансты орнатуды және аяқтауды қолдайды.

UDP протоколы алдымен сервермен байланыс орнатпай жұмыс істейді (әрбір жіберілген пакет үлкен сеанстың немесе қосылымның бөлігі емес, тәуелсіз деректер жиыны болып табылады). TIdTCPServer әрбір қосылым үшін бөлек ағындарды шығарған кезде, TIdUDPServer барлық UDP протоколының сұрауларын өңдейтін негізгі ағынды немесе жалғыз қосымша ағынды пайдаланады. TIdUDPServer белсенді болғанда, кіріс UDP пакеттерін тыңдау үшін ағын құрылады. Әрбір алынған пакет үшін OnUDPRead оқиғасы ThreadedEvent сипатының мәніне байланысты негізгі ағында немесе тыңдау ағынының контекстінде іске қосылады. ThreadedEvent "False" мәнін бағалағанда, оқиға негізгі ағында көтеріледі. әйтпесе- тыңдау тізбегінде. Оқиға өңделіп жатқанда, басқа сервер әрекеттері блокталады. Сондықтан, OnUDPRead процедураларының мүмкіндігінше жылдам орындалуын қамтамасыз ету маңызды.

Егер бұрыннан бар протоколды пайдаланып бар сервер үшін жаңа клиенттік клиент қолданбасын жасау қажет болса, сіздің міндетіңіз тек клиент қолданбасын әзірлеу және жөндеу. Дегенмен, сіз клиенттік жағын да дамытуыңыз керек кезде сервер қолданбасыбар немесе жаңа хаттаманы қолдану арқылы біз классикалық «тауық пен жұмыртқа» мәселесіне тап болдық. Бағдарламалауды неден бастау керек - клиенттен немесе серверден?

Ақыр соңында клиент те, сервер де жасалуы керек екені анық. Көптеген қолданбалар үшін, әсіресе мәтіндік протоколды (мысалы, HTTP) пайдаланатын қолданбалар үшін серверді жобалау арқылы бағдарламаны құру оңайырақ. Оны жөндеу үшін бұрыннан бар ыңғайлы клиент бар. Бұл Windows және UNIX жүйелерінде қол жетімді Telnet консоль қолданбасы.

Егер сіз терсеңіз консоль командасы telnet 127.0.0.1 80 жергілікті машинаның IP мекенжайы және веб-серверлер пайдаланатын әдепкі порт нөмірі 80, қолданба 1-суретте көрсетілген мәтінмен жауап береді. Windows 2000 және IIS 5.0 үшін 6.

Indy компоненттерін пайдаланып қарапайым серверді жасау үшін сізге қажет:

Қосылым үзілген кезде клиенттерді дұрыс хабардар етіп қана қоймай, сонымен қатар олар орын алған қате жағдайлары туралы ақпарат беретін серверді құрастыру қажет болса, try-finally орнына try-except операторын пайдаланыңыз - мысалы, ретінде келесі мысалда көрсетілген:

TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread) процедурасы; vars: String; AThread арқылы бастаңыз.Connection жасап көріңіз s:= ReadLn; // Сервер тапсырмасын осында орындаңыз // егер ерекше жағдай болмаса, // сервердің жауабын жазыңыз WriteLn(s); e-ден басқасы: Ерекшелік WriteLn(e.Message); end; //қосу end;/final қоспағанда көріңіз Ажырату;аяқтау;аяқтау;

Бұл шағын мысал қарапайым мәтін серверін жасау қадамдарын, сондай-ақ оны жөндеу жолын көрсетеді.

Жоғарыда сипатталған сервер заманауи үлестірілген есептеулерді ұйымдастырудың типтік мысалы болып табылады.

Көп деңгейлі қосымшаларды құру ерекшеліктері

Жақында клиенттердің сұраныстарын қанағаттандыру үшін бірнеше серверлер жиі қолданыла бастады. Осы түрдегі сервер клиенттік сұрауды қабылдап, оны әрі қарай өңдеуге ішінара дайындап, басқа сервермен байланысады және оған түрлендірілген сұранысты немесе сұрауларды жібереді. Екінші деңгейлі сервер өз кезегінде басқа серверлермен байланыса алады. Осылайша, көп деңгейлі сервер архитектурасы туралы айтуға болады.

Әрі қарай, мақсаты дерекқордан деректерді қайтару болып табылатын деректерге қол жеткізу серверін жасаймыз. Дегенмен, бұл сервер дерекқор файлдарын тікелей оқымайды немесе жазбайды. Оның орнына ол клиентке қажетті деректерді іздеу үшін дерекқор серверімен байланысады.

Сонымен, біз үш деңгейлі архитектурасы бар қосымшаны әзірлеуді бастаймыз. Indy құрамдастарын пайдаланып дерекқор серверін жасау үшін сізге қажет:

  1. Жаңа жоба жасаңыз.
  2. Жобаның негізгі пішініне Indy серверлері палитрасынан TIdTCPServer компонентінің данасын орналастырыңыз.
  3. TIdTCPServer1 класының данасы DefaultPort сипатын 6001 мәніне орнатыңыз (әртүрлі қолданбалар үшін қайталанатын порт нөмірлерін болдырмау үшін жоғарырақ мәндер ұсынылады) және Active сипатын шын мәніне қойыңыз.
  4. Жобаға қосу жаңа модуль File | командасын таңдау арқылы Жаңа | Деректер модулі және оған құрамдас палитрасындағы dbExpress қойындысынан SQLConnection және SQLDataSet құрамдастарының даналарын орналастырыңыз.
  5. SQLConnection сыныбының ConnectionName сипатын IBLocal мәніне және LoginPrompt мәнін False мәніне орнатыңыз. Қызметкер.gdb дерекқоры үшін IBLocal конфигурацияламаған болсаңыз, алдымен осы процедураны орындаңыз.

Бәріңе сәлем!

Келесі Web-жобаны әзірлеу кезінде тапсырма туындады - Delphi-де POST әдісі арқылы мәліметтерді серверге тасымалдайтын клиенттік бағдарламалық қамтамасыз етуді енгізу. Қолданба мәтінді жіберуі және файлдарды веб-серверге жүктеп салуы керек.

Сервер жағындағы тілдерді пайдалана отырып, мұндай деректерді жіберуді жүзеге асыру веб-әзірлеу(мысалы, PHP) өте қарапайым, бірақ сервермен өзара әрекеттесетін қосымшаны, көп пайдаланушы бағдарламалық жасақтамасын жазу қажет болса, онда ол біршама күрделірек. Деректер базасына және FTP арқылы Delphi серверінен серверге тікелей қосылу әдісі сөз емес. ол қауіпсіз емес, сенімді емес (парольдерді өзгерту, қосылым деректері және т.б.) және қосымша жасайды. клиент жағында бағдарламалық қамтамасыз ету үйлесімділігі мәселелері. Мәселені шешу үшін мен тілде жазуды жөн көрдім PHP сценарийлері (сервер бөлігі) кіріс POST сұрауларын өңдейді және нәтижені клиентке қайтарады (Delphi қолданбасы). Бұл тәсілдің артықшылығы мынада: барлық қосылымдар мен деректерді өңдеу серверде өтеді, бұл тікелей «қосылудан» әлдеқайда қауіпсіз.

«Гуглға» кірісе отырып, көптеген әртүрлі ақпараттар шығарылды, көбінесе бұл форумдар болды, бірақ бәрі бөліктер болды. Indy нені пайдаланатынын бір нәрсе анықтады, атап айтқанда POST әдісі енгізілген IdHTTP компоненті. Шындығында бәрі қарапайым, бұл әдіс Url ресурсы және DataStream (деректер ағыны) екі параметрін қабылдайды, жауап ретінде ол мәтіндік формада нәтиже береді (бұл беттің HTML коды да болуы мүмкін). Ең бастысы, DataStream (берілетін деректер ағыны) дұрыс қалыптасуы болды, бірақ бұл жолда қосымша тұзақтар пайда болды, атап айтқанда орысша кодтау (бұл дұрыс емес пе). Мұнда желінің ашық кеңістігінде бірнеше сағат серуендеу қызық басталды. Жалпы, сөйлесу жеткілікті, бағдарламалық жасақтаманы практикаға және енгізуге көшейік.

Сондықтан бағдарлама қарапайым. Ол POST әдісі арқылы деректерді серверге жіберуі керек, деректерде « тақырыбы « (түзу), » Сипаттама » ( көп жолды мәтін) және графикалық файл (jpg,png,gif-екілік деректер). Сервер бұл деректерді қабылдауы, оны өңдеуі, графикалық файлды серверде сақтауы және жауап қайтаруы керек. Жауап ретінде қайтарыңыз Delphi қолданбасы, бірдей мәтін тек белгілерді қосумен және жүктелген файлға сілтемемен. Артық ештеңе.

Сервер бөлігін іске асырудан бастайық (API веб-сайтына ұқсас). Кез келген ашыңыз мәтіндік редактор(блокнот) және оған келесі кодты жазыңыз:

"; ) else ( "Тақырып: жоқ" жаңғырығы."
"; ) //Кіріс деректерде "мазмұн" өріс деректерінің бар-жоғын тексеріңіз, егер (!empty($_POST["content"]))( echo "Мазмұн: ".$_POST["content"]."
"; ) else ( "Мазмұн: жоқ" жаңғырығы."
"; ) //(!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" егер "файл" тіркелген файлдың бар-жоғын тексеріңіз. ]); / /файл туралы ақпарат алу (аты, кеңейтімі, т.б.) //Рұқсат етілген түрлер тізімінде файл түрін тексеріңіз(IMPROVISATION:)) if (stripos("jpgpnggif",$finfo["extension"] )==0)( echo ">>>>>>>Файл түрі жарамсыз<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

назар аударыңыз! Сақтау кезінде (блокнот арқылы) «UTF-8» кодтауын көрсету керек, әйтпесе кириллицаны көрсетуде проблемалар туындайды!

Сценарий егжей-тегжейлі түсініктеме беруге тырысты. Бұл сценарийді веб-серверіңізге көшіріңіз, егер жоқ болса, сынақ үшін менің сценарийімді пайдалана аласыз, ол мына жерде орналасқан: http://api.php

Орналасу келесі құрамдастарды пайдаланады: Label, Button(2дана), Edit(2дана), Memo(2дана), CheckBox, OpenDialog, IdHTTP. Келесі компоненттерді атаңыз («қасиет» Аты”):

  1. Өңдеу (атауы) - аты=атауы;
  2. Өңдеу (файлға жол) name=imgfile;
  3. Жаднама (мазмұн)аты = мазмұн;
  4. Жаднама (нәтиже) - аты = жауап;
  5. Түйме(...) - Аты = chkфайл;
  6. Түйме(POST) Аты = PostBut;
  7. OpenDialog (Файлды таңдау диалогы) – Аты = PictDialog;

Біз IdHTTP1 және CheckBox1-ді өзгеріссіз қалдырамыз (шаршаған! :)))).

Кездейсоқ болмас үшін өңдеу» Өңдеу жолы( imgfile), оның ReadOnly сипатын True мәніне орнатыңыз. Сол сияқты, сағат imgfileжәне chkфайл Enabled сипатын жалған мәніне орнатыңыз. Біз оларды CheckBox арқылы белсендіреміз, яғни. Кескінді жүктеп салу керек пе, жоқ па, таңдау мүмкіндігін берейік.

OpenDialog үшін( PictDialog) сүзгіні (Сүзгі сипаты) келесідей орнату керек:

Іс жүзінде визуалды дайындық аяқталды! Кодтауды бастайық!

Жобада біз Indy-мен бірге келетін түрді пайдаланып деректер ағынын қалыптастырамыз - TidMultiPartFormDataStream.Мен TStream бағдарламасында іске асыру нұсқаларын кездестірдім, бірақ онымен жұмыс істеймін TidMultiPartFormDataStream -қарапайымырақ!

Бұл түрді жобамызға қолжетімді ету үшін Uses қолданбасына келесі кітапхананы қосуымыз керек: IdMultipartFormData.

CheckBox1 үшін OnClick оқиғасын жасаңыз (нысанды екі рет басу арқылы) және осы оқиғаға келесі кодты қосыңыз:

TForm1.CheckBox1Click процедурасы(Sender: TObject); бастау //файл жолының белсенді немесе белсенді емес элементтерін және диалогтық түймелерді жасау imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; Соңы;

Мұнда біз объектілерді белсендіреміз imgfile жәнеchkфайлқұсбелгінің болуына байланысты (егер құсбелгі қойылса, нысандар белсенді болады).

Енді суретті таңдауды ұйымдастырайық. Ол үшін түймеде OnClick оқиғасын жасаңыз chkфайл(сонымен қатар нысанды екі рет басу арқылы) және келесіні жазыңыз:

TForm1.chkfileClick процедурасы(Жіберуші: TObject); бастау //диалогты ашыңыз және файлға толық жолды imgfile(TEdit) ішінде енгізіңіз, егер PictDialog.Execute болса, содан кейін imgfile.Text:= PictDialog.FileName; Соңы;

Бұл оқиға сурет таңдау диалогын іске қосады және егер пайдаланушы "басса" Ашық», содан кейін осы файлға жол қосылады imgfile.

Енді біз соңғы «POST» түймесіне келдік. Бұл түйме үшін OnClick оқиғасын жасаңыз және келесі кодты қосыңыз:

TForm1.PostButClick процедурасы(Жіберуші: TObject); var dataPost:TIdMultiPartFormDataStream; start dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8бит"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8бит"; егер CheckBox1.Checked және (trim(imgfile.Text)="") болса //файл таңдалғанын немесе басталмағанын тексеріңіз ShowMessage("Сіз графикалық файлды таңдауыңыз керек!"); Шығу; Соңы; егер CheckBox1.Checked болса dataPost.AddFile("файл",imgfile.Text,""); //файл жауабы бар өріс қосу.Мәтін:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); деректер посты. Бос; соңы;

Сонымен, ретімен (түсініктемелер бар болса да):

Datapost - типтік объект TIdMultiPartFormDataStream. Түрлі типтегі өрістерден тұратын POST сұрау құрылымын жасауға мүмкіндік береді.

dataPost . AddFormField (" тақырып ", тақырып . Мәтін ," utf -8 "). мазмұнды тасымалдау := " 8 бит "; – DataPost-қа «тақырып» деп аталатын өрісті, «title.Text» мәнін қосады, жіберілетін деректердің кодтауын «utf-8» мәніне орнатады (параметр қажет емес, бірақ оны нақты көрсетпей, кириллица алфавит сұрақ белгілерімен «?») және өте маңызды «ContentTransfer» әдісімен беріледі. Бұл әдіссіз деректер серверге жіберіледі » абракадабра«. Жіберуші жағындағы өрістің атауы («тақырып») сценарийде көрсетілген атқа сәйкес келуі керек екенін ескеріңіз: $_POST["title"].

Сол сияқты, деректер «мазмұн» өрісінде беріледі.

dataPost . addfile (" файл ", imgfile . Мәтін ,"") - бұл жол арқылы біз файлдағы деректермен ағынды қалыптастырамыз.

Барлығы, деректер жасалады, оны сервердегі сценарийге тасымалдау және жауап алу қалады:

жауап.Мәтін:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,);

өйткені TMemo жол үзілім тегін түсінбейді "
», біз оны «#13#10» түсінікті жол үзу таңбаларымен ауыстыру үшін « » функциясын қолданамыз.

Барлығын аяқтағаннан кейін біз жадты DataPost нысанынан келесі жолмен тазалаймыз:

datapost.Free;

Біздің мысалда бұл процедураның соңында автоматты түрде болады, бірақ бәрібір ...

Іс жүзінде экрандағы бағдарламаның нәтижесі:

Осылайша, біз серверге кез келген деректерді, файлдарды жібере аламыз, бұл деректерді серверде өңдей аламыз және жауап арқылы сценарийдің орындалу нәтижесін қолданбаға айта аламыз. Ол тіпті 0 немесе 1 болуы мүмкін, бұл қолданбаға әрі қарай әрекет ету үшін сигнал береді.

Барлығы. Бәріңе сәттілік. Ақпарат пайдалы болды және сізге пайдалы болады деп үміттенемін.

Дайын мысал мен сценарийді жүктеп алуға болады.

Толық модуль коды:

Unit PostUnit; интерфейс Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCdPConnection, IdTCTCConnection пайдаланады. IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; TForm1 түрі = сынып(TForm) IdHTTP1: TIdHTTP; тақырып: TEdit; мазмұны: TMemo; PostBut: TButton; жауап: TMemo; Label1: T Label; Label2: T Label; Label3: T Label; imgfile: TEdit; chkфайл: TButton; Label4: T Label; CheckBox1: TCheckBox; PictDialog: TOpenDialog; процедурасы PostButClick(Жіберуші: TObject); процедурасы chkfileClick(Жіберуші: TObject); процедурасы CheckBox1Click(Sender: TObject); private ( Private declarations ) public ( Public declarations ) end; var Form1: TForm1; іске асыру ($R *.dfm) процедурасы TForm1.CheckBox1Click(Sender: TObject); бастау //файл жолының белсенді немесе белсенді емес элементтерін және диалогтық түймелерді жасау imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; Соңы; procedure TForm1.chkfileClick(Sender: TObject); бастау //диалогты ашыңыз және файлға толық жолды imgfile(TEdit) ішінде енгізіңіз, егер PictDialog.Execute болса, содан кейін imgfile.Text:= PictDialog.FileName; Соңы; процедурасы TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; start dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8бит"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8бит"; егер CheckBox1.Checked және (trim(imgfile.Text)="") болса //файл таңдалғанын немесе басталмағанын тексеріңіз ShowMessage("Сіз графикалық файлды таңдауыңыз керек!"); Шығу; Соңы; егер CheckBox1.Checked болса dataPost.AddFile("файл",imgfile.Text,""); //файл жауабы бар өріс қосу.Мәтін:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); деректер посты. Бос; соңы; соңы.

Indy - бұл әртүрлі желілік қосымшаларды жасауға мүмкіндік беретін өте қуатты компоненттер пакеті. Бұл оқулықта мен TIdTCPClient және TIdTCPServer құрамдастарын пайдаланып клиент-сервер қолданбаларын қалай жасауға болатынын көрсетемін.

Ең алдымен, осы компоненттердің екі маңызды артықшылығын атап өткім келеді. Олардың ең маңыздысы көп ағынды болып табылады, яғни сервер әрбір клиент үшін жеке ағын жасайды және бұл көп ядролы процессоры бар компьютерлердегі серверлік бағдарламаның жұмысына әсер ететіні сөзсіз. Екінші артықшылығы - пайдаланудың қарапайымдылығы. Қарапайым клиент-сервер қосымшасын жазу үшін кодтың 10-20 жолы жеткілікті. Бұл компоненттер пакеті стандартты Delphi жинақтарында бар.

Клиенттен серверге мәтіндік хабарлама жіберуге мүмкіндік беретін қарапайым бағдарламаны жазайық. Сервер құруды бастайық.
IdTCPServer компонентін Indy серверлері қойындысынан пішінге орналастырыңыз. Пішіннің OnCreate оқиғасында орындалу уақытында осы құрамдас үшін барлық параметрлерді жасаймыз:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= true;
Мұнда бәрі қарапайым - біз сервер жұмыс істейтін портты көрсетеміз және сервердің өзін іске қосамыз.

Клиенттен серверде деректерді алу үшін «OnExecute» арнайы оқиғасы бар. Бұл оқиға келесідей көрінеді:

баста
Соңы;

Оқиғаның мазмұнын келесідей өңдейік:
процедура TForm3.IdTCPServer1Execute(ACContext: TIdContext);
var
l:жол; // біз қабылдайтын жол айнымалысы
баста
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
Соңы;

Енді серверге хабарлама келген бойда оны l жолдық айнымалысына жазып, көп жолды мәтіндік өрісте көрсетеміз.

Бұл таңқаларлық емес, серверді құру аяқталады. Қалғанының бәрін Инди біз үшін жасайды. Клиенттік бағдарламадан бастайық. Ол серверге қосылып, оған хабарлама жібереді және серверден ажыратылады.

Жаңа жобаны жасайық, IdTCPClient компонентін пішінге орналастырайық, оны «Indy Clients» қойындысынан табуға болады. Біз сондай-ақ қарапайым Өңдеу мен түймені орналастырамыз. Түйме үшін OnClick оқиға өңдеушісін жасайық, оның ішінде біз жазамыз:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;

Бұл кодты OnCreate оқиғасына орналастыру қажет емес. Сіз бұл кодты қалаған жерге орналастыра аласыз.
Бірінші жолда біз портты тағайындаймыз және біз сервер бағдарламасында көрсетілген портты көрсетуіміз керек, әйтпесе клиент серверді таба алмайды. Содан кейін сервердің IP мекенжайын енгізіңіз. Сервердің өзі жергілікті желіде де, қашықтан да орналасуы мүмкін. Соңғы жағдайда қосылу Интернет арқылы жүзеге асырылады және Интернетте IP мекенжайын көрсету қажет.

Мен «127.0.0.1» мекенжайын көрсеттім, ол сервер клиент жұмыс істейтін компьютер екенін көрсетеді. Бұл әдіс желілік қосымшаларды тестілеу үшін өте ыңғайлы.
Содан кейін біз қосыламыз, хабарлама жібереміз және ажыратамыз.Хабардың өзі сияқты IP мекенжайын Өңдеуден немесе кез келген жол айнымалысынан алуға болады.

Клиенттік бағдарлама бойынша жұмыс та аяқталды. Көріп отырғаныңыздай, Инди біз үшін үлкен жұмыс істейді, бұл тіпті тәжірибесіз бағдарламашыға өзінің желілік қосымшасын жасауға мүмкіндік береді.

Мақала ұнады ма? Достарыңызбен бөлісіңіз!
Бұл мақала пайдалы болды ма?
Иә
Жоқ
Пікіріңізге рахмет!
Бірдеңе дұрыс болмады және сіздің дауысыңыз есептелмеді.
Рақмет сізге. Сіздің хабарламаңыз жіберілді
Мәтіннен қате таптыңыз ба?
Оны таңдаңыз, басыңыз Ctrl+Enterжәне біз оны түзетеміз!