Delphi izmantotie Indy komponenti. Piemērs darbam ar Indy UDP komponentiem (serveris, klients) Delphi

Īsumā, Indy ir komponenti ērtam darbam ar populāriem interneta protokoliem. To darbības princips ir balstīts uz kontaktligzdu izmantošanu bloķēšanas režīmā. Indy ir interesanta un ērta, jo tā ir diezgan abstrakta. Un programmēšana Indijā ir lineāra programmēšana. Starp citu, internetā ir plaši izplatīts tulkots raksts, kurā ir vārdi "bloķēšanas režīms nav velns" :)) Savulaik mani ļoti uzjautrināja šis tulkojums. Raksts ir daļa no Hūvera un Hariri grāmatas "Depths of Indy". Principā, lai strādātu ar Indy, jums tas viss nav jāizlasa, taču es tomēr iesaku iepazīties ar interneta protokolu darbības principiem. Kas attiecas uz "velnišķo" režīmu. Bloķējošs ligzdas zvans faktiski neatgriež kontroli, kamēr tas nav pabeidzis savu uzdevumu. Zvanot galvenajā pavedienā, lietojumprogrammas saskarne var sastingt. Lai izvairītos no šīs nepatīkamās situācijas, Indijas izstrādātāji izveidoja TIdAntiFreeze komponentu. Jums tas vienkārši jāiemet veidlapā - un lietotāja interfeiss tiks viegli pārzīmēts, veicot zvanu bloķēšanu.

Jūs droši vien jau esat iepazinies ar dažādu Delfos cilņu "Indy (...)" saturu. Tur ir daudz komponentu, un katrs no tiem var būt noderīgs. Pats ar visiem neesmu strādājis, jo neredzu vajadzību tos pētīt bez konkrēta uzdevuma.

Delphi pamata izplatīšana ietver Indy v.9 ar santīmiem. Iespējams, būtu ieteicams nekavējoties jaunināt uz vairāk jauna versija(piemēram, man šobrīd ir 10.0.76, bet ir arī vēlāki, šķiet).

Ir klienta un servera komponenti darbam ar tiem pašiem protokoliem. Indy patiešām vienkāršo lietojumprogrammu izstrādi, atšķirībā no iespējas izstrādāt to pašu funkcionalitāti ligzdās. Piemēram, lai izveidotu savienojumu ar serveri, jums vienkārši jāizsauc savienojuma metode. Veiksmīga savienojuma izveide tiks atzīmēta ar metodi, kas atgriežas bez izņēmuma. Ja savienojums netiek izveidots, tiks izmests izņēmums.

"Akadēmiskais" piemērs (kods nedarbojas, nepalaidiet to :)):

Ar IndyClient darīt
sākt
Host:= "test.com";
Ports:= 2000;
Savienot;
Izmēģiniet
// strādāt ar datiem (lasīt, rakstīt...)
beidzot
Atvienot;
beigas;
beigas;

Saimniekdatoru un portu var iestatīt objekta inspektorā vai izpildlaikā.

Kāpēc parsēšanas uzdevumos var izmantot Indy komponentus? Dažādi lietojumi! Vienkāršākais ir iegūt lapas saturu (ar to droši vien jau ir saskārušies visi), izmantojot IdHTTP komponentu:

Var
rcvrdata: TMemoryStream;
idHttp1: TidHttp;
sākt
idHttp1:= TidHttp.Izveidot(nulle);
rcvrdata:= TMemoryStream.Create;
idHttp1.Request.UserAgent:= "Mozilla/4.0 (saderīgs; MSIE 5.5; Windows 98)";
idHttp1.Request.AcceptLanguage:= "ru";
idHttp1.Response.KeepAlive:= true;
idHttp1.HandleRedirects:= true;
mēģināt
idHttp1.Get(Rediģēt1.Teksts, rcvrdata);
beidzot
idHttp1.Bezmaksas;
beigas;
ja rcvrdata.Izmērs > 0, tad sāciet
ShowMessage("Saņemts " + inttostr(rcvrdata.Size));
rcvrdata.SaveToFile("c:\111.tmp");
beigas;
rcvrdata.Bezmaksas;
beigas;

Kā redzat, jūs varat ne tikai iegūt lapas saturu, bet arī simulēt dokumenta ielādi no konkrēta klienta. Indy komponenti parasti ir noderīgi, lai ģenerētu galvenes un POST pieprasījumus. Vairāk par to ar piemēriem nākamreiz.

Lai būtu informēts par emuāra atjauninājumiem, varat

Indy komponenti, ko izmanto Delphi 6.

Papildus pamata interneta pakalpojumiem un protokoliem ir pieejams plašs papildu pakalpojumu klāsts, kuru iespējas bieži izmanto interneta izstrādātāji. Turklāt iespēja parādīt informāciju, izmantojot pārlūkprogrammu, ne vienmēr ir pieņemams risinājums interneta lietojumprogrammām. Šajā gadījumā datu apmaiņai ir saprātīgi izmantot interneta infrastruktūru un nodrošināt informācijas attēlošanu caur sarežģītākām klientu aplikācijām, kas izstrādātas, piemēram, Delfos.

Pieņemsim, ka jums ir jāievieš specializēta servera loģika, kas nav iekļauta standarta tīmekļa serveros. Lai atrisinātu šīs klases problēmas, Delphi ietver Internet Direct (Indy) bibliotēku no Nevrona Designs (http://www.nevrona.com/Indy/). Šai bibliotēkai, kas izstrādāta speciāli Borland Delphi, jau ir astoņas versijas, no kurām jaunākā ir iekļauta jaunajā Delphi versijā. Komponentu komplekts ir sadalīts trīs grupās: klients (Indy Client), serveris (Indy Servers) un palīgs (Indy Misc).

Indy klienti un Indy serveri

Lielākā daļa Indy Client un Indy Servers komponentu ir pāri, kas atbilst protokolu un pakalpojumu klienta un servera daļām (izņemot noteiktus, galvenokārt servera komponentus, piemēram, TunnelMaster un TunnelSlave), un ļauj izmantot tādus protokolus kā TCP/IP. , UDP, NNTP, SMTP, FTP, HTTP, kā arī servisi ECHO, FINGER, WHOIS u.c.

Indy klienta komponenti tiek rakstīti, izmantojot ligzdas. Klienta puses ligzdai ir nepieciešams savienojums ar serveri. Ja savienojums ir izveidots, klients un serveris var sākt apmainīties ar ziņojumiem. Šie ziņojumi ir dažāda rakstura, taču parasti apmaiņa notiek, izmantojot noteiktu protokolu (piemēram, HTTP).

TIdTCPClient un TIdTCPServer

Šie komponenti tiek izmantoti, lai atbalstītu vienu no galvenajiem tīkla protokoliem - TCP (Transmission Control Protocol), un tie ir arī TIdSMTP un TIdFTP komponentu bāzes klases. TIdTCPServer klasei ir ThreadMgr rekvizīts, kura noklusējuma vērtība ir nulle. Ja ThreadMgr ir nulle, kad ir iespējots TIdTCPServer, TIdThreadMgrDeafault klase tiks izveidota netieši. Pretējā gadījumā tiek izmantots instalētais procesa pārvaldnieks.

TIdUDPClient un TIdUDPServer

Šīs sastāvdaļas tiek izmantotas atbalstam tīkla protokols UDP (User Datagram Protocol) un ir arī pamata klases vairākiem citiem Indy komponentiem.

TIdChargenServer

Komponents tiek izmantots, lai ģenerētu nejaušus simbolus, parasti testēšanas nolūkos.

TIdDayTime un TIdDayTimeServer

Komponenti tiek izmantoti, lai nodrošinātu laika pakalpojumu. Klients pieprasa, un serveris ziņo par pašreizējo datumu un laiku.

TIdDNSResolver

Šis ir klienta komponents, kas apkalpo pieprasījumus no DNS (Domain Name Service) servera. DNS servera vaicājumi ir paredzēti, lai aizstātu datora nosaukumu ar tā IP adresi. TIdDNSResolver ir TIdUDPClient klases pēctecis.

TIdDICTServeris

Servera komponents, kas atbalsta vārdnīcas servera protokolu (DICT), servera puses vārdnīcu, kuras pamatā ir TCP protokols un kas ļauj klientam piekļūt dabiskās valodas vārdnīcai.

TIdDISCARDServeris

Servera komponents, kas atbalsta ierakstu serveri. Ierakstus var izmantot kā atkļūdošanas un mērīšanas rīku. Ierakstu dienests vienkārši nodod visus datus tiem, kas tos vēlas saņemt.

TI dEcho un TI dECHOServer

Komponenti ir paredzēti, lai nodrošinātu atbildes pakalpojumu, ko parasti izmanto, lai pārbaudītu tīkla stāvokli. Klients nosūta īsziņu serverim, serveris atdod ziņu klientam. Ja ziņojums ir izkropļots, tīkla darbības traucējumi.

TIdFinger un TIdFingerServer

Komponenti ir paredzēti, lai nodrošinātu protokolu, kas ļauj lietotājam vaicāt datus par citu lietotāju klātbūtni sistēmā. Daži serveri apstrādā šādus klientu pieprasījumus. Izmantojot šo komponentu pāri, varēsiet apkalpot klientu pieprasījumus, kas nosaka citu lietotāju klātbūtni sistēmā.

TIdFTP

Komponents ietver pilnu atbalstu failu pārsūtīšanas protokolam - FTP (File Transfer Protocol). Tiek atbalstīta pasīvā un aktīvā datu pārsūtīšana, kā arī tādas darbības kā GET un PUT, direktoriju dzēšana, kvotu iegūšana, failu un direktoriju izmēri. TI dFTP darbībai izmanto TIdSimpleServer klasi. Kad notiek FTP failu pārsūtīšana, datu pārsūtīšanai tiek atvērts sekundārais TCP savienojums un tiek aizvērts, kad dati ir pārsūtīti. Šo savienojumu sauc par “datu saiti”, kas ir unikāla katram pārsūtāmajam failam.

TIdGopher un TIdGopherServer

Šie komponenti ir paredzēti, lai nodrošinātu tīkla protokolu, kas ir aizstāts Nesen no WWW (World Plašais tīmeklis) HTTP protokols. Serveris, kas ievieš šo protokolu, nodrošina hierarhisku izplatītu dokumentu plūsmas atbalsta sistēmu. Šī komponentu pāra piemērs, kas atrodas direktorijās \demos\indy\GopherClient un \demos\indy\GopherServer, parāda, kā šo protokolu var izmantot, lai nodrošinātu lokālais tīkls informācija par failiem, kas atrodas jūsu datorā, ieskaitot slēgtos.

TIdHostNameServer

Servera komponents, kas paredzēts vietējā servera nosaukuma nodošanai klientiem.

TIdHTTP un TIdHTTPserveris

Komponenti tiek izmantoti, lai nodrošinātu HTTP tīkla protokolu (tiek atbalstītas versijas 1.0 un 1.1, tostarp GET, POST un HEAD darbības). Turklāt tiek nodrošināts atbalsts autentifikācijai un starpniekserveru lietošanai. Servera komponents tiek izmantots, lai nodrošinātu pakalpojumus citam tīmekļa serverim, kas atbalsta noteiktu protokolu. TIdHTTPServer atvieglo tādu funkciju ieviešanu kā sīkdatnes, stāvokļa pārvaldība utt.

TIdIcmpClient

Klienta komponents, kas paredzēts, lai nodrošinātu interneta vadības ziņojumu protokolu (ICMP), ko izmanto, lai veiktu ping operācijas un tīkla izsekošanu.

TIdPOP3

Klienta komponents, kas paredzēts pasta nodaļas protokola (POP) nodrošināšanai, tostarp atbalstam MIME kodēšanai un dekodēšanai, kā arī vairāku baitu rakstzīmju pārraidei.

TIdIMAP4Serveris

Servera komponents, kas paredzēts, lai atbalstītu IMAP (Internet Message Access Protocol) darbības serverī. Protokols ļauj meklēt ziņojumus E-pasts serverī. Atšķirība starp IMAP un POP protokoliem ir tāda, ka POP protokolam ir nepieciešams papildu atmiņa glabāt datus, un IMAP protokols piekļūst serverim, nevis klienta mašīnai. IMAP4 tika izveidots, lai aizstātu POP3, taču POP3 joprojām ir plaši izmantots standarts līdz šai dienai.

TIdIRCServeris

Servera komponents, kas paredzēts, lai atbalstītu visbiežāk izmantotās pakalpojumu darbības internetā, ko parasti sauc par tērzēšanu. Komponents nodrošina pamata celtniecības klucīši IRC (Internet Relay Chat) serverim.

TIdMappedPortTCP

Servera komponents, kas paredzēts kartētu portu izveidošanai, kurus bieži izmanto starpniekserveros. Šī komponenta metodes ļauj kartēt vienu portu ar citu. Piemēram, 80. portu var kartēt ar 3000. portu, un visi pieprasījumi uz pirmo portu (80. portu) tiks pārsūtīti uz otro portu (3000. portu).

TIdNNTP un TIdNNTPServer

Šie komponenti ir nepieciešami, lai atbalstītu tīkla ziņu pārsūtīšanas protokolu (NNTP), ko izmanto ziņu pakalpojumos. Klienta komponents ietver atbalstu MIME kodēšanai un dekodēšanai, kā arī atbalstu vairāku baitu rakstzīmēm un alternatīviem kodējumiem. Servera komponents ļauj izveidot ziņu serverus. Ir svarīgi atzīmēt, ka TIdNNTPServer nav pilnvērtīgs ziņu serveris, bet gan komponents, kas nodrošina šāda servera pamata funkcionalitāti.

TIdQOTD un TIdQOTDServer

Komponenti tiek izmantoti, lai nodrošinātu Dienas piedāvājuma pakalpojumu. Klienta komponents izveido savienojumu ar servera komponenta gadījumu, lai iegūtu ikdienas cenu. Katrs servera gadījums satur unikālu citātu datubāzi.

TIdSMTP

Klienta komponents, kas paredzēts lietošanai vienkāršā pasta pārsūtīšanas protokola (SMTP) lietojumprogrammās, nodrošinot atbalstu autentifikācijai, MIME kodēšanai un dekodēšanai, kā arī vairāku baitu rakstzīmju atbalstam.

TIdSNTP

Klienta komponents, kas paredzēts, lai nodrošinātu SNTP (Simple Network Time Protocol) - laika pakalpojumu. Var izmantot, lai izveidotu savienojumu ar jebkuru laika pakalpojumu, lai noteiktu pašreizējo datumu un laiku.

TIdSimpleServer

Servera komponents, kas nodrošina vieglu TCP serveri. Ļauj organizēt punkta-punkta savienojumu. To izmanto, lai izveidotu serverus ar vienu lietotāju, tas ir, vienlaikus var apkalpot tikai vienu savienojumu. Atšķirībā no TIdTCPServer komponenta, tas neizraisa sekundārus procesus, gaidot pieprasījumus no klientiem un apstrādājot šos pieprasījumus. Citiem vārdiem sakot, ja serveris apkalpo klienta pieprasījumu un tajā laikā cits klients ar to sazinās, lai izveidotu savienojumu, tas tiks bloķēts līdz pirmā pieprasījuma apstrādes beigām.

TIdTelnet un TIdTelnetServer

Klienta komponents tiek izmantots, lai organizētu attālās sesijas citā datorā, tostarp konsoles sarunas un autentifikācija. Sakaru protokols uzņemas personas klātbūtni, kas interaktīvi mijiedarbojas ar serveri. Klienta komponentam nav displeja atbalsta vai termināļa emulācijas, bet tas vienkārši nodrošina savienojumu ar servera daļu. Parasti TIdTelnetServer servera protokolu izmanto, lai organizētu attālās datu bāzes ar teksta saskarni interaktīvai mijiedarbībai ar klientiem.

TIdTime un TIdTimeServer

Klienta komponents ir alternatīva TIdSNTP komponentam laika noteikšanai. Ir svarīgi atzīmēt, ka abu protokolu formāti ir atšķirīgi. TIdTime ir balstīts uz RFC 868 formātu (atgriež laiku iekšējā UNIX OS standartā, veicot visas nepieciešamās konversijas). Servera komponenta darbība ir līdzīga DayTime serverim. Var izmantot, lai ieviestu laika pakalpojumu lokālais dators. Papildu kods nav nepieciešams, vienkārši izveidojiet TIdTimeServer gadījumu, kas atgriezīs servera datora iekšējā pulksteņa laiku.

TIdTrivialFTP un TIdTrivialFTPServer

Šie komponenti ir nepieciešami, lai organizētu vienkāršu failu pārsūtīšanas protokolu. Šī protokola klienta komponents tiek izmantots, lai izveidotu savienojumu ar attiecīgā servera komponenta gadījumu. Protokols ir paredzēts privātiem, viegliem, lokāliem failu pārsūtīšanas gadījumiem, piemēram, lokālajos tīklos vai maršrutēšanas tabulu ielādei (augšupielādei) maršrutētājos. Šī protokola novājināto īpašību dēļ tā lietošana nav ieteicama, izmantojot autentifikācijas algoritmus vai citus drošības mehānismus. Šī protokola galvenais mērķis ir pārsūtīt failus uz aparatūras ierīci, lai to pārveidotu.

TIdTunnelMaster un TIdTunnelSlave

Servera tuneļa komponenti tiek izmantoti starpniekserveros, lai organizētu vairākus loģiskus savienojumus vienā fiziskajā (tunelī). Šīs nodarbības var izmantot dažādiem mērķiem, piemēram, lai organizētu slepenu savienojumu pa neslepeniem kanāliem.

TIdWhois un TIdWhoIsServer

Šis klienta komponents savienojas ar jebkuru standarta Whois serveri, ļaujot iegūt informāciju par domēniem. Servera komponents nodrošina NIC servera pamata funkcionalitāti.

Indija Dažādi

Indy Miscellaneous Components paletes lapa ietver BASE64, UUE, Quoted Printable un citus izplatītus e-pasta saziņas formātus, kodētājus (MD2, MD4 un MD5) kriptogrāfijas standartiem, ko izmanto paroļu glabāšanai un elektroniskie paraksti neatgriezeniskā (grūti atšifrējamā) formā, kā arī daudzas citas noderīgas sastāvdaļas un utilītas, ko bieži izmanto interneta lietojumprogrammu izstrādē.

TIdAntiFreeze

Indy komponentu bloku algoritmu dēļ bieži šķiet, ka lietojumprogramma ir iestrēgusi, kamēr savienojums darbojas. Lai novērstu sekundāro procesu (pavedienu) izmantošanu, organizējot komunikāciju, lai novērstu lietojumprogrammas iesaldēšanu, pietiek ar norādīto komponentu ievietošanu veidlapā.

Komponents darbojas, analizējot pieprasījumus no TCP/IP protokola steka un nosūtot ziņojumus lietojumprogrammai aizkaves laikā, kad ārējie savienojumi tiek bloķēti, kas rada ilūziju par koda palaišanu. Tā kā komponents ietekmē bloķētos savienojumus tikai galvenajam procesam, TIdAntiFreeze izmantošana lietojumprogrammas sekundārajos procesos nav nepieciešama. Ņemiet vērā, ka TIdAntiFreeze komponents palēnina savienojumus, jo galvenais process tiek periodiski pārtraukts, lai apstrādātu ziņojumus. No tā izriet, ka ir jārūpējas par to, lai izstrādātā lietojumprogramma netērētu pārāk daudz laika ziņojumu apstrādei, tostarp OnClick, OnPaint, OnResize utt. Zināmā mērā to var kontrolēt, izmantojot TIdAntiFreeze klases rekvizītus. Šī komponenta izmantošana nav obligāta, taču tā ļauj atrisināt savienojumu sinhronizācijas problēmu ar lietojumprogrammas vizuālo saskarni.

TIdDateTimeStamp

Klase datuma un laika matemātikas veikšanai saistībā ar to, ka interneta protokoli izmanto dažādus datuma un laika formātus; turklāt klienti un serveri var atrasties dažādās laika zonās.

TIdIPWatch

Tas ir uz taimeri balstīts komponents, kas pastāvīgi uzrauga datora IP adreses izmaiņas. Komponentu notikumi notiek, kad tiek konstatētas izmaiņas. Šo komponentu parasti izmanto, lai noteiktu, vai dators ir savienots ar internetu vai kādu citu tīklu. IP adreses izmaiņas šajā situācijā var rasties tāpēc, ka IP adresi piešķir DHCP (Dynamic Host Configuration Protocol) serveris, veidojot savienojumu ar jauno tīklu.

TIdLogDebug

Šī komponenta mērķis ir pārtvert jebkura klienta vai servera komponenta notikumus un ievietot notikuma ierakstu norādītais fails. Šis komponents ir ļoti noderīgs Indy komponentu atkļūdošanai.

TIdMessage

Komponents tiek izmantots kopā ar citiem komponentiem, lai pareizi atšifrētu vai kodētu ziņojumus. Tie var būt POP, SMTP un NNTP komponenti. Klase atbalsta MIME šifrēšanu un atšifrēšanu, vairāku baitu rakstzīmes un ISO kodējumu.

TIdNetworkCalculator

Viens no nedaudzajiem Indy komponentiem, ko var izmantot, veidojot lietojumprogrammas. Tīkla kalkulatoru var izmantot, lai veiktu aprēķinus par IP adresēm, ieskaitot tīkla maskas, apakštīklu, tīkla klases utt.

TIdThreadMgrDefault

Komponents nodrošina sekundāro procesu kontroli pēc noklusējuma. Izveidots, ja nevienam Indy komponentam, kas atbalsta procesu pārvaldību, nav definēts TIdThreadManager klases gadījums. Komponents nodrošina tikai pamata iespējas sekundāro procesu pārvaldīšanai: to izveidošanai un iznīcināšanai pēc pieprasījuma.

TIdThreadMgrPool

Uzlabotāks procesu pārvaldības komponents nekā TIdThreadMgrDefault, jo tas apvieno procesus, nevis izveido vai iznīcina tos pēc pieprasījuma.

TIdVCard

VCard ir elektronisks vizītkartes ekvivalents, un tajā var būt ietverta īpašnieka personiskā informācija un grafiskie dati.

TIdIMFDekodētājs

Paredzēts interneta ziņojumu dekodēšanai. Tas ir TIdCoder klases pēctecis, tāpat kā visi citi kodētāja komponenti. TIdCoder klase dekodē saskaņā ar ARPA interneta īsziņu formāta standartu RFS-822, kas tika ierosināts 1982. gada augustā, un USENET ziņojumapmaiņas standartu RFC 1036, kas tika ierosināts 1987. gada decembrī.

Komponents paplašina TIdCoder klasi, lai ļautu noteikt RFS-822 formātu pēc galvenes konteksta, nodrošinot atšifrēšanas saņemšanas režīmu un MIME šifrēšanu un atšifrēšanu. Komponents TIdIMFDecoder tiek izmantots TIdMessageClient klasē, lai atšifrētu saņemtos un nosūtītos ziņojumus.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder ļauj atšifrēt tekstu norādītajā formātā. Var kalpot kā atsevišķs komponents ar noteiktu kodēšanas veidu, kas ļauj pārsūtīt ziņojumus, kas satur jaunu kodējuma veidu.

TIdBase64Encoder

Ievieš citu šifrēšanas algoritmu, kas ļauj pārsūtīt nedrukājamas rakstzīmes.

TIdUUEncoder

Ievieš vienu no pirmajiem šifrēšanas algoritmiem, UU kodējumu. Dažreiz izmanto, sūtot rakstus ziņu dienestam.

TIdXXEncoder

Šī šifrēšanas metode, visticamāk, netiks izmantota. Būtībā tas ir tas pats UU kodējums, bet ar citu šifrēšanas tabulu.

TIdCoderMD2

Komponenti ar dažāda veida MD (Message Digest) šifrēšanas algoritmu. Tie visi ir balstīti uz jaukšanu, vienvirziena, un tiem nav atšifrēšanas algoritmu.

Protokola klientu un serveru komponentus var izmantot, lai izstrādātu serveru un klientu interneta lietojumprogrammas kopā ar pamata (ClientSocket, ServerSocket) un citiem komponentiem no interneta un Fastnet paletes vai to vietā. Indy komponenti neizmanto WebBroker arhitektūru, ieviešot zema līmeņa atbalstu interneta protokoliem un pakalpojumiem tieši to pirmkodā ( pirmkodi ir pievienoti).

TIdConnectionInterceptOpenSSL un TIdServerInterceptOpenSSL

SSL protokolam – Secure Sockets Layer, kas nodrošina divu aplikāciju saziņas slepenību un uzticamību, ir divi slāņi. Daudzslāņu transporta protokola (piemēram, TCP) zemā līmenī SSL ir ierakstīšanas protokols un tiek izmantots dažādu augstāka līmeņa protokolu iekapsulēšanai. SSL priekšrocība ir tā, ka tas ir neatkarīgs lietojumprogrammu protokols, bet augstāka līmeņa protokolu var izmantot papildus SSL.

SSL nodrošina sakaru drošību, kurai ir trīs galvenās funkcijas: konfidenciāla savienojuma nodrošināšana; šifrēšana ar publiskā atslēga(izmanto, lai apstiprinātu adresāta autentiskumu); atbalsts datu pārraides uzticamībai.

  • Simetrisko kriptogrāfiju izmanto datu šifrēšanai (piemēram, DES, RC4 utt.).
  • Digitālais paraksts tiek nodrošināts, izmantojot asimetrisko publiskās atslēgas šifrēšanu (piemēram, RSA, DSS utt.).
  • Komunikācijas uzticamība, ziņojumu transportēšana ietver ziņojuma integritātes pārbaudi, izmantojot MAC korekcijas kodus, drošas jaucējfunkcijas (piemēram, SHA, MD5 utt.), izmantojot MAC aprēķinus.

Kombinācijā ar HTTP un servera autentifikāciju SSL nodrošina nepieciešamās šifrēšanas funkcijas un tālāk uztur izveidoto savienojumu, pārbaudot Web servera identitāti utt. Ir svarīgi saprast, ka SSL aizsargā sakarus tikai datu pārsūtīšanas laikā un neaizstāj citus drošības mehānismus.

Komponenti TIdConnectionInterceptOpenSSL un TIdServerInterceptOpenSSL nodrošina gan klienta, gan servera puses savienojumus, izmantojot SSL protokolu. Jāatzīmē, ka TIdConnectionInterceptOpenSSL un TIdServerInterceptOpenSSL komponenti ir pieejami tikai Delphi 6, bet ne Kylix. Tas ir saistīts ar protokola sarežģītību, kas Windows ieviešanas gadījumā ir balstīts uz operētājsistēmas funkcijām.

Indy komponentu izmantošanas piemērus var atrast direktorijās /Delphi6/Demos/Indy. Kopumā Indy bibliotēka 8.0 versijā satur 69 komponentus. Tiek norādīts, ka 9.0 versijā norādītajā bibliotēkā būs 86 komponenti. Visi komponenti ir vienoti un iekļauti gan Delphi 6, gan Kylix, kas ļauj tos izmantot starpplatformu lietojumprogrammu izstrādei. Visi Indy komponenti atbalsta daudzpavedienu.

Indy komponenti ievieš gandrīz visu interneta un Fastnet komponentos atrodamo funkcionalitāti, kā tas ir skaidri parādīts tabulā.

Fastn un sastāvdaļas Indy sastāvdaļas Komponentu mērķis
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Mijiedarbība starp diviem datoriem (klientu un serveri), izmantojot TCP/IP protokolu
2 TNMDayTime TIdDayTime, TIdDayTimeServer Vaicājiet serverī pašreizējo laiku
3 TNMEcho TIdEcho, TIdEchoServer Izmanto, lai sazinātos ar atbildes serveri
4 TNMFinger TIdFinger, TIdFingerServer Izmanto, lai iegūtu informāciju par lietotāju no interneta meklēšanas servera
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Nodrošiniet failu pārsūtīšanu, izmantojot FTP protokolu
6 TNMHTTP TIdHTTP, TIdHTTPserveris Datu apmaiņai izmantojiet HTTP protokolu
7 TNMMsgServ, TNMMsg Izmanto, lai nodotu vienkāršu isziņas no klienta uz serveri
8 TNMNNTP TIdNNTP, TIdNNTPServeris Atbalsta datu apmaiņu ar ziņu serveri
9 TNMPOP3 TIdPOP3 Izmanto, lai saņemtu e-pastu no pasta servera, izmantojot POP3 protokolu
10 TNMSMTP TIdSMTP Izmanto, lai nosūtītu e-pastu, izmantojot pasta serveris Internets
11 TNMStrm, TNMStrmServ Pārsūta bināros datus, kas ierakstīti straumē, izmantojot TCP/IP protokolu
12 TNMUDP TIdUDP, TIdUDPServeris Pārsūtiet datus, izmantojot UDP protokolu
13 TpowerSock, TNMGeneralServer Komponentos iekapsulētas klases, kas ir pamats savu klientu (Powersock) un serveru (NMGeneralServer) rakstīšanai.
14 TNMUUPprocesors TIdUUEncoder, TIdUUDecoder Veiciet pārkodēšanu binārie faili MIME vai UUENCODE formātā
15 TNMURL Pārvērš virknes HTML formātā un veic apgriezto konvertēšanu

Izņēmums ir tādas klases kā TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL, kurās tiek ieviesti novecojuši protokoli vai arī ir ieviesta funkcionalitāte lielā alternatīvu klašu grupā.

Tomēr atšķirībā no saviem priekšgājējiem – interneta un Fastnet komponentiem, Indy satur bagātīgākus servera komponentus un komponentus datu pārkodēšanai un šifrēšanai, kā arī autentifikācijas atbalstu (Indy Misc palete). Kā redzams iepriekš tabulā, galvenos protokolus un pakalpojumus nodrošina ne tikai klients, bet arī servera komponenti. Tie ir laika pakalpojumi, atbildes pakalpojumi, lietotāja informācijas iegūšana, kā arī HTTP, NNTP, UDP protokoli un pat vienkāršākā FTP versija.

Daži Indy komponentu izmantošanas piemēri

Delphi ietvertajos Indy komponentos IP adrese ir definēta rekvizītā Host, parasti tikai klienta lietojumprogrammās. Servera mitinātajiem komponentiem ir metodes, kas ļauj sākt vai pārtraukt atbilstošā porta aptauju - piemēram, mainot komponenta IdTCPServer rekvizītu Active, tiek sākta vai pārtraukta atbilstošā porta aptauja. Kad ir izveidots savienojums starp klientu un serveri, var sākties datu pārsūtīšana.

Indy komponenti, strādājot ar datiem, liek lielu uzsvaru uz drošību un uzticamību. Piemēram, komponentam IdTCPClient ir savienojuma un atvienošanas metodes. Izmantojot programmēšanas paņēmienu, piemēram, tālāk norādīto kodu no klienta puses:

ar TCPClient sāciet Connect; izmēģiniet lstMain.Items.Add(ReadLn); beidzot atvienot; beigas; beigas;

un izmantojot rekvizītu Connection, kas no servera puses tiek nodots kā parametrs TIdPeerThread klases AThread instancei:

ar AThread.Connection do sākas WriteLn ("Sveiki no Basic Indy Server servera."); Atvienot; beigas;

Jūs varat paļauties uz parastu savienojuma izpildi vai pareizu kļūdu apstrādi.

Ievērojiet atbilstošo klašu metodes ReadLn un WriteLn - tās atgādina standarta Pascal I/O paziņojumus. Šis ir veltījums UNIX programmēšanas tehnikai, kur lielākā daļa sistēmas darbību tiek veiktas, lasot un ierakstot atbilstošos failus.

Tāpat kā Fastnet komponenti, Indy komponentu klasēs ir notikumi, kurus var izmantot, lai nodrošinātu notikumu pārvaldību. Piemēram, izveidojot savienojumu ar klientu, varat noorganizēt, lai veidlapā tiktu parādīts ziņojums:

procedūra TForm1.IdECHOServer1Connect(ATpavediens: TIdPeerThread); begin lblStatus.caption:= "[ Klienta apkalpošana ]"; beigas;

Indy nodrošina komponentus, kas ievieš protokolus ar klienta un servera daļām, kas ir unikālas šai bibliotēkai. TIdGopherServer un TIdGopher komponenti, pateicoties GetExtendedMenu, GetFile, GetMenu, GetTextFile metodēm klienta pusē un ReturnGopherItem, SendDirectoryEntry servera pusē, palīdz skatīt failus. dažādi veidi, ieskaitot tos, kas atzīmēti kā slēpti, kā arī direktorijus attālais dators(līdzīgi kā komanda dir *.* to dara MS-DOS operētājsistēmā).

Izmantojot IdSMTP un IdMessage komponentus, varat viegli izveidot savu tīmekļa lietojumprogrammu, kas var nosūtīt pastu, izmantojot SMTP protokolu.

Šajā gadījumā IdMessage klase (viena no 23 Indy Misc lapas komponentiem) ir atbildīga par ziņojuma ģenerēšanu, kas izriet no tās nosaukuma, un IdSMTP ir par savienojuma organizēšanu ar pasta serveri.

Indy izmantotā tehnoloģija izmanto bloķēšanas lasīšanas un rakstīšanas darbības. Jebkura savienojuma darbība, kas tiek izmantota programmā Indy, gaida savienojuma pabeigšanu. Strādājot ar Indy klienta komponentiem, parasti ir jāveic šādas darbības:

  • pieprasīt savienojumu ar serveri;
  • veikt lasīšanas un rakstīšanas pieprasījumus serverim (atkarībā no servera veida, darbība tiek veikta vienu reizi vai vairākas reizes);
  • pārtrauciet savienojumu ar serveri un pārtrauciet savienojumu.

Indy komponenti ir izstrādāti, lai nodrošinātu īpaši augstu abstrakcijas līmeni. TCP/IP steka sarežģītības un detaļas ir paslēptas no programmētāja, lai viņš varētu koncentrēties uz veicamo uzdevumu.

Šajā nelielajā piemērā ir parādīta tipiska klienta pupiņu sesija:

ar IndyClient sāciet Host:= "zip.pbe.com"; // Saimniekdators uz kuru izsaukt Ports:= 6000; // Ports, lai izsauktu serveri Connect; try // Jūsu kods nonāk šeit beidzot Atvienot; beigas; beigas;

Piemērā, pat ja savienojums ar serveri nav izveidots, savienojums tiks graciozi pārtraukts, jo tiek izmantots paziņojums try-finally.

Indy servera komponenti apraksta dažādus serveru modeļus, kurus var izmantot atkarībā no jūsu vajadzībām un izmantotā protokola.

TIdTCPServer ir visbiežāk izmantotais servera komponents, kas izveido sekundāru procesu neatkarīgi no galvenā lietojumprogrammas procesa. Izveidotais process gaida ienākošos pieprasījumus no potenciālie klienti. Katram klientam, uz kura pieprasījumu tas atbild, tiek izveidots individuāls sekundārais process. Notikumi, kas notiek apkopes procesā, ir saistīti ar atbilstošo procesu kontekstu.

Citiem vārdiem sakot, katram klienta savienojumam TIdTCPServer klase izmanto unikālu sekundāro pavedienu, izsaucot šī pavediena OnExecute notikumu apdarinātāju. Formālais OnExecute metodes parametrs ir atsauce uz Athread klases gadījumu, kas atbilst izveidotajam pavedienam. Šīs klases rekvizīts Connection ir atsauce uz klasi TIdTCPConnection, kuras gadījums tiek izveidots, lai apstrādātu klienta pieprasījumu. TIdTCPConnection atbalsta lasīšanu un rakstīšanu savienojuma laikā, kā arī sakaru sesijas izveidi un pārtraukšanu.

UDP protokols darbojas, vispirms neizveidojot savienojumu ar serveri (katra nosūtītā pakete ir neatkarīga datu kopa, nevis daļa no lielākas sesijas vai savienojuma). Kamēr TIdTCPServer katram savienojumam izveido atsevišķus pavedienus, TIdUDPServer izmanto vai nu galveno pavedienu, vai vienu sekundāro pavedienu, kas apstrādā visus UDP protokola pieprasījumus. Kad TIdUDPServer ir aktīvs, tiek izveidots pavediens, lai noklausītos ienākošās UDP paketes. Katrai saņemtajai paketei OnUDPRead notikums tiek parādīts vai nu galvenajā pavedienā, vai klausīšanās pavediena kontekstā atkarībā no ThreadedEvent rekvizīta vērtības. Kad ThreadedEvent tiek novērtēts kā False, notikums notiek galvenajā pavedienā, pretējā gadījumā tas notiek klausīšanās pavedienā. Kamēr notikums tiek apstrādāts, citas servera darbības tiek bloķētas. Tāpēc ir svarīgi nodrošināt, lai OnUDPRead procedūras tiktu izpildītas pēc iespējas ātrāk.

Ja jums ir jāizveido jauna klienta lietojumprogramma esošam serverim, izmantojot esošu protokolu, jūsu uzdevums ir tikai izstrādāt un atkļūdot klienta lietojumprogrammu. Taču, kad jāattīsta gan klienta, gan servera lietojumprogramma Neatkarīgi no tā, vai tiek izmantots esošs vai jauns protokols, mēs saskaramies ar klasisko “vistas un olas” problēmu. Kur sākt programmēšanu - no klienta vai no servera?

Acīmredzot galu galā ir jāizveido gan klients, gan serveris. Daudzām lietojumprogrammām, īpaši tām, kas izmanto teksta protokolu (piemēram, HTTP), ir vieglāk sākt lietojumprogrammas veidošanu, izstrādājot serveri. Un atkļūdošanai ir ērts klients, kas jau pastāv. Šī ir Telnet konsoles lietojumprogramma, kas ir pieejama gan operētājsistēmā Windows, gan UNIX.

Ja ierakstāt konsoli telnet komanda 127.0.0.1 80 ar lokālā datora IP adresi un porta numuru 80, ko pēc noklusējuma izmanto tīmekļa serveri, tad lietojumprogramma atbildēs ar tekstu, kas parādīts attēlā. 6, operētājsistēmas Windows 2000 un IIS 5.0 gadījumā.

Lai izveidotu vienkāršāko serveri, izmantojot Indy komponentus, jums ir nepieciešams:

Ja nepieciešams izveidot serveri, kas ne tikai pareizi informēs savus klientus par savienojuma zudumu, bet arī sniegs viņiem informāciju par notikušajām kļūdu situācijām, izmantojiet try-except priekšrakstu, nevis try-finally - piemēram, kā parādīts šādā piemērā:

procedūra TDataModule1.IdTCPServer1Execute(ATpavediens: IdPeerThread); var s: String; sāciet ar AThread.Connection do try try s:= ReadLn; // Izpildiet servera uzdevumu šeit // ja nav izvirzīts neviens izņēmums, // izrakstiet servera atbildi WriteLn(s); izņemot e: Exception do begin WriteLn(e.Message); end; //on end; //mēģiniet, izņemot beidzot Atvienot; beigas; beigas;

Šis nelielais piemērs parāda vienkārša teksta servera izveides darbības, kā arī to, kā to atkļūdot.

Iepriekš aprakstītais serveris ir tipisks mūsdienu izplatītās skaitļošanas organizācijas piemērs.

Daudzlīmeņu lietojumprogrammu izveides iezīmes

Pēdējā laikā klientu pieprasījumu apmierināšanai arvien vairāk tiek izmantoti vairāki serveri. Šāda veida serveris, saņēmis klienta pieprasījumu un daļēji sagatavojis to tālākai apstrādei, sazinās ar citu serveri un nosūta tam pārveidoto pieprasījumu vai pieprasījumus. Otrā līmeņa serveris savukārt var sazināties ar citiem serveriem. Tādējādi mēs varam runāt par vairāku līmeņu servera arhitektūru.

Tālāk mēs izveidosim datu piekļuves serveri, kura mērķis ir atgriezt datus no datu bāzes. Tomēr šis serveris tieši nelasa un neieraksta datu bāzes failus. Tā vietā tas sazinās ar datu bāzes serveri, meklējot klientam nepieciešamos datus.

Tātad, mēs sākam izstrādāt lietojumprogrammu ar trīs līmeņu arhitektūru. Lai izveidotu datu bāzes serveri, izmantojot Indy komponentus, jums ir nepieciešams:

  1. Izveidojiet jaunu projektu.
  2. Ievietojiet TIdTCPServer komponenta gadījumu no Indy Servers paletes uz projekta galvenās formas.
  3. Iestatiet TIdTCPServer1 klases instances rekvizītu DefaultPort uz 6001 (ieteicams piešķirt lielas vērtības, lai izvairītos no portu numuru dublēšanās dažādās lietojumprogrammās), un rekvizītu Active iestatiet uz True.
  4. Pievienojiet projektam jaunu moduli, atlasot Fails | Jauns | Datu modulis un ievietojiet tajā komponentu SQLConnection un SQLDataSet gadījumus no cilnes dbExpress komponentu paletes.
  5. Iestatiet klases SQLConnection rekvizītu ConnectionName uz IBLocal un LoginPrompt uz False. Ja neesat konfigurējis IBLocal darbinieku.gdb datu bāzē, vispirms pabeidziet šo procedūru.
  6. Iestatiet klases SQLDataSet rekvizītu SQLConnection uz SQLConnection1 un piešķiriet rekvizītu CommandText SQL priekšraksts: atlasiet CUSTOMER, CONTACT_FIRST, CONTACT_LAST no CUSTOMER, kur CUST_NO = :cust.

Sergejs Dosjukovs Maiks Fems

Šajā rakstā ir parādīts, kā izveidot atsevišķu tīmekļa pakalpojumu, izmantojot Indy komplektu un Delphi 7, un kā izmantot Indy komplektu, lai atbalstītu Delphi 7 SOAP balstītus tīmekļa pakalpojumus. Aiz muguras Papildus informācija Lai iegūtu informāciju par tīmekļa pakalpojumu izveidi, skatiet Nika Hodžesa lielisko rakstu Borland kopienas vietnē: Shakespeare on the Web.

Agrāk vai vēlāk, iespējams, būs jāizveido serveris, kas ir atsevišķs HTTP serveris un atbalsta tīmekļa pakalpojumus. Piemēram, iespējams, vēlēsities izveidot uz SOAP balstītu lietojumprogrammu serveri n-līmeņa lietojumprogrammai, kas izveidota, izmantojot Delphi.

Ievads

Delphi tiešsaistes palīdzība nodrošina lielisku secīga instrukcija par to, kā izveidot Web servisu, MIDAS serveri (COM, DCOM modelis), bet praktiski nav informācijas par patstāvīgas n-līmeņa MIDAS aplikācijas izveidi uz SOAP protokola bāzes.

Iepriekš publicējis Dave Nottage. Šajā rakstā tika aprakstīta ideja par to, kā izveidot tīmekļa pakalpojumu Delphi 6 ar SOAP atbalstu un iespēju publicēt datu moduļa SOAP saskarnes, tas ir, šis raksts ļāva jums uzzināt, kā izveidot savu n-līmeņu MIDAS sistēmas.

Borland Delphi 7 un jaunajam Indy komplektam ir iebūvēts atbalsts šai funkcionalitātei.

Tomēr, neskatoties uz iebūvēto atbalstu, šī funkcija nav dokumentēta.

Nesenie ieraksti Borland tīkla konferencē un meklēšana tīmeklī, izmantojot Google serveri, ļāva autoriem izstrādāt veidu, kā pārveidot esošo kodu no Delphi 6 uz Delphi 7. Bet visam ir savs laiks.

galvenā doma

Šis raksts ir trīsdaļīgas sērijas pirmā daļa. Tajā ir aprakstīti galvenie noteikumi. Otrā un trešā daļa būs veltīta dažām problēmām un to risināšanas veidiem. Sāksim aprakstīt galveno ideju.

  • būt atsevišķam HTTP serverim;
  • izmantot Indy kā platformu;
  • atbalstīt publicēšanu, izmantojot SOAP protokolu;
  • jāspēj publicēt SOAP DataModules, kas ļautu jums izveidot savu n-līmeņa serveri, pamatojoties uz SOAP/HTML.

HTTP serveris un SOAP

Daudzi cilvēki zina Indy un jau iepriekš ir izmantojuši THTTPServer komponentus. Šo komponentu ir viegli ievietot pieteikuma veidlapā, bet kā panākt, lai tas atbalstītu SOAP? Direktorijā "C:Program FilesBorlandDelphi7SourceIndy" varat atrast failu IdHTTPWebBrokerBridge.pas. Tas ir tieši tas, kas jums nepieciešams.

Šis fails nav daļa no Indy izpildāmā faila, tāpēc jums tas ir jāiekļauj pašreizējā projektā kā standarta projekta fails. (Lai apkopotu projektu, jums būs nepieciešams arī fails IdCompilerDefines.inc.) Šie faili ir jāpārkopē pašreizējā projekta direktorijā. Lai palielinātu ātrumu, var būt nepieciešamas koda izmaiņas, tāpēc vislabāk ir glabāt šos failus atsevišķi no Indy izplatīšanas.

Tālāk ir aprakstīta THTTPServer rezerves komponenta ieviešana, kas paplašināta, lai atbalstītu SOAP paketes, ko sauc par TIdHTTPWebBrokerBridge. Šī konstrukcija ir klase, kas tiek mantota no TCustomHTTPServer un atbalsta pamata pieprasījumu saistīšanu.

Tā kā šī klase nav pieejama no paletes, izpildot kodu, tā būs jādefinē kā parasts objekts.

Šo objektu var izmantot tieši tāpat kā parasto THTTPServeri, izņemot tos papildu rekvizītus, kas nodrošina darbību ar SOAP.
Tomēr vispirms apskatīsim nepieciešamā koda sagatavošanu.

WebBroker un Indy

Tiem, kuri jau iepriekš ir izveidojuši tīmekļa pakalpojumus, jūs zināt, ka izmantojat Web Broker. Delphi 7, tāpat kā Delphi 6, izmanto WebBroker arhitektūru, lai atbalstītu SOAP.

Tāpēc jums ir jāizveido modulis TWebModule un ievietojiet tajā šādus trīs komponentus: THTTPSoapDispatcher, THTTPSoapPascalInvoker un TWSDLHTMLPublish. Tie visi ir pieejami komponentu paletes cilnē WebServices. Pēc SOAPDispatcher saistīšanas ar SOAPPascalInvoker pieteikuma veidlapa ir gatava. Gala rezultātam vajadzētu būt apmēram tādam, kāds parādīts nākamajā attēlā:

(modulis uWebModule.pas)

Vislabāk ir atstāt visu kā ir, jo šai veidlapai nav jāmaina vai jāizpilda nekāds pielāgots kods.

WebModule un Indy

Pāriesim pie otras koda daļas, kas nepieciešama HTTP servera ieviešanai.

Kā redzat, TIdHTTPWebBrokerBridge ir metode RegisterWebModuleClass, kas ļauj reģistrēt savu WebModule un padarīt to pieejamu serverim.

Tādējādi pēc fServer servera objekta izveidošanas jums vienkārši jāizsauc klase fServer.RegisterWebModuleClass (TwmSOAPIndy).

Piezīme. Parastā TIdHTTPWebBrokerBridge ieviešanā TwmSOAPIndy objekts tiks izveidots katru reizi, kad tiek saņemts pieprasījums. Acīmredzot tas nav nepieciešams. Tāpēc klasi var modificēt, lai nodrošinātu pastāvīgu izveidi šī objekta tik ilgi, kamēr pastāv servera objekts. Lai iegūtu papildinformāciju, ieteicams skatīt klases ieviešanas dokumentāciju.

Vai serveris ir gatavs?

Ievads Indijā

Ievads Indijā
Iesūtījis Čads Z. Hauers
Mājas lapa: http://www.atozedsoftware.com
Tulkojums: Anatolijs Podgoretskis
ievads
Es uzrakstīju šo rakstu, kad pašreizējā versija bija Indy 8.0. Liela daļa šī raksta ir piemērojama un ļoti noderīga turpmākajās Indy versijās. Ja jums patika šis raksts un vēlaties lasīt padziļinātus rakstus, iepazīstieties ar grāmatu Indy in Depth.
Indy darbojas bloķēšanas režīmā
Indy izmanto bloķēšanas ligzdas. Bloķēšanas režīms ir līdzīgs faila lasīšanas un rakstīšanas režīmam. Lasot vai rakstot datus, funkcija neatgriež kontroli, kamēr darbība nav pabeigta. Atšķirība no darba ar failiem ir tāda, ka zvans var aizņemt ilgāku laiku, jo pieprasītie dati vēl nepastāv, tas ir atkarīgs no tīkla vai modema darbības ātruma.
Piemēram, metode tiek vienkārši izsaukta un tiek gaidīta, līdz kontrole tiek atgriezta izsaukuma punktā. Ja izsaukums bija veiksmīgs, vadība tiks atgriezta no metodes; ja rodas kļūda, tiks izvirzīts izņēmums.
Bloķēšana nav letāla
Bloķēšanas režīma dēļ pretinieki mūs ir pārspējuši daudzas reizes, bet bloķēšanas režīms nav pie velna.
Problēma parādījās pēc Winsock pārnešanas uz Windows. Operētājsistēmā Unix problēma parasti tika atrisināta, izmantojot dakšiņu (līdzīgi vairāku pavedienu veidošanai, bet pavedienu vietā izmantojot atsevišķus procesus). Unix klientiem un dēmoniem bija jāatdala procesi, kuriem vajadzētu darboties, un jāizmanto bloķēšanas režīms. Operētājsistēmu Windows 3.x nevarēja paralēli izveidot, un tā neatbalstīja daudz pavedienu. Izmantojot bloķēšanas saskarni, lietotāja interfeiss tika iesaldēts un programmas nereaģē. Tāpēc WinSock tika pievienoti nebloķējošie režīmi, kas Windows 3.x ar tā ierobežojumiem ļauj izmantot Winsock, nebloķējot programmas galveno un vienīgo pavedienu. Tam bija nepieciešama atšķirīga programmēšana, un Microsoft un citi kaislīgi zaimoja bloķēšanas režīmus, lai slēptu Windows 3.x trūkumus.
Tad parādījās Win32, kas varēja atbalstīt vairāku pavedienu. Taču līdz tam laikam viņu smadzenes jau bija sajukušas (tas ir, izstrādātāji uzskatīja, ka kontaktligzdu bloķēšana ir velna radīts), un jau bija grūti mainīt viņu paveikto. Tāpēc bloķēšanas režīmu zaimošana turpinās.
Patiesībā Unix ir tikai bloķēšanas ligzdas. Bloķēšanas ligzdām ir arī savas priekšrocības, un tās ir daudz labākas vairāku vītņu, drošības un citiem aspektiem. Unix ir pievienoti daži paplašinājumi nebloķējošām ligzdām. Tomēr tie darbojas ļoti atšķirīgi nekā operētājsistēmā Windows. Tie ir arī nestandarta un nav īpaši izplatīti. Unix bloķēšanas ligzdas tiek izmantotas gandrīz visos gadījumos un tiks izmantotas arī turpmāk.
Bloķēšanas režīma priekšrocības·Vieglāk programmēt - Bloķēšanas režīmus ir vieglāk programmēt. Viss lietotāja kods var būt vienuviet un izpildīts dabiskā, secīgā secībā. · Vieglāk pārslēgt uz Unix — tā kā Unix izmanto bloķēšanas ligzdas, portatīvo kodu šajā gadījumā ir vieglāk rakstīt. Indy izmanto šo faktu, lai uzrakstītu vienotu kodu. ·Ir ērtāk strādāt ar pavedieniem - Tā kā bloķēšanas ligzdām ir iedzimtības iegūta secība, tāpēc tās ir ļoti viegli izmantot pavedienos.
Bloķēšanas režīma trūkumi · Lietotāja interfeiss sastingst klientiem - Bloķējošs ligzdas zvans neatgriež vadību, kamēr nav pabeidzis savu uzdevumu. Kad šāds zvans tiek veikts lietojumprogrammas galvenajā pavedienā, lietojumprogramma nevar apstrādāt lietotāja ziņojumus. Tas izraisa lietotāja interfeisa sasalšanu, logus neatsvaidzina un citus ziņojumus neapstrādā, līdz tiek atgriezta kontrole no bloķēšanas ligzdas.
TIdAntiFreeze komponents
Indy ir īpašs komponents, kas atrisina lietotāja interfeisa iesaldēšanas problēmu. Vienkārši pievienojiet vienu TIdAntiFreeze komponentu jebkurā lietojumprogrammā, un jūs varat veikt zvanu bloķēšanu, nesasaldējot lietotāja interfeisu.
TIdAntiFreeze darbojas ar iekšējo taimeri ārpus zvanu steka un izsauc Application.ProcessMessages, kad beidzas taimauts. Ārējie zvani uz Indy turpina bloķēt un tāpēc darbojas tieši tāpat kā neizmantojot komponentu TIdAntiFreeze. Izmantojot TIdAntiFreeze, jūs varat iegūt visas bloķēšanas kontaktligzdu priekšrocības bez jebkādiem trūkumiem.
Koda pavedieni (pavedieni)
Izmantojot bloķēšanas ligzdas, gandrīz vienmēr tiek izmantotas koda straumes. Nebloķējošās ligzdās var izmantot arī pavedienus, taču tas prasa dažus papildu apstrāde un to priekšrocības šajā gadījumā tiek zaudētas salīdzinājumā ar kontaktligzdu bloķēšanu.
Pavedienu priekšrocības · Prioritāšu iestatīšana - Atsevišķu pavedienu prioritātes var konfigurēt. Tas ļauj atsevišķiem uzdevumiem piešķirt vairāk vai mazāk CPU laika. · Iekapsulēšana — katrs savienojums var saturēt interfeisa līdzību ar citu savienojumu. ·Drošība – katram pavedienam var būt dažādi drošības atribūti. · Vairāki procesori — nodrošina priekšrocības sistēmās ar vairākiem procesoriem. · Nav nepieciešama serializācija - nodrošina pilnīgu vienlaicību. Neveicot daudz pavedienu, visi pieprasījumi ir jāapstrādā vienā pavedienā. Tāpēc katrs uzdevums ir jāsadala mazos gabalos, lai tas varētu darboties ātri. Kamēr viens bloks darbojas, visi pārējie ir spiesti gaidīt, kad tas beigsies. Viena bloka beigās tiek izpildīts nākamais un tā tālāk. Izmantojot daudzpavedienu, katru uzdevumu var ieprogrammēt kā vienu vienību un operētājsistēma sadala laiku starp visiem uzdevumiem.
Aptaujas pavedieni
Pavedienu izveide un iznīcināšana ir ļoti resursietilpīga. Tas ir īpaši sarežģīts uzdevums serveriem, kuriem ir īslaicīgi savienojumi. Katrs serveris izveido pavedienu, izmanto to īsu laiku un pēc tam iznīcina. Tā rezultātā pavedieni tiek izveidoti un dzēsti ļoti bieži. Piemērs tam ir tīmekļa serveris. Tiek nosūtīts viens pieprasījums un tiek atgriezta vienkārša atbilde. Lietojot pārlūkprogrammu, skatot jebkuru vietni, var rasties simtiem savienojumu un atvienošanās.
Aptaujas pavedieni var labot šo situāciju. Tā vietā, lai izveidotu un iznīcinātu pavedienus pēc pieprasījuma, pavedieni tiek atlasīti no neizmantoto, bet jau izveidoto pavedienu saraksta no pūla. Kad pavediens vairs nav vajadzīgs, tas tiek atgriezts baseinā, nevis iznīcināts. Pavedieni pūlā ir atzīmēti kā neizmantoti, un tāpēc tie nepatērē CPU laiku. Vēl lielākam uzlabojumam pavedieni var dinamiski pielāgoties pašreizējām sistēmas vajadzībām.
Indy atbalsta pavedienu aptauju. Indy pavedienu kopumam var piekļūt, izmantojot komponentu TIdThreadMgrPool.
Daudz pavedienu
Spēcīgi noslogotam serverim var būt nepieciešami simtiem vai pat tūkstošiem pavedienu. Pastāv izplatīts uzskats, ka simtiem un tūkstošiem pavedienu var iznīcināt jūsu sistēmu. Tā ir maldīga pārliecība.
Lielākajā daļā serveru pavedieni gaida datus. Gaidot bloķējošu zvanu, pavediens ir neaktīvs. Serverī ar 500 pavedieniem vienlaikus var būt aktīvi tikai 50 pavedieni.
Jūsu sistēmā strādājošo pavedienu skaits var jūs pārsteigt. Ar minimālu strādājošo serveru skaitu un norādīto darbojas lietojumprogrammas manā sistēmā ir izveidoti 333 pavedieni, pat ar 333 pavedieniem centrālais procesors ir tikai 1% noslogots. Smagi noslogots IIS serveris(Microsoft Internet Information Server) var izveidot simtiem un tūkstošiem pavedienu.
Pavedieni un globālās sadaļas
Izmantojot vairākus pavedienus, jums ir jānodrošina datu integritāte, piekļūstot tiem. Tas var būt sarežģīti programmētājiem, kuri nav strādājuši ar pavedieniem. Bet kopumā lielākajai daļai serveru nav jāizmanto globālie dati. Lielākā daļa serveru veic izolētas funkcijas. Katrs pavediens veic savu izolēto uzdevumu. Globālās lasīšanas/rakstīšanas sadaļas ir daudzu daudzpavedienu lietojumprogrammu iezīme, taču tās nav raksturīgas serveriem.
Metodoloģija Indy
Indy atšķiras no citiem Winsock komponentiem, pie kuriem esat pieradis. Ja esat strādājis ar citiem komponentiem, tad labākais risinājums aizmirsīs, kā viņi strādā. Daudzi citi komponenti izmanto nebloķējošus (asinhronus) zvanus un darbojas asinhroni. Viņiem ir jāreaģē uz notikumiem, jāizveido stāvokļa mašīna un jāizpilda biežas gaidīšanas cilpas.
Piemēram, izmantojot citus komponentus, kad izsaucat savienojumu, jums vai nu jāgaida, līdz notiek savienojuma notikums, vai jāgaida ciklā, līdz rekvizīts norāda, ka savienojums ir noticis. Izmantojot Indy, varat izsaukt savienojuma metodi un gaidīt, līdz tā atgriezīsies. Ja savienojums ir veiksmīgs, tiks atgriezta nauda vai, ja radīsies problēma, tiks piemērots izņēmums. Tāpēc darbs ar Indy ir ļoti līdzīgs darbam ar failiem. Indy ļauj ievietot visu kodu vienuviet, nevis izplatīt to dažādos pasākumos. Turklāt Indy ir ļoti vienkāršs un ērtākais, strādājot ar pavedieniem.
Cik atšķirīga ir Indy?
Īss pārskats · Tiek izmantoti bloķēšanas zvani · Nav orientēti uz notikumiem - pasākumi ir, bet tie tiek izmantoti informatīvām vajadzībām un nav īsti nepieciešami. ·Paredzēts pavedieniem – Indy ir paredzēts diegiem, taču to var izmantot arī bez diegiem. Secīgā programmēšana
Detalizēts apskats
Indy ne tikai izmanto zvanu bloķēšanu (sinhronus), bet arī darbojas šādi. Tipiska Indijas sesija izskatās šādi:
sāciet ar IndyClient
Savienot; Izmēģiniet
// Dari savas lietas šeit
beidzot atvienot; beigas;
beigas;
Ar citiem komponentiem tas izskatās šādi:
procedūra TFormMain.TestOnClick(Sender: TComponent);
sākt
sāciet ar SocketComponent
Savienot; mēģināt
kamēr nav izveidots savienojums, tas sākas
ja IsError, tad sāciet
Pārtraukt;
beigas;

OutData:= "Dati, kas jānosūta";
kamēr garums (OutData) > 0 sākas
Application.ProcessMessages;
beigas;
beidzot atvienot; beigas;
beigas;
beigas;
procedūra TFormMain.OnConnectError;
sākt
IsError:= True;
beigas;
procedūra TFormMain.OnRead;
var
i: vesels skaitlis;
sākt
i:= SocketComponent.Send(OutData);
OutData:= Copy(OutData, i + 1, MaxInt);
beigas;
Daudzi komponenti neveic ļoti labu darbu, izolējot programmētāju no steka. Daudzas sastāvdaļas tā vietā, lai izolētu lietotāju no skursteņa sarežģītības, vienkārši atstāj lietotāju tai vai nodrošina iesaiņojumu.
Indy īpašais veids
Indy no paša sākuma ir izstrādāts tā, lai tas būtu vairāku vītņu. Serveru un klientu veidošana Indijā ir līdzīga serveru un klientu veidošanai Unix. Unix lietojumprogrammas parasti izsauc steku tieši ar nelielu abstrakcijas slāni vai bez tā.
Parasti Unix serveriem ir viens vai vairāki klausīšanās procesi, kas pārrauga ienākošos klientu pieprasījumus. Katram klientam, kurš ir jāapkalpo, a jauns process. Tas padara programmēšanu vienkāršu, katrs process ir paredzēts tikai vienam klientam. Katrs process darbojas savā drošības kontekstā, ko nosaka klausīšanās process vai process, pamatojoties uz esošajām tiesībām, identitāti vai citām lietām.
Indy serveri darbojas aptuveni tādā pašā veidā. Windows, atšķirībā no Unix, nevar labi pavairot procesus, taču tas labi darbojas ar pavedieniem. Indy serveri katram klienta savienojumam izveido atsevišķu pavedienu.
Indy serveri piešķir klausīšanās pavedienu, kas ir atdalīts no programmas galvenā koda pavediena. Klausīšanās pavediens uzklausa ienākošos klientu pieprasījumus. Katram klientam, uz kuru tas reaģē, tiek izveidots jauns pavediens, kas kalpo klientam. Pēc tam attiecīgie notikumi tiek apkalpoti kontekstā no šīs straumes.
Indy klientu apskats
Indy ir izstrādāts, lai nodrošinātu ļoti augstu abstrakcijas līmeni. TCP/IP steka sarežģītība un detaļas ir paslēptas no programmētāja. Parasti tipiska klienta sesija programmā Indy izskatās šādi:
sāciet ar IndyClient
Host:= "zip.pbe.com"; // Saimnieks, kuram zvanīt
Ports:= 6000; // Ports servera izsaukšanai
Savienot; Izmēģiniet
// Dari savas lietas šeit
beidzot atvienot; beigas;
beigas;
Indy servera pārskats
Indy servera komponenti izveido klausīšanās pavedienu, kas ir izolēts no galvenā programmas koda pavediena. Klausīšanās pavediens uzklausa ienākošos klientu pieprasījumus. Katram klientam, uz kuru tas reaģē, tiek izveidots jauns pavediens, kas kalpo klientam. Atbilstošie notikumi pēc tam tiek apkalpoti šī pavediena kontekstā.

Praktiski piemēri
Šie piemēri palīdzēs jums sākt darbu ar komponentiem viegli izmantot, bet, lai demonstrētu piemērus, kas izgatavoti kā vienkāršas lietojumprogrammas. Daži projekti tiek veidoti, lai demonstrētu dažādas situācijas. Šie piemēri ir pieejami arī lejupielādei kā zip faili.
Tulkotāja piezīme: saite vietnē nedarbojas.
1. piemērs — pasta indeksa pārbaude
Pirmais projekts ir pēc iespējas vienkāršāks. Meklējot pēc pasta indeksa, klients jautā serverim, kurai pilsētai un valstij pieder norādītais pasta indekss.
Tiem, kas dzīvo ārpus ASV un nezina, kas ir pasta indekss, tas ir pasta indekss, kas norāda piegādes vietu. Pasta indeksi sastāv no 5 cipariem.
Protokols
Pirmais solis servera un klienta izveidē ir protokola izstrāde. Standarta protokoliem to nosaka atbilstošais RFC. Pasta indeksam protokols ir definēts tālāk.
Lielākā daļa sakaru protokolu darbojas teksta režīms. Apmaiņa nozīmē, ka tiek pārsūtīta komanda, kā atbilde, statuss un, iespējams, dati. Protokoli neaprobežojas tikai ar apmaiņu, bet joprojām tiek izmantots vienkāršs teksts. Arī pasta indeksa noteikšanas protokols ir balstīts uz tekstu. Vienkāršs teksts atvieglo protokolu atkļūdošanu un ļauj sazināties ar dažādām programmēšanas valodām un operētājsistēmām.
Pēc savienojuma izveides serveris nosūta sveicienu, pēc tam pieņem komandu. Šī komanda var būt "ZipCode x" (kur x ir pasta indekss) vai "Quit". Atbildot uz komandu ZipCode, atbilde tiek nosūtīta vienas rindiņas veidā ar atbildi vai tukša rinda ja kods nav atrasts. Komanda Quit liek serverim aizvērt savienojumu. Pirms komandas Quit nosūtīšanas serveris var pieņemt vairākas komandas.
Servera pirmkods

vienība ServerMain;

saskarne

lietojumiem

veids

TformMain = klase (TForm)

IdTCPServer1: TIdTCPServer;

procedūra FormCreate(Sūtītājs: TObject );

procedūra FormDestroy(Sūtītājs: TObject );

procedūra IdTCPServer1Connect(ATpavediens: TIdPeerThread) ;

Privāts

ZipCodeList: TStrings;

publiski

beigas ;

FormMain: TformMain;

īstenošana

(R*.DFM)

procedūra TformMain.IdTCPServer1Connect (ATthread: TIdPeerThread) ;

sākt

AThread.Connection .WriteLn ( "Indy Zip Code Server gatavs." );

beigas ;

SCommand: string ;

sākt

SCommand:= ReadLn ;

beigas ;

beigas ;

beigas ;

procedūra TformMain.FormCreate (Sūtītājs: TObject ) ;

sākt

ZipCodeList:= TStringList.Create ;

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

beigas ;

procedūra TformMain.FormDestroy (Sūtītājs: TObject ) ;

sākt

ZipCodeList.Bezmaksas ;

beigas ;

beigas.

Vienīgās Indy specifiskās daļas projektā ir IdTCPServer1 komponents, IdTCPServer1Connect un IdTCPServer1Execute metodes.
Veidlapā ir ietverts TIdTCPServer tipa komponents IdTCPServer1. Ir mainīti šādi rekvizīti: ·Aktīvs = True — pēc lietojumprogrammas palaišanas serveris klausās. ·DefaultPort = 6000 — porta vērtība šim projektam. Serveris klausās klienta pieprasījumus šajā portā.
Metode IdTCPServer1Execute ir saistīta ar servera OnExecute notikumu. OnExecute notikums tiek aktivizēts pēc klienta savienojuma pieņemšanas. OnExecute notikums atšķiras no citiem jums zināmiem notikumiem. OnExecute darbojas pavediena kontekstā. Pavediena notikums tiek pacelts un tiek dots metodei nodots arguments AThread. Tas ir svarīgi, jo vienlaikus var izpildīt vairākus OnExecute notikumus. Tas tiek darīts, lai serveris varētu strādāt, neradot jaunu komponentu. Ir arī metodes, kuras var ignorēt, veidojot mantiniekus.
OnConnect notikums tiek aktivizēts pēc tam, kad savienojums ir pieņemts un tam ir izveidots pavediens. Šajā serverī to izmanto, lai nosūtītu sveiciena ziņojumu klientam. Ja vēlaties, to var izdarīt arī OnExecute notikumā.
OnExecute notikumu var aktivizēt vairākas reizes, līdz savienojums tiek atvienots vai zaudēts. Tas novērš nepieciešamību pārbaudīt savienojumu, vai notikuma ietvaros nav atvienots vai nezaudēts cilpa.
IdTCPServer1Execute izmanto divas pamatfunkcijas: ReadLn un WriteLn. ReadLn nolasa virkni no savienojuma, un WriteLn nosūta virkni savienojumam.
sCommand:= ReadLn;
Iepriekš minētais kods paņem klienta virkni un ievieto to vietējā sCommand virknes mainīgajā.

ja SameText (sCommand, "QUIT"), tad sāciet

beigas cits, ja SameText (Kopēt (sCommand, 1 , 8 ), "ZipCode" ), tad sākas

WriteLn(ZipCodeList.Values[Copy(sCommand, 9, MaxInt)]);

beigas ;


Pēc tam tiek pārbaudīts, vai sCommand ir derīgas komandas.
Ja komanda ir "Iziet", tiek veikta atvienošana. Pēc atvienošanas nav atļauts lasīt vai rakstīt. Pēc notikuma beigām klausīšanās pavediens vairs to neizsauc, bet notīra pavedienu un pārtrauc savienojumu.
Ja komanda ir "ZipCode", parametrs pēc komandas tiek izvilkts un tabula tiek skenēta, lai noteiktu pilsētas un valsts klātbūtni. Pēc tam pilsēta un štats tiek nodotas klientam vai, ja nav atbilstības, tiek nodota tukša virkne.
Pēc tam metode iziet. Serveris atkārtoti paaugstinās notikumu, tiklīdz tiks saņemta jauna komanda, ļaujot klientam nosūtīt vairākas komandas.
Klienta pirmkods

vienība ClientMain;

saskarne

lietojumiem

Windows, Ziņojumi, SysUtils, Klases, Grafika, Vadīklas, Veidlapas, Dialogi,

StdCtrls, ExtCtrls, IdAntiFreezeBase,

IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

veids

TformMain = klase (TForm)

Klients: TIdTCPClient;

IdAntiFreeze1: TIdAntiFreeze;

Panelis1: TPanel;

Panelis2: TPanel;

MemoInput: TMemo;

LboxResults: TListBox;

Panelis 3: TPanel;

Poga1: TButton;

Poga2: TButton;

Label1: TLabel;

procedūra Button2Click(Sūtītājs: TObject ) ;

procedūra Button1Click(Sūtītājs: TObject ) ;

Privāts

publiski

beigas ;

FormMain: TformMain;

īstenošana

(R*.DFM)

procedūra TformMain.Button2Click (Sūtītājs: TObject ) ;

sākt

MemoInput.Clear ;

LboxResults.Clear ;

beigas ;

procedūra TformMain.Button1Click (Sūtītājs: TObject ) ;

I: vesels skaitlis ;

S: virkne ;

sākt

ButnLookup.Enabled := true ; mēģināt

LboxResults.Clear ;

ar Klientu sākt

Savienot; mēģināt

LboxResults.Items.Add(ReadLn);

i:= 0, lai memoInput.Lines .Count — 1 sākas

WriteLn("Pasta indekss" + memoInput.Lines[i]);

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

S:= ReadLn ;

ja s = "", tad sāciet

S:= "-- Šim pasta indeksam nav atrasts ieraksts.";

beigas ;

LboxResults.Items.Add(s);

LboxResults.Items.Add("");

beigas ;

WriteLn("Iziet");

beidzot atvienot; beigas ;

beigas ;

beidzot butnLookup.Enabled := true ; beigas ;

beigas ;

beigas.


Vienīgās klienta komponentam raksturīgās daļas ir metode Button1Click.
Klienta komponents ir TIdTCPClient tipa un atrodas veidlapā. Ir mainīti šādi rekvizīti: · Host = 127.0.0.1 — serveris atrodas tajā pašā datorā, kur klients. ·Ports = 6000 — servera ports
Metode Button1Click ir saistīta ar komponenta Button1 notikumu OnClick. Noklikšķinot uz pogas, šī metode tiek izsaukta. Šīs metodes Indy daļu var reducēt uz sekojošo: 1.Savienojieties ar serveri (Connect;) 1.Izlasiet sveicienu no servera. 1. Katrai rindiņai, ko lietotājs ievadījis TMemo: 1. Pieprasījuma nosūtīšana serverim (WriteLn("ZipCode " + memoInput.Lines[i]);) 1. Atbildes nolasīšana no servera (s:= ReadLn; ) 1. Komandas Quit nosūtīšana (WriteLn("Quit");) 1. Atvienot (Atvienot;)
Testēšana
Šis piemērs ir pārbaudīts un darbojas ar instalētu TCP/IP. Varat to mainīt, lai strādātu tīklā no viena datora uz citu. Startējot serveri citā datorā un mainot servera nosaukumu vai IP klientā.
Lai pārbaudītu projektus, kompilējiet un palaidiet serveri. Pēc tam kompilējiet un palaidiet klientu. Ievadiet savu pasta indeksu piezīmes laukā un nospiediet uzmeklēšanas taustiņu.
Atkļūdošana
Teksta protokolus ir ļoti viegli atkļūdot, jo tos var pārbaudīt, izmantojot Telnet. Lai to izdarītu, pietiek zināt servera portu. Pasta indeksa uzmeklēšanas serveris klausās 6000. portā.
Palaidiet pasta indeksa uzmeklēšanas serveri vēlreiz. Pēc tam atveriet konsoli (piemēram, Dos logu). Tagad ievadiet:
Telnet 127.0.0.1 6000
Tagad esat izveidojis savienojumu ar serveri. Daži serveri nosūta arī sveiciena ziņojumu. Dažiem nav. Jūs neredzēsit ievadītās rindas. Lielākā daļa serveru neatsaucas, lai ietaupītu trafiku. Tomēr jūs varat mainīt Telnet iestatījumus, iestatot opciju "Echo On". Dažādos Telnet klientiem tas tiek darīts atšķirīgi, un dažiem šīs funkcijas nav vispār. Tagad ievadiet:
pasta indekss 37642
Jūs redzēsit servera atbildi:
BAZNĪCAS KALNS, TN
Lai atvienotos no servera, ievadiet:
atmest
2. piemērs – piekļuve datubāzei
Šajā piemērā ir emulēts serveris, kuram jāveic bloķēšanas uzdevumi, kas nav ligzdas izsaukumi. Daudzi serveri ir spiesti strādāt šādos apstākļos. Serveri, kuriem ir jāpiekļūst datu bāzei, jāizsauc ārējās procedūras vai aprēķini, bieži vien nevar pārtraukt šos zvanus, jo tie ir ārēji zvani vai to sarežģītības dēļ. Piekļuvi datu bāzei nevar sadalīt mazos gabalos, un izstrādātājam ir jāgaida, līdz beigsies darbība ar datu bāzi. Šī funkcija ir ne tikai datu bāzes izsaukumiem, bet arī citām darbībām, piemēram, saspiešanai, aprēķiniem un citai tāda paša veida apstrādei.
Demonstrācijas nolūkos iedomāsimies, ka serveris veic datu bāzes izsaukumu, kura pabeigšanai nepieciešamas 5 sekundes. Lai vienkāršotu, darīsim to vienkārši ar pauzi, šim nolūkam izmantojiet funkciju Sleep(5000), nevis faktiski zvanīsim.
Šis piemērs arī prasa mazāk detalizētu informāciju nekā iepriekšējais piemērs, jo daudzi jēdzieni vēl nav izprasti.
Avots

vienības galvenais;

saskarne

lietojumiem

Windows, Ziņojumi, SysUtils, Klases, Grafika, Vadīklas, Veidlapas, Dialogi,

IdBaseComponent, IdComponent, IdTCPServer;

veids

TformMain = klase (TForm)

IdTCPServer1: TIdTCPServer;

procedūra IdTCPServer1Execute(ATpavediens: TIdPeerThread) ;

Privāts

publiski

beigas ;

FormMain: TformMain;

īstenošana

(R*.DFM)

procedūra TformMain.IdTCPServer1Execute (ATthread: TIdPeerThread) ;

I: vesels skaitlis ;

sākt

ar AThread.Savienojums sākas

WriteLn("Sveiki. DB serveris gatavs.") ;

I:= StrToIntDef(ReadLn, 0);

// Miega režīms tiek aizstāts ar ilgu DB vai citu zvanu

Miegs (5000);

WriteLn(IntToStr(i * 7));

beigas ;

beigas ;

beigas.

Tā kā notikums Execute notiek pavediena kontekstā, apstrādes kods var būt jebkura garuma. Katram klientam ir savs pavediens un tas nebloķē citus klientus.
Testēšana
Lai pārbaudītu DB serveri, kompilējiet un palaidiet to. Izveidojiet savienojumu ar to, izmantojot Telnet ar portu 6001. Serveris atbildēs ar sveiciena ziņojumu. Ievadiet numuru. Serveris "apstrādās" jūsu pieprasījumu un atbildēs 5 sekunžu laikā.

UDP protokols ir diezgan labs īsziņu pārsūtīšanai, tas ir, jūs varat organizēt vietējās tērzēšanas un tamlīdzīgi. Nolēmu sniegt piemēru visvienkāršākajam darbam ar UDP Delfos.

Soli pa solim instrukcija:

Es minēju piemēru, bet piedodiet, es nepierakstīju katru rindiņu, jo... Es neredzu neko sarežģītu, un ikviens to var izdomāt.

Patiesībā, ja kaut kas nav skaidrs, varat man uzdot jautājumu. Un šeit ir īstais kods:

lietojumiem
Windows, ziņojumi, SysUtils, varianti, klases, grafika, vadīklas, veidlapas,
Dialogi, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

veids
TForm1 = klase (TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Poga1: TButton;
Label1: TLabel;
procedūra FormCreate(Sūtītājs: TObject);
procedūra FormClose(Sender: TObject; var Darbība: TCloseAction);
procedūra Button1Click(Sūtītājs: TObject);
procedura IdUDPServer1UDPRead(ATpavediens: TIdUDPListenerPavediens; AData: TBaiti;
Abinding: TIdSocketHandle);
Privāts
(Privātas deklarācijas)
publiski
(Publiskās deklarācijas)
beigas;

var
Form1: TForm1;

($R *.dfm)
[b]//Ziņojuma nosūtīšanas procedūra
procedūra TForm1.Button1Click(Sender: TObject);
sākt
mēģināt
IdUDPClient1.Active:= True;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
ja IdUDPClient1.Connected tad
sākt
IdUDPClient1.Send(TimeToStr(Laiks));
Label1.Caption:= "ok";
beigas;
IdUDPClient1.Active:= False;
Pīkst;Pīkst;Pīkst;
izņemot
MessageDlg("Kaut kas nogāja greizi =(", mtError, , 0);
beigas;
beigas;
[b]
//Ieslēgts Izslēgts. UDP serveris, startējot un aizverot formu
procedūra TForm1.FormClose(Sender: TObject; var Darbība: TCloseAction);
sākt
IdUDPServer1.Active:= False;
beigas;

procedūra TForm1.FormCreate(Sender: TObject);
sākt
IdUDPServer1.Active:= True;
beigas;

[b]//Servera reakcijas procedūra, saņemot datus
procedūra TForm1.IdUDPServer1UDPRead(ATpavediens: TIdUDPListenerPavediens;
ADati: TBaiti; Abinding: TIdSocketHandle);
Var
i:Integer;
s:String;
sākt
s:= "";
mēģināt
i:= 0;
kamēr (AData[i] 0) dara
sākt
s:= s + chr(AData[i]);
i:= i + 1;
beigas;
beidzot
Label1.Caption:= s;
beigas;
beigas;