Indy komponente koje se koriste u Delphiju. Primjer rada sa Indy UDP komponentama (server, klijent) u Delphiju

Ukratko, Indy je komponenta za praktičan rad sa popularnim internet protokolima. Princip njihovog rada temelji se na korištenju utičnica u načinu blokiranja. Indy je zanimljiv i zgodan jer je prilično apstraktan. A programiranje u Indyju se svodi na linearno programiranje. Inače, na internetu je široko rasprostranjen prevedeni članak u kojem se nalaze riječi "režim blokiranja nije vrag" :)) Jedno vrijeme me ovaj prijevod jako zabavljao. Članak je dio knjige "Dupine Indyja" autora Hoovera i Haririja. U principu, da biste radili s Indyjem, ne morate sve pročitati, ali ipak preporučujem da se upoznate s principima rada internetskih protokola. Što se tiče "đavolskog" režima. Blokirajući poziv utičnice zapravo ne vraća kontrolu dok ne završi svoj zadatak. Kada se upućuju pozivi na glavnoj niti, interfejs aplikacije se može zamrznuti. Kako bi izbjegli ovu neugodnu situaciju, indijski programeri su kreirali komponentu TIdAntiFreeze. Samo ga trebate baciti na obrazac - i korisničko sučelje će se lako iscrtati dok blokirate pozive.

Verovatno ste se već upoznali sa sadržajem različitih kartica "Indy (...)" u Delphiju. Postoji mnogo komponenti i svaka od njih može biti korisna. Ni sam nisam radio sa svima, jer ne vidim potrebu da ih proučavam bez određenog zadatka.

Osnovna Delphi distribucija uključuje Indy v.9 sa novčićima. Vjerovatno bi bilo preporučljivo odmah nadograditi na više nova verzija(npr. trenutno imam 10.0.76, ali izgleda ima i kasnijih).

Postoje klijentske i serverske komponente za rad sa istim protokolima. Indy zaista pojednostavljuje razvoj aplikacija, za razliku od opcije razvoja iste funkcionalnosti na utičnicama. Na primjer, da biste uspostavili vezu sa serverom, trebate jednostavno pozvati metodu Connect. Uspješno uspostavljanje veze će biti označeno vraćanjem metode bez izazivanja izuzetka. Ako se veza ne uspostavi, bit će izbačen izuzetak.

"Akademski" primjer (kod ne radi, nemojte ga pokretati :)):

Sa IndyClientom
početi
Host:= "test.com";
Port:= 2000;
Connect;
Pokušajte
// rad sa podacima (čitanje, pisanje...)
konačno
Disconnect;
kraj;
kraj;

Host i port se mogu postaviti u pregledniku objekata ili u runtime-u.

Zašto možete koristiti Indy komponente u zadacima raščlanjivanja? Razne namjene! Najjednostavnije je da dobijete sadržaj stranice (svi su se vjerovatno već susreli) koristeći IdHTTP komponentu:

Var
rcvrdata: TMemoryStream;
idHttp1: TidHttp;
početi
idHttp1:= TidHttp.Create(nil);
rcvrdata:= TMemoryStream.Create;
idHttp1.Request.UserAgent:= "Mozilla/4.0 (kompatibilan; MSIE 5.5; Windows 98)";
idHttp1.Request.AcceptLanguage:= "ru";
idHttp1.Response.KeepAlive:= true;
idHttp1.HandleRedirects:= istina;
probaj
idHttp1.Get(Edit1.Text, rcvrdata);
konačno
idHttp1.Free;
kraj;
ako je rcvrdata.Size > 0 onda počnite
ShowMessage("Primljeno " + inttostr(rcvrdata.Size));
rcvrdata.SaveToFile("c:\111.tmp");
kraj;
rcvrdata.Free;
kraj;

Kao što vidite, ne možete samo dobiti sadržaj stranice, već i simulirati učitavanje dokumenta od određenog klijenta. Indy komponente su općenito korisne za generiranje zaglavlja i POST zahtjeva. Više o tome s primjerima sljedeći put.

Da budete u toku sa ažuriranjima bloga, možete

Indy komponente koje se koriste u Delphiju 6.

Pored osnovnih Internet servisa i protokola, postoji širok spektar dodatnih usluga, čije mogućnosti često koriste internet programeri. Osim toga, mogućnost prikaza informacija pomoću pretraživača nije uvijek prihvatljivo rješenje za internet aplikacije. U ovom slučaju, razumno je koristiti internet infrastrukturu za razmjenu podataka, te omogućiti prikaz informacija kroz složenije klijentske aplikacije razvijene, na primjer, u Delphiju.

Recimo da trebate implementirati specijaliziranu serversku logiku koja nije uključena u standardne web servere. Da bi riješio ovu klasu problema, Delphi uključuje Internet Direct (Indy) biblioteku od Nevrona Designs (http://www.nevrona.com/Indy/). Ova biblioteka, razvijena posebno za Borland Delphi, već ima osam verzija, od kojih je najnovija uključena u novu verziju Delphija. Skup komponenti je podijeljen u tri grupe: klijent (Indy Client), server (Indy Servers) i pomoćni (Indy Misc).

Indy klijenti i Indy serveri

Većina komponenti Indy Client i Indy Servers su parovi koji odgovaraju klijentskim i serverskim dijelovima protokola i usluga (sa izuzetkom određenih, uglavnom serverskih, komponenti kao što su TunnelMaster i TunnelSlave), i dozvoljavaju korištenje protokola kao što je TCP/IP , UDP, NNTP, SMTP, FTP, HTTP, kao i servisi ECHO, FINGER, WHOIS itd.

Komponente Indy klijenta se pišu pomoću utičnica. Utičnica na strani klijenta zahtijeva vezu sa serverom. Ako je veza uspostavljena, klijent i server mogu početi razmjenjivati ​​poruke. Ove poruke su različite prirode, ali se obično razmjena odvija korištenjem određenog protokola (na primjer, HTTP)

TIdTCPClient i TIdTCPServer

Ove komponente se koriste za podršku jednog od glavnih mrežnih protokola - TCP (Transmission Control Protocol), a ujedno su i osnovne klase za TIdSMTP i TIdFTP komponente. Klasa TIdTCPServer ima svojstvo ThreadMgr koje je zadano na nulu. Ako je ThreadMgr nula kada je TIdTCPServer omogućen, klasa TIdThreadMgrDeafault će biti kreirana implicitno. U suprotnom, koristi se instalirani upravitelj procesa.

TIdUDPClient i TIdUDPServer

Ove komponente se koriste za podršku mrežni protokol UDP (User Datagram Protocol) i takođe su osnovne klase za brojne druge Indy komponente.

TIdChargenServer

Komponenta se koristi za generiranje nasumičnih simbola, obično u svrhe testiranja.

TIdDayTime i TIdDayTimeServer

Komponente se koriste za pružanje vremenske usluge. Klijent traži, a server prijavljuje trenutni datum i vrijeme.

TIdDNSResolver

Ovo je komponenta klijenta koja opslužuje zahtjeve sa DNS (Domain Name Service) servera. Upiti DNS servera su dizajnirani da zamene ime računara njegovom IP adresom. TIdDNSResolver je potomak klase TIdUDPClient.

TIdDICTServer

Serverska komponenta koja podržava Dictionary Server Protocol (DICT), rečnik na strani servera zasnovan na TCP protokolu koji omogućava klijentu da pristupi rečniku prirodnog jezika.

TIdDISCARDServer

Serverska komponenta koja podržava poslužitelj zapisa. Snimci se mogu koristiti kao alat za otklanjanje grešaka i mjerenje. Služba evidencije jednostavno predaje sve podatke onome ko je voljan da ih primi.

TI dEcho i TI dECHOServer

Komponente su dizajnirane da pruže uslugu odgovora, koja se obično koristi za provjeru zdravlja mreže. Klijent šalje tekstualnu poruku serveru, server vraća poruku klijentu. Ako je poruka iskrivljena, mreža ne radi.

TIdFinger i TIdFingerServer

Komponente su dizajnirane da obezbede protokol koji omogućava korisniku da traži podatke u vezi sa prisustvom drugih korisnika na sistemu. Neki serveri obrađuju takve zahtjeve klijenata. Korištenje ovog para komponenti će vam omogućiti da servisirate zahtjeve klijenata koji određuju prisustvo drugih korisnika na sistemu.

TIdFTP

Komponenta uključuje punu podršku za protokol za prijenos datoteka - FTP (File Transfer Protocol). Podržan je pasivni i aktivni prijenos podataka, kao i operacije kao što su GET i PUT, brisanje direktorija, dobivanje kvota, veličina datoteka i direktorija. TI dFTP koristi klasu TIdSimpleServer za rad. Kada je prijenos FTP datoteke u toku, otvara se sekundarna TCP veza za prijenos podataka i zatvara se kada se podaci prenesu. Ova veza se naziva "veza podataka", koja je jedinstvena za svaki fajl koji se prenosi.

TIdGopher i TIdGopherServer

Ove komponente su dizajnirane da obezbede mrežni protokol koji je zamenjen U poslednje vreme sa WWW (Svijet Wide Web) HTTP protokol. Server koji implementira ovaj protokol pruža hijerarhijski distribuirani sistem podrške protoku dokumenata. Primjer ovog para komponenti, smještenih u direktorijima \demos\indy\GopherClient i \demos\indy\GopherServer, pokazuje kako se ovaj protokol može koristiti za pružanje lokalna mreža informacije o datotekama koje se nalaze na vašem računaru, uključujući one zatvorene.

TIdHostNameServer

Serverska komponenta dizajnirana za prosljeđivanje imena lokalnog poslužitelja klijentima.

TIdHTTP i TIdHTTPServer

Komponente se koriste za obezbeđivanje HTTP mrežnog protokola (podržane su verzije 1.0 i 1.1, uključujući GET, POST i HEAD operacije). Osim toga, pruža se podrška za autentifikaciju i korištenje proxy servera. Serverska komponenta se koristi za pružanje usluga drugom Web serveru koji podržava dati protokol. TIdHTTPServer olakšava implementaciju funkcija kao što su kolačići, upravljanje stanjem itd.

TIdIcmpClient

Komponenta klijenta dizajnirana da obezbijedi Internet Control Message Protocol (ICMP), koji se koristi za obavljanje ping operacija i praćenje mreže.

TIdPOP3

Klijentska komponenta dizajnirana da obezbedi protokol pošte (POP), uključujući podršku za MIME kodiranje i dekodiranje, i prenos višebajtnih znakova.

TIdIMAP4Server

Serverska komponenta dizajnirana da podrži IMAP (Internet Message Access Protocol) operacije na serveru. Protokol vam omogućava da tražite poruke Email na serveru. Razlika između IMAP i POP protokola je u tome što POP protokol zahtijeva dodatna memorija za pohranjivanje podataka, a IMAP protokol pristupa serveru umjesto klijentskoj mašini. IMAP4 je kreiran da zameni POP3, ali POP3 ostaje široko korišćen standard do danas.

TIdIRCServer

Serverska komponenta dizajnirana da podrži najčešće korištene servisne operacije na Internetu, koje se obično nazivaju chat. Komponenta pruža osnovne blokovi za IRC (Internet Relay Chat) server.

TIdMappedPortTCP

Serverska komponenta dizajnirana za kreiranje mapiranih portova, koji se često koriste u proxy serverima. Metode ove komponente omogućavaju vam da mapirate jedan port na drugi. Na primjer, port 80 bi se mogao mapirati na port 3000, a svi zahtjevi prema prvom portu (port 80) bi bili proslijeđeni na drugi port (port 3000).

TIdNNTP i TIdNNTPServer

Ove komponente su potrebne za podršku protokola za prijenos mrežnih vijesti (NNTP) koji se koristi u servisima vijesti. Klijentska komponenta uključuje podršku za MIME kodiranje i dekodiranje, kao i podršku za višebajtne znakove i alternativna kodiranja. Serverska komponenta vam omogućava da kreirate servere vesti. Važno je napomenuti da TIdNNTPServer nije potpuno opremljen server vijesti, već komponenta koja pruža osnovnu funkcionalnost za takav server.

TIdQOTD i TIdQOTDServer

Komponente se koriste za pružanje usluge Citat dana. Klijentska komponenta se povezuje na instancu komponente servera da dobije dnevnu ponudu. Svaka instanca servera sadrži jedinstvenu bazu podataka citata.

TIdSMTP

Klijentska komponenta dizajnirana za korištenje u aplikacijama Simple Mail Transfer Protocol (SMTP), pružajući podršku za autentifikaciju, MIME kodiranje i dekodiranje i podršku za višebajtne znakove.

TIdSNTP

Klijentska komponenta dizajnirana da pruži SNTP (Simple Network Time Protocol) - vremensku uslugu. Može se koristiti za povezivanje s bilo kojom vremenskom uslugom za određivanje trenutnog datuma i vremena.

TIdSimpleServer

Serverska komponenta koja pruža lagani TCP server. Omogućava vam da organizirate vezu od tačke do tačke. Koristi se za kreiranje servera sa jednim korisnikom, odnosno može poslužiti samo jednu po jednu vezu. Za razliku od komponente TIdTCPServer, ona ne pokreće sekundarne procese kada čeka zahtjeve klijenata i prilikom obrade ovih zahtjeva. Drugim riječima, ako server servira zahtjev od klijenta, a u to vrijeme ga drugi klijent kontaktira da se poveže, tada će biti blokiran do kraja obrade prvog zahtjeva.

TIdTelnet i TIdTelnetServer

Komponenta klijenta se koristi za organizovanje udaljenih sesija na drugom računaru, uključujući pregovore na konzoli i autentifikaciju. Komunikacijski protokol pretpostavlja prisustvo osobe koja interaktivno komunicira sa serverom. Klijentska komponenta nema podršku za prikaz ili emulaciju terminala, već jednostavno pruža vezu sa serverskim dijelom. Obično se serverski protokol TIdTelnetServer koristi za organizovanje udaljenih baza podataka sa tekstualnim interfejsom za interaktivnu interakciju sa klijentima.

TIdTime i TIdTimeServer

Klijentska komponenta je alternativa TIdSNTP komponenti za određivanje vremena. Važno je napomenuti da se formati ova dva protokola razlikuju. TIdTime je baziran na RFC 868 formatu (vraća vrijeme u internom UNIX OS standardu, izvodeći sve potrebne konverzije). Serverska komponenta je slična u funkcioniranju kao i DayTime server. Može se koristiti za implementaciju vremenske usluge na lokalni računar. Nije potreban dodatni kod, samo kreirajte instancu TIdTimeServera koja će vratiti vrijeme internog sata serverskog računara.

TIdTrivialFTP i TIdTrivialFTPServer

Ove komponente su neophodne za organizovanje jednostavnog protokola za prenos datoteka. Klijentska komponenta ovog protokola se koristi za povezivanje na instancu odgovarajuće serverske komponente. Protokol je namijenjen privatnim, lakim, lokalnim slučajevima prijenosa datoteka, na primjer u lokalnim mrežama ili za učitavanje (upload) tabela rutiranja u rutere. Zbog oslabljenih karakteristika ovog protokola, njegova upotreba se ne preporučuje kada se koriste algoritmi za autentifikaciju ili bilo koji drugi sigurnosni mehanizam. Glavna svrha ovog protokola je prijenos datoteka na hardverski uređaj u svrhu njegove izmjene.

TIdTunnelMaster i TIdTunnelSlave

Komponente tunela servera se koriste u proxy serverima za organizovanje više logičkih veza preko jednog fizičkog (tunela). Ove klase se mogu koristiti u različite svrhe, na primjer, za organiziranje tajne veze preko netajnih kanala.

TIdWhois i TIdWhoIsServer

Ova klijentska komponenta se povezuje na bilo koji standardni Whois server, omogućavajući vam da dobijete informacije o domenima. Serverska komponenta pruža osnovnu funkcionalnost NIC servera.

Indy Misc

Stranica palete Indy Miscellaneous Components uključuje BASE64, UUE, Quoted Printable i druge uobičajene komunikacijske formate e-pošte, enkodere (MD2, MD4 i MD5) za standarde kriptografije koji se koriste za pohranjivanje lozinki i elektronski potpisi u nepovratnom (teško dešifrljivom) obliku, kao i mnoge druge korisne komponente i uslužne programe koji se često koriste u razvoju internetskih aplikacija.

TIdAntiFreeze

Zbog blokova baziranih algoritama Indy komponenti, često se čini da je aplikacija zaglavljena dok veza radi. Da biste eliminirali korištenje sekundarnih procesa (threads) prilikom organiziranja komunikacija kako bi se spriječilo zamrzavanje aplikacije, dovoljno je postaviti navedenu komponentu na obrazac.

Komponenta radi tako što analizira zahtjeve iz steka TCP/IP protokola i šalje poruke aplikaciji tokom kašnjenja kada su eksterne veze blokirane, što stvara iluziju pokretanja koda. Budući da komponenta utječe na blokirane veze samo za glavni proces, upotreba TIdAntiFreeze u sekundarnim procesima aplikacije nije potrebna. Imajte na umu da komponenta TIdAntiFreeze usporava veze jer se glavni proces povremeno prekida radi obrade poruka. Iz toga slijedi da se mora voditi računa da aplikacija koja se razvija ne troši previše vremena na obradu poruka, uključujući OnClick, OnPaint, OnResize, itd. Do neke mjere, ovo se može kontrolisati kroz svojstva klase TIdAntiFreeze. Upotreba ove komponente nije obavezna, ali vam omogućava da riješite problem sinhronizacije veza sa vizuelnim interfejsom aplikacije.

TIdDateTimeStamp

Klasa za izvođenje matematike datuma i vremena koja se odnosi na činjenicu da internet protokoli koriste različite formate datuma i vremena; pored toga, klijenti i serveri se mogu nalaziti u različitim vremenskim zonama.

TIdIPWatch

To je komponenta zasnovana na tajmeru koja stalno prati promjene u IP adresi računara. Događaji komponente se javljaju kada se otkrije promjena. Ova komponenta se obično koristi za otkrivanje da li je računar povezan na Internet ili bilo koju drugu mrežu. Do promjene IP adrese u ovoj situaciji može doći zbog IP adrese koju dodjeljuje DHCP (Dynamic Host Configuration Protocol) server prilikom povezivanja na novu mrežu.

TIdLogDebug

Svrha ove komponente je presretanje događaja bilo koje komponente klijenta ili servera i postavljanje zapisa o događaju specificirani fajl. Ova komponenta je vrlo korisna za otklanjanje grešaka u Indy komponentama.

TIdMessage

Komponenta se koristi u kombinaciji s drugim komponentama za pravilno dešifriranje ili kodiranje poruka. To mogu biti POP, SMTP i NNTP komponente. Klasa podržava MIME enkripciju i dešifriranje, višebajtne znakove i ISO kodiranje.

TIdNetworkCalculator

Jedna od rijetkih Indy komponenti koje se mogu koristiti pri izgradnji aplikacija. Mrežni kalkulator se može koristiti za izvođenje proračuna na IP adresama, uključujući mrežne maske, podmreže, mrežne klase itd.

TIdThreadMgrDefault

Komponenta podrazumevano obezbeđuje kontrolu nad sekundarnim procesima. Kreira se kada bilo koja Indy komponenta koja podržava upravljanje procesima nema definiranu instancu klase TIdThreadManager. Komponenta pruža samo osnovne mogućnosti za upravljanje sekundarnim procesima: njihovo kreiranje i uništavanje na zahtjev.

TIdThreadMgrPool

Naprednija komponenta upravljanja procesima od TIdThreadMgrDefault jer spaja procese umjesto da ih stvara ili uništava na zahtjev.

TIdVCard

VCard je elektronski ekvivalent vizit karte i može sadržavati lične podatke vlasnika i grafičke podatke.

TIdIMFDecoder

Dizajniran za dekodiranje Internet poruka. On je potomak klase TIdCoder, baš kao i sve ostale komponente kodera. Klasa TIdCoder dekodira prema standardu ARPA Internet tekstualnih poruka RFS-822, predloženom u avgustu 1982., i USENET standardu za razmjenu poruka RFC 1036, predloženom u decembru 1987. godine.

Komponenta proširuje klasu TIdCoder kako bi omogućila detekciju RFS-822 formata po kontekstu zaglavlja, pružajući način dešifriranja po prijemu i MIME enkripciju i dešifriranje. Komponenta TIdIMFDecoder se koristi u klasi TIdMessageClient za dekodiranje primljenih i poslanih poruka.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder vam omogućava dešifriranje teksta u navedenom formatu. Može poslužiti kao samostalna komponenta sa specificiranim tipom kodiranja, omogućavajući slanje poruka koje sadrže novi tip kodiranja.

TIdBase64Encoder

Implementira drugi algoritam šifriranja koji omogućava prijenos znakova koji se ne mogu ispisati.

TIdUUEncoder

Implementira jedan od prvih algoritama za šifriranje, UU kodiranje. Ponekad se koristi prilikom slanja članaka na novinsku službu.

TIdXXEncoder

Ova metoda šifriranja se vjerovatno neće ikada koristiti. U suštini, ovo je isto UU kodiranje, ali sa različitom tablicom šifriranja.

TIdCoderMD2

Komponente s različitim tipovima MD (Message Digest) algoritma šifriranja. Svi su zasnovani na nasumičnom rasporedu, jednosmerni i nemaju algoritame za dešifrovanje.

Komponente protokolarnih klijenata i servera mogu se koristiti za razvoj serverskih i klijentskih Internet aplikacija, zajedno sa ili umjesto osnovnih (ClientSocket, ServerSocket) i drugih komponenti iz palete Interneta i Fastnet. Indy komponente ne koriste WebBroker arhitekturu, implementirajući podršku niskog nivoa za internet protokole i usluge direktno u svom izvornom kodu ( izvorni kodovi su u prilogu).

TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL

SSL protokol - Secure Sockets Layer, koji osigurava tajnost i pouzdanost komunikacije između dvije aplikacije, ima dva sloja. Na niskom nivou višeslojnog transportnog protokola (kao što je TCP), SSL je protokol za snimanje i koristi se za kapsuliranje različitih protokola višeg nivoa. Prednost SSL-a je u tome što je nezavisan aplikacijski protokol, ali se protokol višeg nivoa može koristiti na vrhu SSL-a.

SSL pruža sigurnost komunikacije, koja ima tri glavne funkcije: obezbjeđivanje povjerljive veze; enkripcija sa javni ključ(koristi se za potvrdu autentičnosti primaoca); podrška za pouzdanost prenosa podataka.

  • Simetrična kriptografija se koristi za šifriranje podataka (npr. DES, RC4, itd.).
  • Digitalni potpis se obezbjeđuje korištenjem asimetrične enkripcije javnog ključa (na primjer, RSA, DSS, itd.).
  • Pouzdanost komunikacije, transport poruka uključuje provjeru integriteta poruke kroz MAC ispravne kodove, sigurne hash funkcije (npr. SHA, MD5, itd.) korištenjem MAC proračuna.

U kombinaciji sa HTTP i autentifikacijom servera, SSL pruža potrebne funkcije šifriranja i dalje održava uspostavljenu vezu unakrsnom provjerom identiteta web servera itd. Važno je shvatiti da SSL samo štiti komunikaciju tokom prijenosa podataka i ne zamjenjuje druge sigurnosne mehanizme.

Komponente TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL pružaju veze i na strani klijenta i na strani servera koristeći SSL protokol. Treba napomenuti da su komponente TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL dostupne samo u Delphiju 6, a ne u Kylixu. To je zbog složenosti protokola, koji se u slučaju Windows implementacije zasniva na funkcijama operativnog sistema.

Primeri korišćenja Indy komponenti mogu se naći u direktorijumima /Delphi6/Demos/Indy. Ukupno, Indy biblioteka u verziji 8.0 sadrži 69 komponenti. Navodi se da će u verziji 9.0 navedena biblioteka sadržavati 86 komponenti. Sve komponente su objedinjene i uključene u Delphi 6 i Kylix, što im omogućava da se koriste za razvoj cross-platform aplikacija. Sve Indy komponente podržavaju multithreading.

Indy komponente implementiraju gotovo sve funkcionalnosti koje se nalaze u komponentama Interneta i Fastneta, kao što je jasno prikazano u tabeli.

Fastn et components Indy komponente Namjena komponenti
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Interakcija između dva računara (klijent i server) koristeći TCP/IP protokol
2 TNMDayTime TIdDayTime, TIdDayTimeServer Upitajte server za trenutno vrijeme
3 TNMEcho TIdEcho, TIdEchoServer Koristi se za komunikaciju sa serverom odgovora
4 TNMFinger TIdFinger, TIdFingerServer Koristi se za dobijanje informacija o korisniku sa servera za internet pretragu
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Omogućite prijenos datoteka koristeći FTP protokol
6 TNMHTTP TIdHTTP, TIdHTTPServer Koristite HTTP protokol za razmjenu podataka
7 TNMMsgServ, TNMMsg Koristi se za prenošenje jednostavnog tekstualne poruke od klijenta do servera
8 TNMNNTP TIdNNTP, TIdNNTPServer Podržava razmjenu podataka sa serverom vijesti
9 TNMPOP3 TIdPOP3 Koristi se za primanje e-pošte sa servera pošte koristeći POP3 protokol
10 TNMSMTP TIdSMTP Koristi se za slanje e-pošte putem mail server Internet
11 TNMStrm, TNMStrmServ Prenosi binarne podatke upisane u tok koristeći TCP/IP protokol
12 TNMUDP TIdUDP, TIdUDPServer Prenesite podatke koristeći UDP protokol
13 TpowerSock, TNMGeneralServer Komponentne enkapsulirane klase koje su osnova za pisanje vlastitih klijenata (Powersock) i servera (NMGeneralServer)
14 TNMUUProcessor TIdUUEkoder, TIdUUDekoder Izvršite kodiranje binarne datoteke u MIME ili UUENCODE format
15 TNMURL Konvertuje nizove u HTML format i vrši obrnutu konverziju

Izuzetak su klase kao što su TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL, koje ili implementiraju zastarjele protokole ili imaju funkcionalnost implementiranu u velikoj grupi alternativnih klasa.

Međutim, za razliku od svojih prethodnika – Internet i Fastnet komponenti, Indy sadrži bogatije serverske komponente i komponente za transkodiranje i enkripciju podataka, kao i podršku za autentifikaciju (Indy Misc paleta). Kao što se može vidjeti iz gornje tabele, glavne protokole i usluge pružaju ne samo klijentske, već i serverske komponente. To su servisi vremena, usluge odgovora, dobijanje korisničkih informacija, kao i HTTP, NNTP, UDP protokoli, pa čak i najjednostavnija verzija FTP-a.

Neki primjeri korištenja Indy komponenti

U Indy komponentama sadržanim u Delphiju, IP adresa je definisana u svojstvu Host, obično samo u klijentskim aplikacijama. Komponente koje se nalaze na serveru imaju metode koje vam omogućavaju da pokrenete ili zaustavite prozivanje odgovarajućeg porta - na primjer, promjenom svojstva Active komponente IdTCPServer pokreće ili zaustavlja prozivanje odgovarajućeg porta. Kada se uspostavi veza između klijenta i servera, može početi prijenos podataka.

Indy komponente stavljaju veliki naglasak na sigurnost i pouzdanost prilikom rada s podacima. Na primjer, komponenta IdTCPClient ima metode Connect i Disconnect. Koristeći tehniku ​​programiranja poput koda u nastavku sa strane klijenta:

sa TCPClient započnite Connect; pokušajte lstMain.Items.Add(ReadLn); konačno Disconnect; kraj; kraj;

i korištenje svojstva Connection proslijeđenog kao parametra AThread instanci klase TIdPeerThread sa strane servera:

sa AThread.Connection do begin WriteLn("Zdravo sa Basic Indy Server servera."); Disconnect; kraj;

možete računati ili na normalno izvršavanje veze ili na ispravno rukovanje greškama.

Obratite pažnju na ReadLn i WriteLn metode odgovarajućih klasa - one liče na standardne Pascal I/O izjave. Ovo je priznanje UNIX tehnici programiranja, gdje se većina sistemskih operacija izvodi čitanjem i pisanjem u odgovarajuće datoteke.

Baš kao i Fastnet komponente, klase komponenti Indy imaju događaje koji se mogu koristiti za upravljanje događajima. Na primjer, možete urediti da se poruka prikaže na obrascu kada se povezujete s klijentom:

procedura TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Uslužni klijent]"; kraj;

Indy obezbeđuje komponente koje implementiraju protokole sa klijentskim i serverskim delovima koji su jedinstveni za ovu biblioteku. Komponente TIdGopherServer i TIdGopher, zahvaljujući metodama GetExtendedMenu, GetFile, GetMenu, GetTextFile na strani klijenta i ReturnGopherItem, SendDirectoryEntry na strani servera, pomažu u pregledu datoteka razne vrste, uključujući one označene kao skrivene, kao i direktorije na udaljeni računar(slično kako to radi komanda dir *.* u MS-DOS operativnom sistemu).

Koristeći komponente IdSMTP i IdMessage, možete jednostavno kreirati vlastitu web aplikaciju koja može slati poštu koristeći SMTP protokol.

U ovom slučaju, klasa IdMessage (jedna od 23 komponente sa stranice Indy Misc) je odgovorna za generiranje poruke, koja slijedi iz njenog imena, a IdSMTP je za organiziranje veze sa mail serverom.

Tehnologija koja se koristi u Indyju koristi zaključavanje operacija čitanja i pisanja. Bilo koja operacija povezivanja koja se koristi u Indyju čeka da se veza završi. Kada radite s komponentama Indy klijenta, obično morate učiniti sljedeće:

  • zatražiti vezu sa serverom;
  • napraviti zahtjeve za čitanje i pisanje serveru (u zavisnosti od tipa servera, korak se izvodi jednom ili se ponavlja više puta);
  • prekinuti vezu sa serverom i prekinuti vezu.

Indy komponente su dizajnirane da obezbede ultra visok nivo apstrakcije. Zamršenosti i detalji TCP/IP steka skriveni su od programera tako da se može fokusirati na zadatak koji mu je pri ruci.

Sljedeći mali primjer prikazuje tipičnu sesiju klijentskog bean-a:

sa IndyClientom počnite Host:= "zip.pbe.com"; // Host za pozivanje Port:= 6000; // Port za pozivanje servera na Connect; try // Vaš kod ide ovdje konačno Disconnect; kraj; kraj;

U primjeru, čak i ako veza sa serverom nije uspostavljena, veza će biti graciozno prekinuta zbog upotrebe naredbe try-finally.

Indyjeve serverske komponente opisuju različite modele servera koji se mogu koristiti ovisno o vašim potrebama i protokolu koji koristite.

TIdTCPServer je najčešće korišćena serverska komponenta, koja stvara sekundarni proces nezavisno od glavnog procesa aplikacije. Kreirani proces čeka na dolazne zahtjeve od potencijalnim klijentima. Pojedinačni sekundarni proces kreira se za svakog klijenta na čiji zahtjev odgovara. Događaji koji se dešavaju tokom procesa održavanja povezani su sa kontekstom odgovarajućih procesa.

Drugim riječima, za svaku klijentsku vezu, klasa TIdTCPServer koristi jedinstvenu sekundarnu nit pozivajući obrađivač događaja OnExecute te niti. Formalni parametar metode OnExecute je referenca na instancu klase Athread koja odgovara kreiranoj niti. Svojstvo Connection ove klase je referenca na klasu TIdTCPConnection, čija se instanca kreira za obradu zahtjeva klijenta. TIdTCPConnection podržava čitanje i pisanje preko veze, kao i uspostavljanje i prekid komunikacijske sesije.

UDP protokol radi bez prethodnog uspostavljanja veze sa serverom (svaki poslani paket je nezavisan skup podataka, a ne deo veće sesije ili veze). Dok TIdTCPServer stvara zasebne niti za svaku vezu, TIdUDPServer koristi ili glavnu nit ili jednu sekundarnu nit koja obrađuje sve zahtjeve UDP protokola. Kada je TIdUDPServer aktivan, kreira se nit za slušanje dolaznih UDP paketa. Za svaki primljeni paket, događaj OnUDPRead se pokreće ili na glavnoj niti ili u kontekstu niti slušanja, ovisno o vrijednosti svojstva ThreadedEvent. Kada ThreadedEvent procijeni na False, događaj se javlja u glavnoj niti, u suprotnom se javlja u niti koja sluša. Dok se događaj obrađuje, druge operacije servera su blokirane. Stoga je važno osigurati da se OnUDPRead procedure izvode što je brže moguće.

Ako trebate kreirati novu klijentsku aplikaciju za postojeći poslužitelj koristeći postojeći protokol, vaš posao je isključivo da razvijete i otklonite greške u klijentskoj aplikaciji. Međutim, kada morate razviti i klijenta i serverska aplikacija Bilo da koristimo postojeći ili novi protokol, suočeni smo s klasičnim problemom „kokoške i jaja“. Gdje započeti programiranje - sa klijenta ili sa servera?

Očigledno, i klijent i server moraju biti kreirani na kraju. Za mnoge aplikacije, posebno one koje koriste protokol zasnovan na tekstu (kao što je HTTP), lakše je započeti izgradnju aplikacije dizajniranjem servera. A za otklanjanje grešaka postoji pogodan klijent koji već postoji. Ovo je Telnet konzolna aplikacija koja je dostupna i na Windows i na UNIX-u.

Ako ukucate konzolu telnet komanda 127.0.0.1 80 sa IP adresom lokalnog računara i brojem porta 80, koji se podrazumevano koristi od strane Web servera, onda će aplikacija odgovoriti tekstom prikazanim na Sl. 6, u slučaju Windows 2000 OS i IIS 5.0.

Da biste kreirali najjednostavniji server koristeći Indy komponente, trebate:

Ako trebate dizajnirati server koji će ne samo ispravno obavijestiti svoje klijente kada se veza izgubi, već će im pružiti i informacije o situacijama greške koje su se dogodile, koristite naredbu try-except umjesto try-finally - na primjer, kao prikazano u sljedećem primjeru:

procedura TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: String; započnite sa AThread.Connection pokušajte pokušajte s:= ReadLn; // Izvrši zadatak servera ovdje // ako se ne pojavi izuzetak, // ispiši odgovor servera WriteLn(s); osim na e: Izuzetak do begin WriteLn(e.Message); end; //on end; //pokušaj osim konačno Disconnect;end;end;

Ovaj mali primjer pokazuje korake za kreiranje jednostavnog tekstualnog servera, kao i kako ga otkloniti.

Gore opisani server je tipičan primjer organizacije modernog distribuiranog računarstva.

Značajke kreiranja višeslojnih aplikacija

U posljednje vrijeme, višestruki serveri se sve više koriste za zadovoljavanje zahtjeva klijenata. Server ovog tipa, nakon što je primio zahtjev klijenta i djelimično ga pripremio za dalju obradu, kontaktira drugi server i šalje mu transformirani zahtjev ili zahtjeve. Server drugog nivoa može, zauzvrat, komunicirati sa drugim serverima. Dakle, možemo govoriti o višeslojnoj arhitekturi servera.

Zatim ćemo kreirati server za pristup podacima čija je svrha vraćanje podataka iz baze podataka. Ovaj server, međutim, ne čita niti upisuje direktno u datoteke baze podataka. Umjesto toga, komunicira sa serverom baze podataka u potrazi za podacima koje zahtijeva klijent.

Dakle, počinjemo da razvijamo aplikaciju sa troslojnom arhitekturom. Da biste kreirali server baze podataka koristeći Indy komponente potrebno vam je:

  1. Kreirajte novi projekat.
  2. Postavite instancu komponente TIdTCPServer iz Indy Servers palete na glavni oblik projekta.
  3. Postavite svojstvo DefaultPort instance klase TIdTCPServer1 na 6001 (preporučljivo je dodijeliti velike vrijednosti kako biste izbjegli dupliciranje brojeva portova u različitim aplikacijama) i postavite svojstvo Active na true.
  4. Dodajte novi modul projektu odabirom File | Novo | Data Module i postavite instance SQLConnection i SQLDataSet komponenti na njega s kartice dbExpress na paleti komponenti.
  5. Postavite svojstvo ConnectionName klase SQLConnection na IBLocal i LoginPrompt na False. Ako niste konfigurirali IBLocal u bazi podataka employee.gdb, prvo dovršite ovu proceduru.
  6. Postavite svojstvo SQLConnection klase SQLDataSet na SQLConnection1 i dodijelite svojstvo CommandText SQL izraz: odaberite CUSTOMER, CONTACT_FIRST, CONTACT_LAST od CUSTOMER gdje je CUST_NO = :cust.

Serge Dosyukov Mike Pham

Ovaj članak vam pokazuje kako da kreirate samostalnu Web uslugu koristeći Indy kit i Delphi 7, i kako da koristite Indy komplet za podršku Delphi 7 SOAP-baziranih Web usluga. Iza Dodatne informacije Za informacije o kreiranju Web usluga, pogledajte odličan članak Nicka Hodgesa na stranici Borland zajednice: Shakespeare on the Web.

Pre ili kasnije, možda ćete morati da kreirate server koji je samostalni HTTP server i koji podržava Web usluge. Na primjer, možda biste željeli kreirati SOAP-bazirani poslužitelj aplikacija za n-slojnu aplikaciju izgrađenu pomoću Delphija.

Uvod

Delphi-jeva online pomoć je odlična sekvencijalna instrukcija o tome kako kreirati web servis, MIDAS server (COM, DCOM model), ali praktično nema informacija o kreiranju samostalne n-tier MIDAS aplikacije bazirane na SOAP protokolu.

Prethodno objavio Dave Nottage. Ovaj članak opisuje ideju ​​kako kreirati web servis u Delphiju 6 sa SOAP podrškom i mogućnošću objavljivanja SOAP sučelja Datamodulea, odnosno, ovaj članak vam je omogućio da naučite kako kreirati vlastiti n-tier MIDAS sistemi.

Borlandov Delphi 7 i novi Indy kit imaju ugrađenu podršku za ovu funkcionalnost.

Međutim, uprkos ugrađenoj podršci, ova funkcija nije dokumentirana.

Nedavne objave na Borland mrežnoj konferenciji i pretraživanje interneta pomoću Google servera omogućili su autorima da razviju način za pretvaranje postojećeg koda iz Delphija 6 u Delphi 7. Ali sve ima svoje vrijeme.

glavna ideja

Ovaj članak je prvi dio serije od tri dijela. Opisuje glavne odredbe. Drugi i treći dio bit će posvećeni nekim problemima i načinima njihovog rješavanja. Počnimo s opisom glavne ideje.

  • biti samostalni HTTP server;
  • koristiti Indy kao platformu;
  • podrška za objavljivanje putem SOAP protokola;
  • biti sposoban za objavljivanje SOAP modula podataka, što bi vam omogućilo da kreirate vlastiti n-slojni server baziran na SOAP/HTML-u.

HTTP server i SOAP

Mnogi ljudi poznaju Indy i ranije su koristili THTTPServer komponente. Lako je staviti ovu komponentu na formular za prijavu, ali kako učiniti da podržava SOAP? U direktoriju "C:Program FilesBorlandDelphi7SourceIndy" možete pronaći datoteku IdHTTPWebBrokerBridge.pas. Ovo je upravo ono što vam treba.

Ova datoteka nije dio Indy izvršne datoteke, tako da je morate uključiti u svoj trenutni projekt kao standardni projektni fajl. (Za kompajliranje projekta, trebat će vam i datoteka IdCompilerDefines.inc.) Ove datoteke moraju biti kopirane u trenutni direktorij projekta. Promjene koda mogu biti potrebne za povećanje brzine, tako da je najbolje držati ove datoteke odvojeno od Indy distribucije.

Sljedeće opisuje implementaciju zamjenske komponente iz THTTPServera, proširene za podršku SOAP paketima, pod nazivom TIdHTTPWebBrokerBridge. Ova konstrukcija je klasa koja nasljeđuje od TCustomHTTPServera i podržava osnovno povezivanje zahtjeva.

Pošto ovoj klasi nije moguće pristupiti sa palete, moraćete da je definišete kao običan objekat prilikom izvršavanja vašeg koda.

Ovaj objekat se može koristiti na potpuno isti način kao i običan THTTPServer, sa izuzetkom onih dodatnih svojstava koja omogućavaju rad sa SOAP-om.
Međutim, prvo pogledajmo pripremu potrebnog koda.

WebBroker i Indy

Za one koji su ranije kreirali Web usluge, znate da ih koristite WebBroker. Delphi 7, kao i Delphi 6, koristi arhitekturu WebBroker za podršku SOAP-u.

Stoga morate kreirati modul TWebModule i u njega postavite sljedeće tri komponente: THTTPSoapDispatcher, THTTPSoapPascalInvoker i TWSDLHTMLPublish. Svi su dostupni na kartici WebServices na paleti komponenti. Nakon povezivanja SOAPDispatchera sa SOAPPascalInvokerom, obrazac za prijavu je spreman. Krajnji rezultat bi trebao izgledati otprilike ovako:

(modul uWebModule.pas)

Najbolje je ostaviti sve kako jeste, jer nema potrebe mijenjati ili izvršavati bilo koji prilagođeni kod za ovaj obrazac.

WebModule i Indy

Pređimo na drugi dio koda koji je potreban za implementaciju HTTP servera.

Kao što vidite, TIdHTTPWebBrokerBridge ima RegisterWebModuleClass metodu, koja vam omogućava da registrujete sopstveni WebModule i učinite ga dostupnim serveru.

Stoga, nakon kreiranja fServer serverskog objekta, trebate samo pozvati klasu fServer.RegisterWebModuleClass (TwmSOAPIndy).

Bilješka. U normalnoj implementaciji TIdHTTPWebBrokerBridge, objekt TwmSOAPIndy će biti kreiran svaki put kada se primi zahtjev. Očigledno to nije potrebno. Stoga se klasa može modificirati kako bi se omogućilo trajno kreiranje ovog objekta sve dok postoji serverski objekat. Preporučuje se da pogledate dokumentaciju implementacije klase za više informacija.

Da li je server spreman?

Uvod u Indy

Uvod u Indy
Objavio Chad Z. Hower
Početna stranica: http://www.atozedsoftware.com
Prevod: Anatolij Podgorecki
uvod
Napisao sam ovaj članak kada trenutna verzija bila je Indy 8.0. Veći dio ovog članka je primjenjiv i vrlo koristan u budućim verzijama Indyja. Ako vam se svidio ovaj članak i želite pročitati više detaljnih članaka, pogledajte knjigu Indy in Depth.
Indy radi u načinu blokiranja
Indy koristi blokirajuće utičnice. Način blokiranja sličan je načinu čitanja i pisanja datoteke. Prilikom čitanja ili pisanja podataka, funkcija ne vraća kontrolu dok se operacija ne završi. Razlika od rada sa datotekama je u tome što poziv može potrajati duže, jer traženi podaci još ne postoje, to ovisi o brzini kojom vaša mreža ili modem radi.
Na primjer, metoda se jednostavno poziva i čeka dok se kontrola ne vrati pozivnoj točki. Ako je poziv bio uspješan, kontrola će biti vraćena iz metode; ako dođe do greške, biće podignut izuzetak.
Zaključavanje nije fatalno
Zbog načina blokiranja, mnogo puta smo bili poraženi od naših protivnika, ali način blokiranja nije vrag.
Problem se pojavio nakon prenosa Winsocka na Windows. U Unixu, problem je obično riješen račvavanjem (slično multi-threadingu, ali sa odvojenim procesima umjesto niti). Unix klijenti i demoni morali su da razdvoje procese koji bi trebali biti pokrenuti i koristiti način blokiranja. Windows 3.x nije mogao biti paraleliziran i nije podržavao mnogo niti. Korištenje sučelja za blokiranje zamrznulo je korisničko sučelje i učinilo programe nereagirajućim. Stoga su WinSock-u dodani neblokirajući načini, omogućavajući Windowsu 3.x sa svojim ograničenjima da koristi Winsock bez blokiranja glavne i jedine niti programa. To je zahtijevalo drugačije programiranje, a Microsoft i drugi su strastveno ocrnjivali načine blokiranja kako bi prikrili nedostatke Windowsa 3.x.
Zatim je došao Win32, koji je mogao podržati multi-threading. Ali u to vrijeme, njihovi mozgovi su već bili zbrkani (odnosno, programeri su smatrali da je blokiranje soketa kreacija đavola), i već je bilo teško promijeniti ono što su učinili. Stoga se nastavlja ocrnjivanje režima blokiranja.
U stvarnosti, Unix ima samo blokirajuće utičnice. Blokirajuće utičnice također imaju svoje prednosti i mnogo su bolje za multi-threading, sigurnost i druge aspekte. Neke ekstenzije su dodane u Unix za neblokirajuće utičnice. Međutim, oni rade sasvim drugačije nego na Windows-u. Oni su takođe nestandardni i nisu baš česti. Blokirajuće utičnice u Unixu se koriste u gotovo svim slučajevima i nastavit će se koristiti.
Prednosti načina blokiranja·Lakše programirati - Načine blokiranja je lakše programirati. Sav korisnički kod može se nalaziti na jednom mjestu i izvršavati prirodnim redoslijedom. · Lakše je preneti na Unix - Pošto Unix koristi blokirajuće utičnice, u ovom slučaju je lakše napisati prenosivi kod. Indy koristi ovu činjenicu za pisanje uniformnog koda. ·Pogodnije je raditi sa nitima - Pošto blokovi za blokiranje imaju sekvencu stečenu naslijeđem, tako da su vrlo laki za korištenje u nitima.
Nedostaci načina blokiranja · Korisnički interfejs se zamrzava u klijentima - Blokirajući poziv utičnice ne vraća kontrolu dok ne završi svoj zadatak. Kada se takav poziv izvrši na glavnoj niti aplikacije, aplikacija ne može obraditi korisničke poruke. Ovo uzrokuje zamrzavanje korisničkog sučelja, neosvježavanje prozora i obradu drugih poruka dok se kontrola ne vrati iz utičnice za blokiranje.
TIdAntiFreeze komponenta
Indy ima posebnu komponentu koja rješava problem zamrzavanja korisničkog interfejsa. Jednostavno dodajte jednu komponentu TIdAntiFreeze bilo gdje u vašoj aplikaciji i možete blokirati pozive bez zamrzavanja korisničkog sučelja.
TIdAntiFreeze radi na internom tajmeru izvan steka poziva i poziva Application.ProcessMessages kada istekne vremensko ograničenje. Vanjski pozivi na Indy i dalje se blokiraju i stoga rade potpuno isto kao i bez korištenja komponente TIdAntiFreeze. Korištenje TIdAntiFreeze vam omogućava da dobijete sve prednosti blokiranja utičnica, bez ikakvih nedostataka.
Niti koda (Threading)
Sa blokirajućim utičnicama, tokovi koda se gotovo uvijek koriste. Utičnice koje ne blokiraju također mogu koristiti niti, ali to zahtijeva neke dodatna obrada a njihove prednosti u ovom slučaju se gube u odnosu na blokirajuće utičnice.
Prednosti niti · Postavljanje prioriteta - Prioriteti pojedinačnih niti se mogu konfigurirati. Ovo omogućava da se pojedinačnim zadacima dodijeli više ili manje CPU vremena. ·Encapsulation - Svaka veza može sadržati neki privid interfejsa sa drugom vezom. ·Sigurnost - Svaka nit može imati različite sigurnosne atribute. · Više procesora - pruža prednost na sistemima sa više procesora. · Nema potrebe za serijalizacijom - pruža punu konkurentnost. Bez puno niti, svi zahtjevi se moraju obraditi u jednoj niti. Stoga, svaki zadatak mora biti razbijen na male dijelove kako bi mogao brzo raditi. Dok jedan blok radi, svi ostali su prisiljeni čekati da se završi. Na kraju jednog bloka, izvršava se sljedeći i tako dalje. Sa višenitnošću, svaki zadatak se može programirati kao jedna jedinica i operativni sistem raspoređuje vreme između svih zadataka.
Teme ankete
Kreiranje i uništavanje niti je vrlo zahtjevno za resurse. Ovo je posebno težak zadatak za servere koji imaju kratkotrajne veze. Svaki server kreira nit, koristi je kratko vrijeme, a zatim je uništava. To dovodi do toga da se teme kreiraju i brišu vrlo često. Primjer za to je web server. Šalje se jedan zahtjev i vraća se jednostavan odgovor. Kada koristite pretraživač, može doći do stotina veza i prekida veze prilikom pregleda bilo koje web stranice.
Niti anketiranja mogu ispraviti ovu situaciju. Umjesto kreiranja i uništavanja niti na zahtjev, niti se biraju sa liste neiskorištenih, ali već kreiranih niti iz skupa. Kada nit više nije potrebna, ona se vraća u spremište umjesto da bude uništena. Niti u spremištu su označeni kao neiskorišteni i stoga ne troše CPU vrijeme. Za još veće poboljšanje, niti se mogu dinamički prilagođavati trenutnim potrebama sistema.
Indy podržava anketiranje niti. Skupu niti u Indyju se može pristupiti preko komponente TIdThreadMgrPool.
Puno tema
Jako opterećen server može zahtijevati stotine ili čak hiljade niti. Uvriježeno je vjerovanje da stotine i hiljade niti mogu ubiti vaš sistem. Ovo je lažno vjerovanje.
U većini servera niti čekaju podatke. Dok čekate blokirajući poziv, nit je neaktivna. Na serveru sa 500 niti, samo 50 može biti aktivno u isto vrijeme.
Broj niti koje se izvode na vašem sistemu može vas iznenaditi. Sa minimalnim brojem pokrenutih servera i navedenim pokrenute aplikacije moj sistem ima kreirano 333 niti, čak i sa 333 niti je CPU opterećen samo 1%. Jako opterećen IIS server(Microsoft Internet Information Server) može kreirati stotine i hiljade niti.
Teme i globalne sekcije
Sa više niti, morate osigurati integritet podataka kada im pristupate. Ovo može biti teško za programere koji nisu radili sa nitima. Ali općenito, većina servera ne mora koristiti globalne podatke. Većina servera obavlja izolirane funkcije. Svaka nit obavlja svoj izolirani zadatak. Globalne sekcije za čitanje/pisanje su karakteristika mnogih višenitnih aplikacija, ali nisu tipične za servere.
Metodologija Indy
Indy se razlikuje od ostalih Winsock komponenti na koje ste navikli. Ako ste radili sa drugim komponentama, onda najbolje rješenje zaboraviće kako rade. Mnoge druge komponente koriste neblokirajuće (asinhrone) pozive i rade asinhrono. Oni trebaju reagirati na događaje, kreirati državnu mašinu i izvršavati česte petlje čekanja.
Na primjer, kod drugih komponenti, kada pozivate vezu, morate ili čekati da se dogodi događaj povezivanja ili čekati u petlji da svojstvo naznači da je došlo do veze. Uz Indy, možete pozvati metodu Connect i čekati da se vrati. Povrat novca će biti izdat ako je veza uspješna ili ako se pojavi izuzetak ako postoji problem. Stoga je rad s Indyjem vrlo sličan radu s datotekama. Indy vam omogućava da sav svoj kod stavite na jedno mjesto, umjesto da ga širite na različite događaje. Osim toga, Indy je vrlo jednostavan i najprikladniji za rad s nitima.
Koliko je Indy drugačija?
Kratak pregled · Koriste se blokirajući pozivi · Nisu orijentisani na događaje - postoje događaji, ali se koriste za informativne potrebe i zapravo nisu potrebni. · Dizajniran za navoje - Indy je dizajniran za navoje, ali se može koristiti bez niti. Sekvencijalno programiranje
Detaljna recenzija
Indy ne samo da koristi blokiranje poziva (sinhrono) već i radi ovako. Tipična Indy sesija izgleda ovako:
sa IndyClientom počnite
Connect; Pokušajte
// Radite svoje stvari ovdje
konačno Disconnect; kraj;
kraj;
Sa ostalim komponentama to izgleda ovako:
procedura TFormMain.TestOnClick(Pošiljalac: TComponent);
početi
sa SocketComponent počnite
Connect; probaj
dok niste povezani počinju
ako IsError onda počnite
Prekini;
kraj;

OutData:= "Podaci za slanje";
dok dužina(OutData) > 0 počinje
Application.ProcessMessages;
kraj;
konačno Disconnect; kraj;
kraj;
kraj;
procedura TFormMain.OnConnectError;
početi
IsError:= Tačno;
kraj;
procedura TFormMain.OnRead;
var
i: Integer;
početi
i:= SocketComponent.Send(OutData);
OutData:= Copy(OutData, i + 1, MaxInt);
kraj;
Mnoge komponente ne obavljaju baš dobar posao izolacije programera od steka. Mnoge komponente, umjesto da izoluju korisnika od složenosti steka, jednostavno prepuštaju korisnika njemu ili pružaju omotač preko steka.
Indy poseban način
Indy je dizajniran od temelja da bude višenitni. Izgradnja servera i klijenata u Indyju je slična izgradnji servera i klijenata u Unixu. Unix aplikacije obično pozivaju stek direktno sa malo ili bez sloja apstrakcije.
Tipično, Unix serveri imaju jedan ili više procesa slušanja koji prate dolazne zahtjeve klijenata. Za svakog klijenta kojeg treba uslužiti, a novi proces. Ovo čini programiranje jednostavnim, svaki proces za samo jednog klijenta. Svaki proces radi u svom vlastitom sigurnosnom kontekstu, koji je postavljen procesom slušanja ili procesom na osnovu postojećih prava, identiteta ili drugih stvari.
Indy serveri rade na skoro isti način. Windows, za razliku od Unixa, ne može dobro umnožavati procese, ali dobro radi sa nitima. Indy serveri kreiraju zasebnu nit za svaku klijentsku vezu.
Indy serveri dodjeljuju nit za slušanje koja je odvojena od glavne kodne niti programa. Nit za slušanje osluškuje dolazne zahtjeve klijenata. Za svakog klijenta na kojeg odgovori, kreira se nova nit koja služi klijentu. Relevantni događaji se zatim servisiraju u kontekstu ovog toka.
Indy Customer Review
Indy je dizajniran da pruži veoma visok nivo apstrakcije. Zamršenost i detalji TCP/IP steka su skriveni od programera. Tipično, tipična klijentska sesija u Indyju izgleda ovako:
sa IndyClientom počnite
Host:= "zip.pbe.com"; // Host za poziv
Port:= 6000; // Port za pozivanje servera
Connect; Pokušajte
// Radite svoje stvari ovdje
konačno Disconnect; kraj;
kraj;
Pregled Indy servera
Komponente Indy servera kreiraju nit za slušanje koja je izolirana od glavne niti programskog koda. Nit za slušanje osluškuje dolazne zahtjeve klijenata. Za svakog klijenta na kojeg odgovori, kreira se nova nit koja služi klijentu. Odgovarajući događaji se tada servisiraju u kontekstu te niti.

Praktični primjeri
Sljedeći primjeri trebali bi vam pomoći da počnete s komponentama za jednostavan za korištenje, ali da bi se demonstrirali primjeri napravljeni kao jednostavne aplikacije. Neki projekti su napravljeni da pokažu različite situacije. Ovi primjeri su također dostupni za preuzimanje kao zip datoteke.
Napomena prevodioca: link na sajtu ne radi.
Primjer 1 - Verifikacija poštanskog broja
Prvi projekat je što je moguće jednostavniji. Pretraživanje po poštanskom broju, klijent pita server kojem gradu i državi pripada navedeni poštanski broj.
Za one koji žive izvan SAD-a i ne znaju što je poštanski broj, to je poštanski broj koji označava lokaciju isporuke. Poštanski brojevi se sastoje od 5 cifara.
Protokol
Prvi korak u izgradnji servera i klijenta je razvoj protokola. Za standardne protokole, ovo je definirano odgovarajućim RFC-om. Za poštanski broj, protokol je definiran u nastavku.
Većina komunikacionih protokola radi u tekstualni mod. Razmjena znači da se prenosi komanda, a kao odgovor, status i eventualno podaci. Protokoli nisu ograničeni na razmjenu, ali se i dalje koristi običan tekst. Protokol za određivanje poštanskog broja je također tekstualni. Običan tekst čini protokole lakim za otklanjanje grešaka i omogućava komunikaciju različitih programskih jezika i operativnih sistema.
Nakon povezivanja, server šalje pozdravnu poruku, a zatim prihvata naredbu. Ova naredba može biti "ZipCode x" (gdje je x poštanski broj) ili "Quit". Kao odgovor na naredbu ZipCode, šalje se odgovor u obliku jednog reda s odgovorom ili prazan red ako kod nije pronađen. Naredba Quit uzrokuje da server zatvori vezu. Server može prihvatiti nekoliko naredbi prije slanja naredbe Quit.
Izvorni kod servera

jedinica ServerMain;

interfejs

koristi

tip

TformMain = class(TForm)

IdTCPServer1: TIdTCPServer;

procedura FormCreate(Pošiljalac: TObject) ;

procedura FormDestroy(Pošiljalac: TObject) ;

procedura IdTCPServer1Connect(AThread: TIdPeerThread) ;

privatni

ZipCodeList: TStrings;

javnosti

kraj ;

FormMain: TformMain;

implementacija

(R*.DFM)

procedura TformMain.IdTCPServer1Connect (AThread: TIdPeerThread) ;

početi

AThread.Connection .WriteLn ("Indy poštanski server spreman.") ;

kraj ;

SCommand: string ;

početi

SCommand:= ReadLn ;

kraj ;

kraj ;

kraj ;

procedura TformMain.FormCreate (Pošiljalac: TObject ) ;

početi

ZipCodeList:= TStringList.Create ;

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

kraj ;

procedura TformMain.FormDestroy (Pošiljalac: TObject ) ;

početi

ZipCodeList.Free ;

kraj ;

kraj.

Jedini dijelovi koji su specifični za Indy u projektu su komponenta IdTCPServer1, metode IdTCPServer1Connect i IdTCPServer1Execute.
Obrazac sadrži komponentu IdTCPServer1 tipa TIdTCPServer. Sljedeća svojstva su promijenjena: ·Active = True - Nakon što se aplikacija pokrene, server sluša. ·DefaultPort = 6000 - Vrijednost porta za ovaj projekat. Server sluša zahtjeve klijenata na ovom portu.
Metoda IdTCPServer1Execute je povezana sa događajem OnExecute na serveru. Događaj OnExecute se pokreće nakon što se prihvati veza klijenta. Događaj OnExecute razlikuje se od drugih događaja koje poznajete. OnExecute se pokreće u kontekstu niti. Događaj niti se pokreće i daje se argument AThread proslijeđen metodi. Ovo je važno jer se više događaja OnExecute može izvršiti istovremeno. Ovo se radi kako bi server mogao raditi bez kreiranja nove komponente. Postoje i metode koje se mogu zaobići prilikom konstruisanja nasljednika.
Događaj OnConnect se pokreće nakon što je veza prihvaćena i za nju je kreirana nit. Na ovom serveru, ovo se koristi za slanje poruke dobrodošlice klijentu. Po želji, ovo se može uraditi iu događaju OnExecute.
Događaj OnExecute može se pokrenuti više puta dok se veza ne prekine ili izgubi. Ovo eliminiše potrebu za provjerom veze radi prekida veze ili gubitka u petlji unutar događaja.
IdTCPServer1Execute koristi dvije osnovne funkcije, ReadLn i WriteLn. ReadLn čita string iz veze, a WriteLn šalje string u vezu.
sCommand:= ReadLn;
Gornji kod preuzima string od klijenta i stavlja ga u lokalnu varijablu stringa sCommand.

ako je SameText (sCommand, "QUIT" ) onda počnite

završi u suprotnom ako SameText (Kopiraj (sCommand, 1, 8) , "ZipCode") zatim započne

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

kraj ;


Zatim se sCommand provjerava da li postoje važeće komande.
Ako je naredba "Prekini", vrši se prekid veze. Nakon prekida veze nije dozvoljeno čitanje ili pisanje. Nakon što se događaj završi, nit za slušanje ga više ne poziva, već briše nit i prekida vezu.
Ako je naredba "ZipCode", tada se parametar nakon naredbe izdvaja i tabela se skenira za prisustvo grada i države. Grad i država se zatim prosljeđuju klijentu ili se prosljeđuje prazan niz ako nema podudaranja.
Zatim, metoda izlazi. Server će ponovo pokrenuti događaj čim stigne nova komanda, omogućavajući klijentu da pošalje više komandi.
Izvorni kod klijenta

jedinica ClientMain;

interfejs

koristi

Windows, poruke, SysUtils, klase, grafika, kontrole, obrasci, dijalozi,

StdCtrls, ExtCtrls, IdAntiFreezeBase,

IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

tip

TformMain = class(TForm)

Klijent: TIdTCPClient;

IdAntiFreeze1: TIdAntiFreeze;

Panel1: TPanel;

Panel2: TPanel;

MemoInput: TMemo;

LboxResults: TListBox;

Panel3: TPanel;

Button1: TButton;

Button2: TButton;

Oznaka1: TLabel;

procedura Button2Click(Pošiljalac: TObject) ;

procedura Button1Click(Pošiljalac: TObject) ;

privatni

javnosti

kraj ;

FormMain: TformMain;

implementacija

(R*.DFM)

procedura TformMain.Button2Click (Pošiljalac: TObject ) ;

početi

MemoInput.Clear ;

LboxResults.Clear ;

kraj ;

procedura TformMain.Button1Click (Pošiljalac: TObject ) ;

I: cijeli broj ;

S: string ;

početi

ButnLookup.Enabled := true ; probaj

LboxResults.Clear ;

sa klijentom počnite

Connect; probaj

LboxResults.Items.Add(ReadLn);

za i:= 0 do memoInput.Lines .Count - 1 počinje

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

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

S:= ReadLn ;

ako je s = "" onda počnite

S:= "-- Nije pronađen unos za ovaj poštanski broj.";

kraj ;

LboxResults.Items.Add(s);

LboxResults.Items.Add("");

kraj ;

WriteLn("Prekini");

konačno Disconnect; kraj ;

kraj ;

konačno butnLookup.Enabled := true ; kraj ;

kraj ;

kraj.


Jedini dijelovi specifični za komponentu klijenta su Button1Click metoda.
Komponenta Klijent je tipa TIdTCPClient i postavljena je na obrazac. Sljedeća svojstva su promijenjena: ·Host = 127.0.0.1 - Server se nalazi na istoj mašini kao i klijent. ·Port = 6000 - Port servera
Metoda Button1Click je povezana sa događajem OnClick komponente Button1. Kada se klikne na dugme, poziva se ova metoda. Indy dio ove metode može se svesti na sljedeće: 1. Poveži se sa serverom (Connect;) 1. Pročitaj pozdrav sa servera. 1. Za svaki red koji je korisnik unio u TMemo: 1. Slanje zahtjeva serveru (WriteLn("ZipCode " + memoInput.Lines[i]);) 1. Čitanje odgovora sa servera (s:= ReadLn; ) 1. Slanje naredbe Quit (WriteLn("Quit");) 1.Disconnect (Disconnect;)
Testiranje
Ovaj primjer je testiran i radi sa instaliranim TCP/IP-om. Možete ga promijeniti tako da radi preko mreže s jednog računara na drugi. Pokretanjem servera na drugom računaru i promenom imena ili IP servera na klijentu.
Da biste testirali projekte, kompajlirajte i pokrenite server. Zatim kompajlirajte i pokrenite klijenta. Unesite poštanski broj u polje za bilješku i pritisnite tipku za traženje.
Otklanjanje grešaka
Tekstualni protokoli su vrlo laki za otklanjanje grešaka jer se mogu testirati pomoću Telneta. Da biste to učinili, dovoljno je znati port servera. Zip Code Lookup Server sluša na portu 6000.
Ponovo pokrenite server za traženje poštanskih brojeva. Zatim otvorite konzolu (npr. Dos prozor). Sada unesite:
telnet 127.0.0.1 6000
Sada ste povezani sa serverom. Neki serveri šalju i poruku dobrodošlice. Neki ne. Nećete vidjeti linije koje unosite. Većina servera ne eho radi uštede prometa. Međutim, možete promijeniti postavke telneta postavljanjem opcije "Echo On". To se radi drugačije u različitim telnet klijentima, a neki uopće nemaju ovu mogućnost. Sada unesite:
poštanski broj 37642
Vidjet ćete odgovor servera:
CHURCH HILL, TN
Da biste prekinuli vezu sa serverom, unesite:
quit
Primjer 2 - pristup bazi podataka
Ovaj primjer emulira poslužitelj koji mora obavljati zadatke blokiranja osim poziva utičnice. Mnogi serveri su primorani da rade u takvim uslovima. Serveri koji trebaju pristupiti bazi podataka, pozivaju eksterne procedure ili kalkulacije često ne mogu prekinuti ove pozive, jer su to eksterni pozivi ili zbog složenosti ovoga. Pristup bazi podataka ne može se razbiti na male komadiće i programer mora čekati završetak operacije s bazom podataka. Ovo je karakteristika ne samo poziva baze podataka, već i drugih operacija kao što su kompresija, proračuni i druga obrada iste vrste.
Za potrebe demonstracije, zamislimo da server obavlja poziv baze podataka za koji je potrebno 5 sekundi da se završi. Da pojednostavimo, učinimo ovo jednostavno uz pauzu, upotrijebimo funkciju Sleep(5000) za ovo, umjesto da zapravo zovemo.
Ovaj primjer također zahtijeva manje detalja od prethodnog jer mnogi koncepti još nisu shvaćeni.
Izvor

unit main;

interfejs

koristi

Windows, poruke, SysUtils, klase, grafika, kontrole, obrasci, dijalozi,

IdBaseComponent, IdComponent, IdTCPServer;

tip

TformMain = class(TForm)

IdTCPServer1: TIdTCPServer;

procedura IdTCPServer1Execute(AThread: TIdPeerThread) ;

privatni

javnosti

kraj ;

FormMain: TformMain;

implementacija

(R*.DFM)

procedura TformMain.IdTCPServer1Execute (AThread: TIdPeerThread) ;

I: cijeli broj ;

početi

sa AThread.Veza počinje

WriteLn("Zdravo. DB server spreman.") ;

I:= StrToIntDef(ReadLn, 0);

// Spavanje je zamijenjeno dugim DB ili drugim pozivom

Spavanje(5000);

WriteLn(IntToStr(i * 7));

kraj ;

kraj ;

kraj.

Budući da se događaj Execute javlja u kontekstu niti, kod za obradu može biti bilo koje dužine. Svaki klijent ima svoju nit i ne blokira druge klijente.
Testiranje
Da biste testirali DB server, kompajlirajte i pokrenite ga. Povežite se na njega koristeći Telnet na port 6001. Server će odgovoriti porukom dobrodošlice. Unesite broj. Server će "obraditi" vaš zahtjev i odgovoriti u roku od 5 sekundi.

UDP protokol je prilično dobar za prijenos tekstualnih poruka, odnosno možete organizirati lokalne razgovore i slično. Odlučio sam dati primjer najjednostavnijeg rada sa UDP-om u Delphiju.

Korak po korak instrukcije:

Dao sam primjer, ali oprostite, nisam zapisivao svaki red, jer... Ne vidim ništa komplikovano i svako to može da shvati.

Zapravo, ako nešto nije jasno, možete mi postaviti pitanje. A evo stvarnog koda:

koristi
Windows, poruke, SysUtils, varijante, klase, grafika, kontrole, obrasci,
Dijalozi, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

tip
TForm1 = klasa(TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Button1: TButton;
Oznaka1: TLabel;
procedura FormCreate(Pošiljalac: TObject);
procedura FormClose(Pošiljalac: TObject; var Akcija: TCloseAction);
procedura Button1Click(Pošiljalac: TObject);
procedura IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
privatni
(privatne izjave)
javnosti
(Javne izjave)
kraj;

var
Form1: TForm1;

($R *.dfm)
[b]//Procedura za slanje poruke
procedura TForm1.Button1Click(Pošiljalac: TObject);
početi
probaj
IdUDPClient1.Active:= Tačno;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
ako je IdUDPClient1.Povezan tada
početi
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
kraj;
IdUDPClient1.Active:= False;
Beep;Beep;Beep;
osim
MessageDlg("Nešto je pošlo po zlu =(", mtError, , 0);
kraj;
kraj;
[b]
//Uključeno isključeno. UDP server prilikom pokretanja i zatvaranja obrasca
procedura TForm1.FormClose(Pošiljalac: TObject; var Akcija: TCloseAction);
početi
IdUDPServer1.Active:= False;
kraj;

procedura TForm1.FormCreate(Pošiljalac: TObject);
početi
IdUDPServer1.Active:= Tačno;
kraj;

[b]//Procedura reakcije servera prilikom prijema podataka
procedura TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AD podaci: TBytes; ABinding: TIdSocketHandle);
Var
i:Integer;
s:String;
početi
s:= "";
probaj
i:= 0;
dok (AData[i] 0) radi
početi
s:= s + chr(AData[i]);
i:= i + 1;
kraj;
konačno
Label1.Caption:= s;
kraj;
kraj;