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

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

Сергей Досюков Майк Фам

Бұл мақала Indy жинағы мен Delphi 7 көмегімен дербес веб-қызмет құру жолын және SOAP протоколына негізделген веб-қызметтерге Delphi 7 қолдауын көрсету үшін Indy жинағын қалай пайдалану керектігін түсіндіреді. Веб-қызметтерді жасау туралы қосымша ақпаратты Borland қауымдастығы сайтындағы Ник Ходжестің тамаша мақаласын қараңыз: «Желідегі Шекспир».

Ерте ме, кеш пе, дербес HTTP сервері болып табылатын және веб-қызметтерге қолдау көрсететін серверді жасау қажет болуы мүмкін. Мысалы, Delphi көмегімен жасалған n-деңгейлі қолданба үшін SOAP негізіндегі қолданба серверін жасағыңыз келуі мүмкін.

Кіріспе

Delphi онлайн анықтамасы веб-қызмет, MIDAS серверін (COM, DCOM үлгісі) жасау туралы тамаша қадамдық нұсқаулықты береді, бірақ негізінде дербес n-деңгейлі MIDAS қолданбасын жасау туралы ақпарат аз немесе мүлдем жоқ. SOAP протоколында.

Бұған дейін Дэйв Ноттадж жариялаған. Бұл мақала Delphi 6 жүйесінде Datamodule SOAP интерфейстерін жариялау мүмкіндігімен SOAP қолдайтын веб-қызметін құру идеясын ұсынды, сондықтан бұл мақала сізге n-деңгейлі MIDAS жүйелерін жасауды үйретті.

Borland Delphi 7 және жаңа Indy жинағында бұл функция үшін кірістірілген қолдау бар.

Дегенмен, кірістірілген қолдауға қарамастан, бұл мүмкіндік құжатталмаған.

Borland веб-конференциясындағы соңғы жарияланымдар және Google сервері арқылы интернетте іздеу авторларға Delphi 6-дан Delphi 7-ге бар кодты түрлендіру жолын әзірлеуге мүмкіндік берді. Бірақ - бәрі жақсы уақытта.

Басты идея

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

  • дербес HTTP сервері болу;
  • платформа ретінде Indy пайдалану;
  • SOAP арқылы жариялауды қолдау;
  • SOAP/HTML негізінде өз n-деңгейлі серверіңізді жасауға мүмкіндік беретін SOAP DataModules жариялау мүмкіндігі.

HTTP сервері және SOAP

Көптеген адамдар Indy біледі және бұрын THTTPServer құрамдастарын пайдаланған. Бұл компонентті өтінім пішініне орналастыру оңай, бірақ оны SOAP-қа қалай қолдау көрсетуге болады? «C:Program FilesBorlandDelphi7SourceIndy» каталогында IdHTTPWebBrokerBridge.pas файлын таба аласыз. Бұл дәл керек нәрсе.

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

Төменде TIdHTTPWebBrokerBridge деп аталатын SOAP пакеттеріне қолдау көрсету үшін кеңейтілген THTTPServer құрамдас бөлігін ауыстыруды жүзеге асыру сипатталған. Бұл құрылым TCustomHTTPServer жүйесінен мұраланған және негізгі сұрауды байланыстыруды қолдайтын сынып.

Бұл класс палитрада қолжетімді болмағандықтан, кодты іске қосқан кезде оны кәдімгі нысан ретінде анықтау қажет болады.

Бұл нысанды SOAP бағдарламасымен жұмыс істеуге мүмкіндік беретін қосымша сипаттарды қоспағанда, кәдімгі THTTPS сервері сияқты пайдалануға болады.
Дегенмен, алдымен қажетті кодты дайындауды қарастырайық.

Веб брокер және Инди

Бұрын веб-қызметтерді жасауға тура келгендер мұны істеу үшін қолданылатынын біледі. веб-брокер. Delphi 7, Delphi 6 сияқты, SOAP-ты қолдау үшін WebBroker архитектурасын пайдаланады.

Сондықтан сізге модуль жасау керек TWebModuleжәне оған келесі үш құрамдас бөлікті орналастырыңыз: THTTPSoapDispatcher, THTTPSoapPascalInvoker және TWSDLHTMLPublish. Олардың барлығы Құрамдас палитрасының WebServices қойындысынан қолжетімді. SOAPDispatcher бағдарламасы SOAPPascalInvoker бағдарламасына байланысты болса, өтінім пішіні аяқталды. Соңғы нәтиже келесі суретте көрсетілгендей болуы керек:

(модуль uWebModule.pas)

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

WebModule және Indy

HTTP серверін іске асыру үшін қажет кодтың басқа бөлігіне көшейік.

Көріп отырғаныңыздай, TIdHTTPWebBrokerBridge бағдарламасында өзіңіздің WebModule-ді тіркеуге және оны серверге қолжетімді етуге мүмкіндік беретін RegisterWebModuleClass әдісі бар.

Осылайша, fServer сервер нысанын жасағаннан кейін, сізге тек fServer.RegisterWebModuleClass (TwmSOAPIndy) сыныбына қоңырау шалу қажет.

Ескерту. TIdHTTPWebBrokerBridge стандартты іске асыруымен TwmSOAPIndy нысаны сұрау келген сайын жасалады. Бұл қажет емес екені анық. Сондықтан, бұл нысан Сервер нысаны бар болғанша тұрақты түрде жасалуын қамтамасыз ету үшін сыныпты өзгертуге болады. Қосымша ақпарат алу үшін сыныпты іске асыру құжаттамасына жүгіну ұсынылады.

Сервер дайын ба?

UDP протоколы мәтіндік хабарламаларды жіберу үшін өте жақсы, яғни жергілікті чаттарды және т.б. ұйымдастыруға болады. Мен Delphi-де UDP-мен ең қарапайым жұмыстың мысалын келтіруді шештім.

Қадамдық нұсқаулық:

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

Негізі бірдеңе түсініксіз болса, маған сұрақ қоюға болады. Міне, нақты код:

пайдаланады
Windows, хабарлар, SysUtils, нұсқалар, сыныптар, графика, басқару элементтері, пішіндер,
Диалогтар, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

түрі
TForm1 = сынып (TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
1 түймесі: TB түймесі;
Label1: T Label;
процедурасы FormCreate(Жіберуші: TObject);
procedure FormClose(Жіберуші: TObject; var Action: TCloseAction);
процедура Button1Click(Жіберуші: TObject);
процедура IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
жеке
(Жеке декларациялар)
қоғамдық
(Қоғамдық мәлімдемелер)
Соңы;

var
Пішін1: TForm1;

($R *.dfm)
[b]//Хабар жіберу процедурасы
процедура TForm1.Button1Click(Sender: TObject);
баста
тырысу
IdUDPClient1.Active:= Рас;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
егер IdUDPClient1.Connected болса
баста
IdUDPClient1.Send(TimeToStr(Уақыт));
Label1.Caption:= "жарайды";
Соңы;
IdUDPClient1.Active:= False;
Дыбыстық сигнал;Бип;Бип;
қоспағанда
MessageDlg("Бірдеңе дұрыс болмады =(", mtError, , 0);
Соңы;
Соңы;
[b]
//Қосу өшіру. Пішінді бастау және жабу кезінде UDP сервері
procedure TForm1.FormClose(Жіберуші: TObject; var Action: TCloseAction);
баста
IdUDPServer1.Active:= False;
Соңы;

процедурасы TForm1.FormCreate(Sender: TObject);
баста
IdUDPServer1.Active:= Рас;
Соңы;

[b]//Деректерді қабылдау кезінде сервердің жауап беру процедурасы
процедура TForm1.IdUDPServer1UDPRead(AThread: TIdUDPLlistenerThread;
AData: Тбайт; ABinding: TIdSocketHandle);
Var
i: бүтін;
s:жол;
баста
s:="";
тырысу
i:= 0;
ал (AData[i] 0) жасайды
баста
s:= s + chr(AData[i]);
i:= i + 1;
Соңы;
ақырында
Label1. Caption:= s;
Соңы;
Соңы;

Интернеттің негізгі қызметтері мен протоколдарынан басқа, мүмкіндіктерін Интернет әзірлеушілері жиі қолданатын қосымша қызметтердің кең ауқымы бар. Сонымен қатар, ақпаратты шолғыш арқылы көрсету мүмкіндігі әрқашан Интернет қолданбалары үшін қолайлы шешім бола бермейді. Бұл жағдайда деректермен алмасу үшін Интернет-инфрақұрылымын пайдалану және ақпаратты көрсетуді, мысалы, 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 қызметтері және т.б. (Cурет 1).

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

TIdTCPClient және TIdTCPServer

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

TIdUDPClient және TIdUDPServer

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

TIdDICTServer

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

TIdDISCARDServer

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

TI dEcho және TI dECHOServer

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

TIdFinger және TIdFingerServer

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

TIdFTP

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

TIdGopher және TIdGopherServer

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

TIdHostNameServer

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

TIdHTTP және TIdHTTPServer

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

TIdIcmpClient

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

TIdPOP3

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

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

TIdSMTP

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

TIdSNTP

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), сондай-ақ Интернет-қосымшаларды әзірлеуде жиі қолданылатын басқа да көптеген пайдалы компоненттер мен утилиталар (3-сурет).

TIdAntiFreeze

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

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

TIdDateTimeStamp

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

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) шифрлау алгоритмінің әртүрлі сорттары бар компоненттер. Олардың барлығы араластыруға негізделген, бір жақты және шифрды шешу алгоритмдері жоқ.

Протокол клиенті мен сервер құрамдастары Интернет пен Fastnet палитрасындағы негізгі (ClientSocket, ServerSocket) және басқа компоненттермен бірге немесе олардың орнына сервер мен клиенттік Интернет қолданбаларын әзірлеу үшін пайдаланылуы мүмкін. 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 құрамдастарында қол жетімді барлық дерлік функцияларды жүзеге асырады.

Ерекшелік 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 протоколы арқылы хат жібере алатын жеке веб-бағдарламаңызды оңай жасай аласыз (4-сурет).

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

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

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

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

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

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

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

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

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

Басқаша айтқанда, әрбір клиент қосылымы үшін 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 компоненттерін пайдаланып қарапайым серверді жасау үшін сізге қажет:

  1. Жасау жаңа жоба.
  2. Жобаның негізгі пішініне Indy Servers палитрасынан TIdTCPServer компонентінің данасын орналастырыңыз (Cурет 7).
  3. TIdTCPServer1 сыныбының данасы DefaultPort сипатын 6002 мәніне (әртүрлі қолданбалар үшін порт нөмірлерінің қайталануын болдырмау үшін жоғарырақ мәндер ұсынылады) және Белсенді сипатын True мәніне орнатыңыз.
  4. OnExecute оқиғасын өңдейтін TIdTCPServer1 сыныбының даналық әдісіне келесі мәтінді қосыңыз: procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); vars: String; i: бүтін; AThread.Connection арқылы бастаңыз WriteLn («Бүтін санды теріңіз және енгізіңіз»); s:= ReadLn; i:= StrToInt(s); WriteLn(s + " шаршы - " + IntToStr(i*i)); WriteLn(s + "бүтін сан емес") қоспағанда; Соңы; соңында ажырату; Соңы; Соңы;

    Жоғарыдағы оқиға өңдегіші сияқты әдістер қосылым мәлімдемелері қалай өңделгеніне қарамастан клиентпен қосылымды тоқтату және күтпеген қосылу уақытының кідірістерін дұрыс өңдеу үшін try-finally мәлімдемелерін қамтуы керек.

  5. Жобаны құрастырыңыз және сақтаңыз, оны дербес бағдарлама ретінде немесе Delphi астында негізгі мәзір командасын таңдағаннан кейін IDE Tools | Түзету параметрлері және терезенің төменгі сол жақ бұрышында орналасқан Біріктірілген жөндеу опциясын өшіру (Cурет 8).
  6. Консоль терезесін ашып, telnet 127.0.0.1 6002 деп теріңіз.
  7. Терезе сервер жасайтын мәтінді көрсетеді (Cурет 9).
  8. Мысалы, 9 санын енгізе отырып, сіз суретте көрсетілген пішінде сервердің реакциясын көре аласыз. 10.

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

  9. Windows жағдайындағы шығу пәрмені және UNIX жағдайында "ctrl+]" консоль терезесінен шыға алады.
  10. 5-қадамды орындау кезінде іске қосу опциясы астынан пайдаланылса бағдарламалау орталары, Біріктірілген жөндеу опциясын бастапқы күйіне қайтарыңыз.

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

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

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 мекенжайын Өңдеуден немесе кез келген жол айнымалысынан алуға болады.

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

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

Индиге кіріспе
Авторы: Чад З. Хоуэр
Негізгі бет: 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 компоненті
Indy-де пайдаланушы интерфейсін мұздату мәселесін шешетін арнайы компонент бар. Қолданбаңыздың кез келген жеріне бір 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 стекінің күрделілігі мен егжей-тегжейлері бағдарламашыдан жасырылады.Әдетте, Indy-дегі әдеттегі клиент сеансы келесідей көрінеді:
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.Серверге қосылу (Қосылу;) 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 секунд ішінде жауап береді.

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