Uvod u Indy. Razvoj klijent-poslužitelj aplikacija pomoću Indyja u Delphiju

Indy komponente korištene u Delphiju 6.

Uz osnovne internetske usluge i protokole, postoji širok raspon dodatnih usluga, čije mogućnosti često koriste internetski programeri. Osim toga, mogućnost prikaza informacija pomoću preglednika nije uvijek prihvatljivo rješenje za internetske aplikacije. U tom slučaju razumno je koristiti internetsku infrastrukturu za razmjenu podataka, te osigurati prikaz informacija kroz složenije klijentske aplikacije razvijene, primjerice, u Delphiju.

Recimo da trebate implementirati specijaliziranu poslužiteljsku logiku koja nije uključena u standardne web poslužitelje. Za rješavanje ove klase problema, Delphi uključuje biblioteku Internet Direct (Indy) tvrtke 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 nova verzija Delphi. Skup komponenti podijeljen je u tri skupine: klijent (Indy Client), poslužitelj (Indy Servers) i pomoćni (Indy Misc).

Indy klijenti i Indy poslužitelj s

Većina komponenata Indy Client i Indy Servers su parovi koji odgovaraju klijentskim i poslužiteljskim dijelovima protokola i usluga (s izuzetkom određenih, uglavnom poslužiteljskih, komponenti kao što su TunnelMaster i TunnelSlave), i dopuštaju korištenje protokola kao što je TCP/IP , UDP, NNTP, SMTP, FTP, HTTP, kao i usluge ECHO, FINGER, WHOIS itd.

Komponente Indy klijenta napisane su pomoću utičnica. Utičnica na strani klijenta zahtijeva vezu s poslužiteljem. Ako je veza uspostavljena, klijent i poslužitelj mogu započeti razmjenu poruka. Te su poruke drugačije prirode, ali obično se razmjena odvija pomoću 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 također su i osnovne klase za komponente TIdSMTP i TIdFTP. Klasa TIdTCPServer ima svojstvo ThreadMgr koje je zadano postavljeno na nulu. Ako je ThreadMgr nula kada je TIdTCPServer omogućen, klasa TIdThreadMgrDeafault bit će kreirana implicitno. Inače se koristi instalirani upravitelj procesa.

TIdUDPClijent i TIdUDPServer

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

TIdChargenServer

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

TIdDayTime i TIdDayTimeServer

Komponente se koriste za pružanje vremenske usluge. Klijent zahtijeva, a poslužitelj javlja trenutni datum i vrijeme.

Razrješavač TIdDNSR

Ovo je klijentska komponenta koja poslužuje zahtjeve s DNS (Domain Name Service) poslužitelja. Upiti DNS poslužitelja dizajnirani su da zamijene ime računala njegovom IP adresom. TIdDNSResolver je potomak klase TIdUDPClient.

TIdDICTServer

Komponenta poslužitelja koja podržava Dictionary Server Protocol (DICT), rječnik na strani poslužitelja temeljen na TCP protokolu koji klijentu omogućuje pristup rječniku prirodnog jezika.

TIdDISCARDServer

Komponenta poslužitelja koja podržava poslužitelj zapisa. Snimke se mogu koristiti kao alat za otklanjanje pogrešaka i mjerenje. Evidenciona služba jednostavno preda sve podatke onome tko ih želi primiti.

TI dEcho i TI dECHOServer

Komponente su dizajnirane za pružanje usluge odgovora, koja se obično koristi za provjeru ispravnosti mreže. Klijent šalje tekstualnu poruku poslužitelju, poslužitelj vraća poruku klijentu. Ako je poruka iskrivljena, mreža ne radi ispravno.

TIdFinger i TIdFingerServer

Komponente su dizajnirane za pružanje protokola koji korisniku omogućuje postavljanje upita o podacima o prisutnosti drugih korisnika u sustavu. Neki poslužitelji obrađuju takve zahtjeve klijenata. Korištenje ovog para komponenti omogućit će vam servisiranje zahtjeva klijenata koji određuju prisutnost drugih korisnika u sustavu.

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 za rad koristi klasu TIdSimpleServer. Kada je prijenos FTP datoteke u tijeku, otvara se sekundarna TCP veza za prijenos podataka i zatvara se nakon prijenosa podataka. Ova se veza naziva "podatkovna veza", jedinstvena za svaku datoteku koja se prenosi.

TIdGopher i TIdGopherServer

Ove komponente dizajnirane su za pružanje mrežnog protokola koji je zamijenjen u U zadnje vrijeme sa WWW (Svijet Wide Web) HTTP protokol. Poslužitelj koji implementira ovaj protokol pruža hijerarhijski distribuirani sustav podrške protoku dokumenata. Primjer upotrebe ovog para komponenti, koji se nalazi u direktoriju demosindyGopherClient i demosindy 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čunalu, uključujući one zatvorene.

TIdHostNameServer

Komponenta poslužitelja dizajnirana za prosljeđivanje naziva lokalnog poslužitelja klijentima.

TIdHTTP i TIdHTTPServer

Komponente se koriste za pružanje HTTP mrežnog protokola (podržane su verzije 1.0 i 1.1, uključujući operacije GET, POST i HEAD). Osim toga, omogućena je podrška za autentifikaciju i korištenje proxy poslužitelja. Komponenta poslužitelja koristi se za pružanje usluga drugom web poslužitelju koji podržava određeni protokol. TIdHTTPServer olakšava implementaciju funkcija kao što su kolačići, upravljanje stanjem itd.

TIdIcmpClient

Klijentska komponenta dizajnirana za pružanje Internet Control Message Protocol (ICMP), koji se koristi za izvođenje ping operacija i mrežnog praćenja.

Klijentska komponenta dizajnirana za pružanje protokola poštanskog ureda (POP), uključujući podršku za MIME kodiranje i dekodiranje i prijenos višebajtnih znakova.

TIdIMAP4Server

Komponenta poslužitelja dizajnirana za podršku IMAP (Internet Message Access Protocol) operacija na poslužitelju. Protokol vam omogućuje pretraživanje poruka E-mail na poslužitelju. Razlika između IMAP i POP protokola je u tome što POP protokol zahtijeva dodatna memorija za pohranu podataka, a IMAP protokol pristupa poslužitelju umjesto klijentskom stroju. IMAP4 je stvoren da zamijeni POP3, ali POP3 je do danas široko korišten standard.

TIdIRCServer

Komponenta poslužitelja dizajnirana za podršku najčešće korištenim uslugama na Internetu, koje se obično nazivaju chat. Komponenta pruža osnovne građevni blokovi za IRC (Internet Relay Chat) poslužitelj.

TIdMappedPortTCP

Komponenta poslužitelja dizajnirana za stvaranje mapiranih priključaka koji se često koriste u proxy poslužiteljima. Metode ove komponente omogućuju vam mapiranje jednog porta u drugi. Na primjer, port 80 mogao bi se preslikati na port 3000, a svi zahtjevi prema prvom portu (port 80) bili bi proslijeđeni na drugi port (port 3000).

TIdNNTP i TIdNNTPServer

Ove su komponente potrebne za podršku mrežnog protokola za prijenos 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. Komponenta poslužitelja omogućuje vam stvaranje poslužitelja vijesti. Važno je napomenuti da TIdNNTPServer nije poslužitelj za vijesti sa svim značajkama, već komponenta koja pruža osnovnu funkcionalnost za takav poslužitelj.

TIdQOTD i TIdQOTDServer

Komponente se koriste za pružanje usluge Quote of the Day. Komponenta klijenta povezuje se s instancom komponente poslužitelja kako bi dobila dnevnu ponudu. Svaka instanca poslužitelja sadrži jedinstvenu bazu podataka citata.

Klijentska komponenta dizajnirana za korištenje u aplikacijama Simple Mail Transfer Protocol (SMTP), pruža podršku za provjeru autentičnosti, MIME kodiranje i dekodiranje i podršku za višebajtne znakove.

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

TIdSimpleServer

Komponenta poslužitelja koja pruža lagani TCP poslužitelj. Omogućuje organiziranje veze od točke do točke. Koristi se za kreiranje poslužitelja s jednim korisnikom, odnosno može opsluživati ​​samo jednu vezu u isto vrijeme. Za razliku od komponente TIdTCPServer, ona ne pokreće sekundarne procese kada čeka zahtjeve od klijenata i kada obrađuje te zahtjeve. Drugim riječima, ako poslužitelj poslužuje zahtjev klijenta, au tom trenutku ga drugi klijent kontaktira radi povezivanja, tada će biti blokiran do kraja obrade prvog zahtjeva.

TIdTelnet i TIdTelnetServer

Komponenta klijenta koristi se za organiziranje udaljenih sesija na drugom računalu, uključujući pregovore konzole i autentifikaciju. Komunikacijski protokol pretpostavlja prisutnost osobe koja interaktivno komunicira s poslužiteljem. Klijentska komponenta nema podršku za prikaz ili emulaciju terminala, već jednostavno omogućuje vezu sa poslužiteljskim dijelom. Obično se poslužiteljski protokol TIdTelnetServer koristi za organiziranje udaljenih baza podataka s tekstualnim sučeljem za interaktivnu interakciju s klijentima.

TIdTime i TIdTimeServer

Klijentska komponenta je alternativa TIdSNTP komponenti za određivanje vremena. Važno je napomenuti da su formati dvaju protokola različiti. TIdTime se temelji na RFC 868 formatu (vraća vrijeme u internom UNIX OS standardu, izvodeći sve potrebne konverzije). Komponenta poslužitelja slična je u funkcioniranju poslužitelju DayTime. Može se koristiti za implementaciju vremenske usluge lokalno računalo. Nije potreban nikakav dodatni kod, samo kreirajte instancu TIdTimeServera koja će vratiti vrijeme unutarnjeg sata poslužiteljskog računala.

TIdTrivialFTP i TIdTrivialFTPServer

Ove komponente su potrebne za organiziranje jednostavnog protokola za prijenos datoteka. Klijentska komponenta ovog protokola koristi se za povezivanje s instancom odgovarajuće poslužiteljske komponente. Protokol je namijenjen privatnim, lakim, lokalnim slučajevima prijenosa datoteka, na primjer u lokalnim mrežama ili za učitavanje (učitavanje) tablica usmjeravanja u usmjerivače. Zbog oslabljenih karakteristika ovog protokola, njegova uporaba 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 poslužiteljskog tunela koriste se u proxy poslužiteljima za organiziranje više logičkih veza preko jednog fizičkog (tunela). Ove se klase mogu koristiti u razne svrhe, na primjer, za organiziranje tajne veze preko netajnih kanala.

TIdWhois i TIdWhoIsServer

Ova klijentska komponenta povezuje se s bilo kojim standardnim Whois poslužiteljem, omogućujući vam dobivanje informacija o domenama. Komponenta poslužitelja pruža osnovnu funkcionalnost NIC poslužitelja.

Indy Ostalo

Stranica palete Indy Miscellaneous Components uključuje BASE64, UUE, Quoted Printable i druge uobičajene komunikacijske formate e-pošte, kodere (MD2, MD4 i MD5) za kriptografske standarde koji se koriste za pohranjivanje lozinki i elektronički potpisi u nepovratnom (teškom za dešifriranje) obliku, kao i mnoge druge korisne komponente i pomoćne programe koji se često koriste u razvoju internetskih aplikacija.

TIdAntiFreeze

Zbog algoritama Indy komponenti koji se temelje na blokovima, često se čini da je aplikacija zapela dok veza radi. Da biste eliminirali korištenje sekundarnih procesa (dretvi) pri organiziranju komunikacije kako biste spriječili zamrzavanje aplikacije, dovoljno je postaviti navedenu komponentu na obrazac.

Komponenta radi tako da analizira zahtjeve iz TCP/IP protokola i šalje poruke aplikaciji tijekom odgode kada su vanjske 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. 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. U određenoj mjeri, to se može kontrolirati putem svojstava klase TIdAntiFreeze. Korištenje ove komponente nije obavezno, ali vam omogućuje da riješite problem sinkronizacije veza s vizualnim sučeljem aplikacije.

TIdDateTimeStamp

Klasa za izvođenje matematike datuma i vremena povezana s činjenicom da internetski protokoli koriste različite formate datuma i vremena; osim toga, klijenti i poslužitelji mogu se nalaziti u različitim vremenskim zonama.

TIdIPWatch

To je komponenta temeljena na mjeraču vremena koja stalno prati promjene u IP adresi računala. Događaji komponente događaju se kada se otkrije promjena. Ova se komponenta obično koristi za otkrivanje je li računalo spojeno 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) poslužitelj prilikom spajanja na novu mrežu.

TIdLogDebug

Svrha ove komponente je presretanje događaja bilo koje klijentske ili poslužiteljske komponente i postavljanje zapisa događaja u njih navedena datoteka. Ova je komponenta vrlo korisna za otklanjanje pogrešaka u Indy komponentama.

TIdMessage

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

TIdNetworkCalculator

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

TIdThreadMgrDefault

Komponenta prema zadanim postavkama osigurava kontrolu sekundarnih procesa. Stvara 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 stvaranje 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 elektronički ekvivalent posjetnice i može sadržavati vlasnikove osobne podatke i grafičke podatke.

TIdIMFDekoder

Dizajniran za dekodiranje internetskih poruka. Potomak je klase TIdCoder, baš kao i sve ostale komponente kodera. Klasa TIdCoder dekodira prema ARPA standardu formata internetske tekstualne poruke RFS-822, predloženom u kolovozu 1982., i USENET standardu za slanje poruka RFC 1036, predloženom u prosincu 1987.

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

TIdQuotedPrintableEncoder

QuotedPrintableEncoder vam omogućuje dešifriranje teksta u navedenom formatu. Može služiti kao samostalna komponenta s određenom vrstom kodiranja, omogućujući prijenos poruka koje sadrže novu vrstu kodiranja.

TIdBase64Encoder

Implementira još jedan algoritam šifriranja koji omogućuje prijenos znakova koji se ne mogu ispisati.

TIdUUEncoder

Implementira jedan od prvih algoritama šifriranja, UU kodiranje. Ponekad se koristi prilikom slanja članaka novinskoj službi.

TIdXXEncoder

Malo je vjerojatno da će se ova metoda šifriranja ikada koristiti. U biti, ovo je isto UU kodiranje, ali s drugačijom tablicom šifriranja.

TIdCoderMD2

Komponente s različitim vrstama algoritama šifriranja MD (Message Digest). Svi se temelje na slučajnom premještanju, jednosmjerni su i nemaju algoritme za dešifriranje.

Komponente klijenata protokola i poslužitelja mogu se koristiti za razvoj poslužiteljskih i klijentskih Internet aplikacija, zajedno sa ili umjesto osnovnih (ClientSocket, ServerSocket) i ostalih komponenti iz Internet i Fastnet palete. Indy komponente ne koriste WebBroker arhitekturu, implementirajući podršku niske razine za internetske protokole i usluge izravno u svom izvornom kodu (izvorni kodovi su uključeni).

TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL

SSL protokol - Secure Sockets Layer, koji osigurava tajnost i pouzdanost komunikacije između dvije aplikacije, ima dva sloja. Na niskoj razini višeslojnog transportnog protokola (kao što je TCP), SSL je protokol za snimanje i koristi se za kapsuliranje raznih protokola više razine. Prednost SSL-a je u tome što je to neovisni aplikacijski protokol, ali se povrh SSL-a može koristiti protokol više razine.

SSL pruža komunikacijsku sigurnost, koja ima tri glavne funkcije: pružanje povjerljive veze; šifriranje sa javni ključ(koristi se za potvrdu autentičnosti primatelja); podrška za pouzdanost prijenosa podataka.

  • Simetrična kriptografija se koristi za šifriranje podataka (npr. DES, RC4, itd.).
  • Digitalni potpis pruža se korištenjem asimetrične enkripcije s javnim ključem (na primjer, RSA, DSS itd.).
  • Pouzdanost komunikacije, prijenos poruka uključuje provjeru integriteta poruke putem MAC kodova za korekciju, sigurnih hash funkcija (npr. SHA, MD5, itd.) korištenjem MAC izračuna.

U kombinaciji s HTTP-om i autentifikacijom poslužitelja, SSL pruža potrebne funkcije enkripciju i dalje održava uspostavljenu vezu, dvostruku provjeru autentičnosti web poslužitelja i sl. Važno je razumjeti da SSL štiti samo komunikaciju tijekom prijenosa podataka i ne zamjenjuje druge sigurnosne mehanizme.

Komponente TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL pružaju veze i na strani klijenta i na strani poslužitelja 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 implementacije sustava Windows temelji na funkcijama operativnog sustava.

Primjeri korištenja Indy komponenti mogu se pronaći u direktorijima /Delphi6/Demos/Indy. Ukupno, biblioteka Indy u verziji 8.0 sadrži 69 komponenti. Navedeno je 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ćuje da se koriste za razvoj višeplatformskih aplikacija. Sve Indy komponente podržavaju višenitnost.

Indy komponente implementiraju gotovo sve funkcionalnosti koje se nalaze u Internet i Fastnet komponentama, kao što je jasno prikazano u tablici.

Brze komponente Indy komponente Namjena komponenti
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Interakcija između dva računala (klijenta i poslužitelja) pomoću TCP/IP protokola
2 TNMDayTime TIdDayTime, TIdDayTimeServer Upitajte poslužitelj za trenutno vrijeme
3 TNMEcho TIdEcho, TIdEchoServer Koristi se za komunikaciju s poslužiteljem odgovora
4 TNMFinger TIdFinger, TIdFingerServer Koristi se za dobivanje informacija o korisniku s internetskog poslužitelja za pretraživanje
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Omogućite prijenos datoteka pomoću FTP protokola
6 TNMHTTP TIdHTTP, TIdHTTPServer Koristite HTTP protokol za razmjenu podataka
7 TNMMsgServ, TNMMsg Koristi se za prenošenje jednostavnog tekstualne poruke od klijenta do poslužitelja
8 TNMNNTP TIdNNTP, TIdNNTPServer Podržava razmjenu podataka s poslužiteljem vijesti
9 TNMPOP3 TIdPOP3 Koristi se za primanje e-pošte s poslužitelja e-pošte pomoću POP3 protokola
10 TNMSMTP TIdSMTP Koristi se za slanje e-pošte putem poslužitelj pošte Internet
11 TNMStrm, TNMStrmServ Prenosi binarne podatke zapisane u tok pomoću TCP/IP protokola
12 TNMUDP TIdUDP, TIdUDPServer Prijenos podataka pomoću UDP protokola
13 TpowerSock, TNMGeneralServer Klase enkapsulirane komponentama koje su osnova za pisanje vlastitih klijenata (Powersock) i poslužitelja (NMGeneralServer)
14 TNMUUProcesor TIdUUEncoder, TIdUUDecoder Provedite rekodiranje binarne datoteke u MIME ili UUENCODE format
15 TNMURL Pretvara nizove u HTML format i izvodi obrnutu konverziju

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

No, 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 tablice, glavne protokole i usluge ne pružaju samo klijentske, već i komponente poslužitelja. To su vremenske usluge, usluge odgovora, dobivanje korisničkih informacija, kao i HTTP, NNTP, UDP protokoli pa čak i najjednostavnija verzija FTP-a.

Neki primjeri korištenja Indy komponenti

U komponentama Indy sadržanim u Delphiju, IP adresa definirana je u svojstvu Host, obično samo u klijentskim aplikacijama. Komponente hostirane na poslužitelju imaju metode koje vam omogućuju da pokrenete ili zaustavite ispitivanje odgovarajućeg priključka - na primjer, promjena svojstva Active komponente IdTCPServer pokreće ili zaustavlja ispitivanje odgovarajućeg priključka. Nakon što se uspostavi veza između klijenta i poslužitelja, prijenos podataka može započeti.

Indy komponente stavljaju veliki naglasak na sigurnost i pouzdanost pri radu s podacima. Na primjer, komponenta IdTCPClient ima metode Connect i Disconnect. Korištenje tehnike programiranja poput donjeg koda sa strane klijenta:

S TCPClientom započnite povezivanje; pokušajte lstMain.Items.Add(ReadLn); napokon Isključi; kraj; kraj;

i koristeći svojstvo Connection proslijeđeno kao parametar AThread instanci klase TIdPeerThread sa strane poslužitelja:

Uz AThread.Connection započnite WriteLn("Pozdrav s poslužitelja Basic Indy Server."); Odspojiti se; kraj;

možete računati ili na normalno izvođenje veze ili na ispravno rukovanje pogreškama.

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

Baš kao i komponente Fastneta, klase komponenti Indy imaju događaje koji se mogu koristiti za upravljanje događajima. Na primjer, možete urediti da se poruka prikazuje na obrascu prilikom povezivanja s klijentom:

Procedura TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Posluživanje klijenta ]"; kraj;

Indy pruža komponente koje implementiraju protokole s klijentskim i poslužiteljskim dijelovima 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 poslužitelja, pomažu u pregledu datoteka različite vrste, uključujući one označene kao skrivene, kao i direktorije na udaljeno računalo(slično onome što naredba dir *.* radi u operacijski sustav MS-DOS).

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) zadužena je za generiranje poruke, što slijedi iz njenog naziva, a IdSMTP je za organizaciju veze s mail serverom.

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

  • zatražite vezu s poslužiteljem;
  • postavljati zahtjeve za čitanje i pisanje poslužitelju (ovisno o vrsti poslužitelja, korak se izvodi jednom ili ponavlja mnogo puta);
  • prekinuti vezu s poslužiteljem i prekinuti vezu.

Indy komponente dizajnirane su za pružanje ultra-visoke razine apstrakcije. Zamršenost i detalji TCP/IP skupa skriveni su od programera kako bi se on mogao usredotočiti na zadatak koji mu treba.

Sljedeći mali primjer prikazuje tipičnu klijentsku bean sesiju:

Uz IndyClient do begin Host:= "zip.pbe.com"; // Domaćin za poziv Port:= 6000; // Port za pozivanje poslužitelja na Connect; pokušajte // Vaš kod ide ovdje konačno Odspojite se; kraj; kraj;

U primjeru, čak i ako veza s poslužiteljem nije uspostavljena, veza će biti elegantno prekinuta zbog upotrebe naredbe try-finally.

Komponente poslužitelja Indy opisuju različite modele poslužitelja koji se mogu koristiti ovisno o vašim potrebama i protokolu koji koristite.

TIdTCPServer je najčešće korištena poslužiteljska komponenta koja stvara sekundarni proces neovisan o glavnom aplikacijskom procesu. Stvoreni proces čeka dolazne zahtjeve od potencijalni klijenti. Individualni sekundarni proces kreira se za svakog klijenta na čiji zahtjev odgovara. Događaji koji se događaju tijekom procesa održavanja povezani su s kontekstom odgovarajućih procesa.

Drugim riječima, za svaku vezu klijenta, klasa TIdTCPServer koristi jedinstvenu sekundarnu nit pozivanjem rukovatelja događajem 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 je instanca kreirana 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 s poslužiteljem (svaki poslani paket je neovisni skup podataka, a ne dio 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, stvara se nit za slušanje dolaznih UDP paketa. Za svaki primljeni paket pokreće se događaj OnUDPRead ili na glavnoj niti ili u kontekstu niti koja sluša, ovisno o vrijednosti svojstva ThreadedEvent. Kada ThreadedEvent ima vrijednost False, događaj se događa u glavnoj niti, inače se događa u niti koja sluša. Dok se događaj obrađuje, druge operacije poslužitelja su blokirane. Stoga je važno osigurati da se procedure OnUDPRead izvode što je brže moguće.

Ako trebate kreirati novu klijentsku aplikaciju za postojeći poslužitelj koristeći postojeći protokol, vaš je posao isključivo razviti i otkloniti pogreške klijentske aplikacije. Međutim, kada moramo razvijati i klijentske i poslužiteljske aplikacije koristeći postojeći ili novi protokol, suočavamo se s klasičnim problemom "kokoš i jaje". Gdje početi programirati - od klijenta ili od poslužitelja?

Očito, i klijent i poslužitelj moraju biti stvoreni na kraju. Za mnoge aplikacije, posebno one koje koriste tekstualni protokol (kao što je HTTP), lakše je započeti s izgradnjom aplikacije projektiranjem poslužitelja. A za otklanjanje pogrešaka postoji prikladan klijent koji već postoji. Ovo je Telnet konzolna aplikacija koja je dostupna na Windowsima i UNIX-u.

Ako upišete konzolu telnet naredba 127.0.0.1 80 s IP adresom lokalnog računala i brojem priključka 80, koji prema zadanim postavkama koriste web poslužitelji, tada će aplikacija odgovoriti s tekstom prikazanim na sl. 6, u slučaju Windows 2000 OS i IIS 5.0.

Za izradu najjednostavnijeg poslužitelja pomoću Indy komponenti potrebno vam je:

Ako trebate dizajnirati poslužitelj koji ne samo da će ispravno obavijestiti svoje klijente kada se veza izgubi, već im također pružiti informacije o situacijama grešaka 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: niz; započeti s AThread.Connection do try try s:= ReadLn; // Izvršite zadatak poslužitelja ovdje // ako se ne pokrene iznimka, // ispišite odgovor poslužitelja WriteLn(s); osim na e: Exception do begin WriteLn(e.Message); end; //on end; //pokušaj osim na kraju Prekini;kraj;kraj;

Ovaj mali primjer pokazuje korake za stvaranje jednostavnog tekstualnog poslužitelja, kao i kako ga otkloniti.

Gore opisani poslužitelj je tipičan primjer organizacije modernog distribuiranog računarstva.

Značajke kreiranja višeslojnih aplikacija

U posljednje vrijeme višestruki poslužitelji se sve više koriste za zadovoljenje zahtjeva klijenata. Poslužitelj ove vrste, nakon što je primio zahtjev klijenta i djelomično ga pripremio za daljnju obradu, kontaktira drugi poslužitelj i šalje mu transformirani zahtjev ili zahtjeve. Poslužitelj drugog reda može zauzvrat komunicirati s drugim poslužiteljima. Dakle, možemo govoriti o višeslojnoj arhitekturi poslužitelja.

Zatim ćemo kreirati poslužitelj za pristup podacima čija je svrha vraćanje podataka iz baze podataka. Ovaj poslužitelj, međutim, ne čita niti piše izravno u datoteke baze podataka. Umjesto toga, komunicira s poslužiteljem baze podataka u potrazi za podacima koje zahtijeva klijent.

Dakle, počinjemo razvijati aplikaciju s troslojnom arhitekturom. Za izradu poslužitelja baze podataka koristeći Indy komponente potrebno vam je:

  1. Napravite novi projekt.
  2. Stavite na glavni oblik projektirajte instancu komponente TIdTCPServer iz palete Indy Servers.
  3. Postavite svojstvo DefaultPort instance klase TIdTCPServer1 na 6001 (preporučuje se dodjeljivanje velikih vrijednosti kako bi se izbjeglo dupliciranje brojeva portova u različitim aplikacijama), a svojstvo Active postavite na true.
  4. Dodajte novi modul u projekt odabirom File | Novo | Data Module i na njega postavite instance komponenti SQLConnection i SQLDataSet s kartice dbExpress na paleti komponenti.
  5. Postavite svojstvo ConnectionName klase SQLConnection na IBLocal i LoginPrompt na False. Ako niste konfigurirali IBLocal na Emploee.gdb bazi podataka, prvo dovršite ovaj postupak.

Uvod u Indy

Uvod u Indy
Objavio Chad Z. Hower
Početna stranica: http://www.atozedsoftware.com
Prijevod: Anatolij Podgorecki
Uvod
Napisao sam ovaj članak kada Trenutna verzija bio je Indy 8.0. Velik dio ovog članka primjenjiv je i vrlo koristan u budućim verzijama Indyja. Ako vam se svidio ovaj članak i želite č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 čitanju i pisanju datoteke. Prilikom čitanja ili pisanja podataka, funkcija ne vraća kontrolu dok operacija nije dovršena. Razlika u odnosu na rad s datotekama je u tome što poziv može trajati duže, budući da traženi podaci još ne postoje, to ovisi o brzini kojom radi vaša mreža ili modem.
Na primjer, metoda se jednostavno pozove 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 pogreške, pokrenut će se iznimka.
Zaključavanje nije fatalno
Zbog načina blokiranja protivnici su nas mnogo puta pobijedili, ali način blokiranja nije vrag.
Problem se pojavio nakon prijenosa Winsocka na Windows. U Unixu se problem obično rješavao račvanjem (slično multi-threadingu, ali s odvojenim procesima umjesto niti). Unix klijenti i demoni morali su račvati procese koji bi trebali biti pokrenuti i koristiti način blokiranja. Windows 3.x nije se mogao paralelizirati i nije podržavao puno niti. Upotreba blokirajućeg sučelja zamrznula je korisničko sučelje i onesposobila programe. Stoga su WinSocku dodani neblokirajući načini rada, omogućujući sustavu Windows 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 strastveno su ocrnjivali načine blokiranja kako bi prikrili nedostatke Windowsa 3.x.
Zatim je došao Win32, koji je mogao podržavati višenitnost. Ali u to su vrijeme njihovi mozgovi već bili zbrkani (odnosno, programeri su blokiranje utičnica smatrali stvaranjem vraga) i već je bilo teško promijeniti ono što su učinili. Stoga se nastavlja blaćenje blokirajućih režima.
U stvarnosti, Unix ima samo blokirajuće utičnice. Blokirajuće utičnice također imaju svoje prednosti i puno su bolje za višenitnost, sigurnost i druge aspekte. Neka proširenja su dodana Unixu za neblokirajuće utičnice. Međutim, oni rade sasvim drugačije nego na Windowsima. Oni su također nestandardni i nisu baš uobičajeni. Blokirajuće utičnice u Unixu koriste se u gotovo svim slučajevima i nastavit će se koristiti.
Prednosti načina blokiranja · Lakše programiranje - Načine blokiranja lakše je programirati. Sav korisnički kod može biti na jednom mjestu i izvršavati se prirodnim, sekvencijalnim redoslijedom. · Lakši prijenos na Unix - Budući da Unix koristi blokirajuće utičnice, prijenosni kod je lakše napisati u ovom slučaju. Indy koristi ovu činjenicu za pisanje jedinstvenog koda. ·Prikladnije je raditi s nitima - Budući da blokirajuće utičnice imaju niz stečen nasljeđem, vrlo su jednostavne za korištenje u nitima.
Nedostaci načina blokiranja · Korisničko sučelje se smrzava u klijentima - Poziv blokirajuće utičnice ne vraća kontrolu dok ne izvrši svoj zadatak. Kada se takav poziv izvrši na glavnoj niti aplikacije, aplikacija ne može obraditi korisničke poruke. Zbog toga se korisničko sučelje zamrzava, prozori se ne osvježavaju i druge poruke se ne obrađuju sve dok se kontrola ne vrati iz utičnice za blokiranje.
TIdAntiFreeze komponenta
Indy ima posebnu komponentu koja rješava problem smrzavanja korisničko sučelje. Jednostavno dodajte jednu komponentu TIdAntiFreeze bilo gdje u svojoj aplikaciji i moći ćete blokirati pozive bez zamrzavanja korisničkog sučelja.
TIdAntiFreeze radi na internom mjeraču vremena izvan hrpe poziva i poziva Application.ProcessMessages kada istekne vremensko ograničenje. Vanjski pozivi Indyju i dalje blokiraju i stoga rade potpuno isto kao i bez upotrebe komponente TIdAntiFreeze. Korištenje TIdAntiFreeze omogućuje vam da dobijete sve prednosti blokiranja utičnica, bez ikakvih nedostataka.
Niti koda (Threading)
Kod blokirajućih utičnica gotovo se uvijek koriste tokovi koda. Neblokirajuće utičnice također mogu koristiti niti, ali to zahtijeva neke dodatna obrada a njihove se prednosti u ovom slučaju gube u usporedbi s blokirajućim utičnicama.
Prednosti niti · Postavljanje prioriteta - Prioriteti pojedinačnih niti mogu se konfigurirati. To omogućuje da se pojedinačnim zadacima dodijeli više ili manje CPU vremena. · Enkapsulacija - Svaka veza može sadržavati neki privid sučelja s drugom vezom. ·Sigurnost - Svaka nit može imati različite sigurnosne atribute. ·Više procesora - daje prednost na sustavima s više procesora. ·Nema potrebe za serijalizacijom - pruža potpunu konkurentnost. Bez mnogo niti, svi zahtjevi moraju biti obrađeni u jednoj niti. Stoga se svaki zadatak mora rastaviti na male dijelove kako bi mogao brzo raditi. Dok jedan blok radi, svi ostali su prisiljeni čekati da završi. Na kraju jednog bloka, izvršava se sljedeći i tako dalje. Uz multithreading, svaki se zadatak može programirati kao jedna cjelina, a operativni sustav raspodjeljuje vrijeme među svim zadacima.
Teme anketa
Stvaranje i uništavanje niti zahtijeva mnogo resursa. Ovo je posebno težak zadatak za poslužitelje koji imaju kratkotrajne veze. Svaki poslužitelj stvara nit, koristi je kratko vrijeme, a zatim je uništava. To rezultira vrlo čestim stvaranjem i brisanjem niti. Primjer za to je web poslužitelj. Šalje se jedan zahtjev i vraća se jednostavan odgovor. Kada koristite preglednik, mogu se pojaviti stotine povezivanja i prekida veze prilikom pregledavanja bilo koje web stranice.
Anketne niti mogu ispraviti ovu situaciju. Umjesto stvaranja i uništavanja niti na zahtjev, niti se biraju s popisa nekorištenih, ali već stvorenih niti iz skupa. Kada nit više nije potrebna, vraća se u skup umjesto da se uništava. Niti u skupu su označene kao neiskorištene i stoga ne troše CPU vrijeme. Za još veće poboljšanje, niti se mogu dinamički prilagođavati trenutnim potrebama sustava.
Indy podržava ispitivanje niti. Skup niti u Indyju dostupan je putem komponente TIdThreadMgrPool.
Puno niti
Jako opterećen poslužitelj može zahtijevati stotine ili čak tisuće niti. Uvriježeno je mišljenje da stotine i tisuće niti mogu uništiti vaš sustav. Ovo je krivo uvjerenje.
U većini poslužitelja niti čekaju podatke. Dok čekate na poziv za blokiranje, nit je neaktivna. U poslužitelju s 500 niti, samo 50 može biti aktivno u isto vrijeme.
Broj niti koje se izvode na vašem sustavu mogao bi vas iznenaditi. S minimalnim brojem aktivnih poslužitelja i navedenim pokrenute aplikacije moj sustav ima stvorene 333 niti, čak i sa 333 niti CPU je samo 1% opterećen. Jako opterećen IIS poslužitelj(Microsoft Internet Information Server) može stvoriti stotine i tisuće niti.
Niti i globalni odjeljci
S više niti, morate osigurati integritet podataka kada im pristupate. Ovo može biti teško programerima koji nisu radili s nitima. Ali općenito, većina poslužitelja ne treba koristiti globalne podatke. Većina poslužitelja obavlja izolirane funkcije. Svaka nit obavlja svoj izolirani zadatak. Globalni odjeljci za čitanje/pisanje značajka su mnogih višenitnih aplikacija, ali nisu tipični za poslužitelje.
Metodologija Indy
Indy se razlikuje od ostalih Winsock komponenti na koje ste navikli. Ako ste radili s drugim komponentama, onda najbolje rješenje zaboravit će kako rade. Mnoge druge komponente koriste neblokirajuće (asinkrone) pozive i rade asinkrono. Moraju reagirati na događaje, stvoriti stanje stroja i izvršavati česte petlje čekanja.
Na primjer, s drugim komponentama, kada pozivate vezu morate ili čekati da se dogodi događaj veze ili čekati u petlji da svojstvo pokaže da je došlo do veze. Uz Indy, možete pozvati Connect metodu i čekati da se vrati. Povrat će biti izdan ako je veza uspješna ili se pokrene iznimka ako postoji problem. Stoga je rad s Indyjem vrlo sličan radu s datotekama. Indy vam omogućuje da sav svoj kod stavite na jedno mjesto, umjesto da ga širite po različitim događajima. Osim toga, Indy je vrlo jednostavan i najprikladniji za rad s nitima.
Koliko je Indy drugačija?
Kratak pregled · Koriste se blokiranje poziva · Nije orijentirano na događaje - postoje događaji, ali se koriste za informativne potrebe i nisu baš potrebni. · Dizajniran za niti - Indy je dizajniran za niti, ali se može koristiti bez niti. Sekvencijalno programiranje
Detaljan pregled
Indy ne samo da koristi blokiranje poziva (sinkrono), već radi i ovako. Tipična Indy sesija izgleda ovako:
započnite s IndyClientom
Spojiti; Probati
// Radite svoje stvari ovdje
napokon Isključi; kraj;
kraj;
Sa ostalim komponentama to izgleda ovako:
procedure TFormMain.TestOnClick(Pošiljatelj: TComponent);
početi
sa SocketComponent počnite
Spojiti; probati
dok niste povezani počnite
ako je IsError onda počnite
Prekid;
kraj;

OutData:= "Podaci za slanje";
dok duljina (OutData) > 0 počinje
Application.ProcessMessages;
kraj;
napokon Isključi; kraj;
kraj;
kraj;
procedure TFormMain.OnConnectError;
početi
IsError:= Istina;
kraj;
procedure TFormMain.OnRead;
var
i: cijeli broj;
početi
i:= SocketComponent.Send(OutData);
OutData:= Kopiraj(OutData, i + 1, MaxInt);
kraj;
Mnoge komponente ne obavljaju dobar posao izolacije programatora od stoga. Mnoge komponente, umjesto da izoliraju korisnika od složenosti hrpa, jednostavno prepuštaju korisnika tome ili daju omotač preko hrpe.
Indy poseban način
Indy je osmišljen od temelja da bude višenitni. Izgradnja poslužitelja i klijenata u Indyju slična je izgradnji poslužitelja i klijenata u Unixu. Unix aplikacije obično pozivaju stog izravno s malo ili bez sloja apstrakcije.
Tipično, Unix poslužitelji imaju jedan ili više procesa slušanja koji prate dolazne klijentske zahtjeve. Za svakog klijenta kojeg treba uslužiti, a novi proces. Ovo čini programiranje jednostavnim, svaki proces za samo jednog klijenta. Svaki proces radi u vlastitom sigurnosnom kontekstu, koji je postavljen procesom slušanja ili procesom na temelju postojećih prava, identiteta ili drugih stvari.
Indy poslužitelji rade otprilike na isti način. Windows, za razliku od Unixa, ne može dobro multiplicirati procese, ali dobro radi s nitima. Indy poslužitelji stvaraju zasebnu nit za svaku vezu klijenta.
Indy poslužitelji dodjeljuju nit slušanja koja je odvojena od glavne niti programa. Nit slušanja osluškuje dolazne zahtjeve klijenata. Za svakog klijenta na kojeg odgovara, kreira se nova nit koja služi klijentu. Relevantni događaji se zatim servisiraju u kontekstu ovog toka.
Indy recenzija kupaca
Indy je dizajniran da pruži vrlo visoku razinu apstrakcije. Zamršenost i detalji TCP/IP skupa skriveni su od programera. Obično tipična klijentska sesija u Indyju izgleda ovako:
započnite s IndyClientom
Host:= "zip.pbe.com"; // Domaćin za poziv
Luka:= 6000; // Port za pozivanje poslužitelja
Spojiti; Probati
// Radite svoje stvari ovdje
napokon Isključi; kraj;
kraj;
Pregled Indy poslužitelja
Komponente poslužitelja Indy stvaraju nit slušanja koja je izolirana od glavne niti programskog koda. Nit slušanja osluškuje dolazne zahtjeve klijenata. Za svakog klijenta na kojeg odgovara, kreira se nova nit koja služi klijentu. Odgovarajući događaji se zatim 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 kako bismo pokazali primjere napravljene 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 prevoditelja: poveznica na stranici ne radi.
Primjer 1 - Provjera poštanskog broja
Prvi projekt je napravljen što je moguće jednostavnije. Pretraživanje po poštanskom broju, klijent pita poslužitelj 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 mjesto isporuke. Poštanski brojevi sastoje se od 5 znamenki.
Protokol
Prvi korak u izgradnji poslužitelja i klijenta je razvoj protokola. Za standardne protokole to je definirano odgovarajućim RFC-om. Za poštanski broj, protokol je definiran u nastavku.
Većina komunikacijskih protokola radi u tekstualni način rada. Razmjena znači da se prenosi naredba, 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 također se temelji na tekstu. Običan tekst olakšava otklanjanje grešaka u protokolima i omogućuje komunikaciju između različitih programskih jezika i operativnih sustava.
Nakon povezivanja, poslužitelj šalje pozdravnu poruku, a zatim prihvaća 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 jedne linije s odgovorom ili prazna linija ako kod nije pronađen. Naredba Quit uzrokuje da poslužitelj prekine vezu. Poslužitelj može prihvatiti nekoliko naredbi prije nego što se pošalje naredba Quit.
Izvorni kod poslužitelja

Jedinica ServerMain;

sučelje

koristi

tip

TformMain = class(TForm)

IdTCPServer1: TIdTCPServer;

procedure FormCreate(Sender: TObject ) ;

procedure FormDestroy(Sender: TObject ) ;

procedure IdTCPServer1Connect(AThread: TIdPeerThread) ;

privatna

ZipCodeList: TStrings;

javnost

kraj ;

Glavni obrazac: Glavni obrazac;

implementacija

(R*.DFM)

procedure TformMain.IdTCPServer1Connect (AThread: TIdPeerThread) ;

početi

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

kraj ;

SCommand: niz;

početi

SCommand:= ReadLn ;

kraj ;

kraj ;

kraj ;

procedure TformMain.FormCreate (Pošiljatelj: TObject ) ;

početi

ZipCodeList:= TStringList.Create ;

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

kraj ;

procedure TformMain.FormDestroy (Pošiljatelj: TObject ) ;

početi

ZipCodeList.Free ;

kraj ;

kraj.

Jedini dijelovi projekta specifični za Indy 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, poslužitelj sluša. ·DefaultPort = 6000 - vrijednost priključka za ovaj projekt. Poslužitelj osluškuje zahtjeve klijenta na ovom priključku.
Metoda IdTCPServer1Execute povezana je s događajem OnExecute poslužitelja. Događaj OnExecute pokreće se nakon što je veza klijenta prihvaćena. Događaj OnExecute razlikuje se od drugih događaja koje poznajete. OnExecute radi u kontekstu niti. Događaj niti se pokreće i dobiva argument AThread koji se prosljeđuje metodi. Ovo je važno jer se više OnExecute događaja može izvršiti u isto vrijeme. To je učinjeno kako bi poslužitelj mogao raditi bez stvaranja nove komponente. Postoje i metode koje se mogu nadjačati prilikom konstruiranja nasljednika.
Događaj OnConnect pokreće se nakon što je veza prihvaćena i za nju je stvorena nit. U ovaj poslužitelj ovo se koristi za slanje poruke dobrodošlice klijentu. Ako želite, to se također može učiniti u događaju OnExecute.
Događaj OnExecute može se pokrenuti više puta dok se veza ne prekine ili izgubi. Ovo eliminira potrebu za provjerom prekida veze ili gubitka u petlji unutar događaja.
IdTCPServer1Execute koristi dvije osnovne funkcije, ReadLn i WriteLn. ReadLn čita niz iz veze, a WriteLn šalje niz na vezu.
sNaredba:= ReadLn;
Gornji kod preuzima niz od klijenta i postavlja ga u lokalnu varijablu niza sCommand.

ako SameText (sCommand, "QUIT" ) tada počnite

end else if SameText (Copy (sCommand, 1 , 8 ) , "ZipCode " ) then start

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

kraj ;


Zatim se sCommand provjerava za važeće naredbe.
Ako je naredba "Quit" (Odustani) tada se izvodi prekidanje veze. Nakon prekida veze nije dopušteno čitanje ili pisanje. Nakon što događaj završi, nit koja sluša ga više ne poziva, već briše nit i prekida vezu.
Ako je naredba "ZipCode", tada se ekstrahira parametar nakon naredbe, a tablica se skenira radi utvrđivanja prisutnosti grada i države. Grad i država se tada prosljeđuju klijentu ili se prosljeđuje prazan niz ako nema podudaranja.
Zatim, metoda izlazi. Poslužitelj će ponovno pokrenuti događaj čim stigne nova naredba, dopuštajući klijentu slanje više naredbi.
Izvorni kod klijenta

jedinica ClientMain;

sučelje

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;

Gumb1: TButton;

Gumb2: TButton;

Oznaka1: TLabel;

procedure Button2Click(Sender: TObject ) ;

procedure Button1Click(Sender: TObject ) ;

privatna

javnost

kraj ;

Glavni obrazac: Glavni obrazac;

implementacija

(R*.DFM)

procedure TformMain.Button2Click (Pošiljatelj: TObject ) ;

početi

MemoInput.Clear ;

LboxResults.Clear ;

kraj ;

procedure TformMain.Button1Click (Pošiljatelj: TObject ) ;

I: cijeli broj;

S: niz ;

početi

ButnLookup.Enabled := true ; probati

LboxResults.Clear ;

započnite s klijentom

Spojiti; probati

LboxResults.Items.Add(ReadLn);

for i:= 0 to memoInput.Lines .Count - 1 do start

WriteLn("Poštanski broj" + 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("Odustani");

napokon Isključi; kraj ;

kraj ;

napokon butnLookup.Enabled := true ; kraj ;

kraj ;

kraj.


Jedini dijelovi specifični za klijentsku komponentu su Button1Click metoda.
Komponenta Klijent je tipa TIdTCPClient i postavljena je na obrazac. Sljedeća svojstva su promijenjena: · Host = 127.0.0.1 - Poslužitelj se nalazi na istom računalu kao i klijent. ·Port = 6000 - Priključak poslužitelja
Metoda Button1Click povezana je s događajem OnClick komponente Button1. Kada se klikne na gumb, poziva se ova metoda. Indy dio ove metode može se svesti na sljedeće: 1.Povežite se s poslužiteljem (Connect;) 1.Pročitajte pozdrav s poslužitelja. 1. Za svaki redak koji je korisnik unio u TMemo: 1. Slanje zahtjeva poslužitelju (WriteLn("ZipCode " + memoInput.Lines[i]);) 1. Čitanje odgovora s poslužitelja (s:= ReadLn; ) 1. Slanje naredbe Quit (WriteLn("Quit");) 1.Disconnect (Disconnect;)
Testiranje
Ovaj primjer je testiran i radi s instaliranim TCP/IP. Možete ga promijeniti da radi preko mreže s jednog računala na drugo. Pokretanjem poslužitelja na drugom računalu i promjenom naziva ili IP-a poslužitelja na klijentu.
Za testiranje projekata, kompajlirajte i pokrenite poslužitelj. Zatim prevedite i pokrenite klijent. Unesite svoj poštanski broj u polje za bilješku i pritisnite tipku za traženje.
Otklanjanje pogrešaka
Tekstualne protokole vrlo je lako otkloniti pogreške jer se mogu testirati pomoću Telneta. Da biste to učinili, dovoljno je znati port poslužitelja. Poslužitelj za traženje poštanskih brojeva sluša na portu 6000.
Ponovno pokrenite poslužitelj za traženje poštanskih brojeva. Zatim otvorite konzolu (npr. Dos prozor). Sada unesite:
telnet 127.0.0.1 6000
Sada ste spojeni na poslužitelj. Neki poslužitelji šalju i poruku dobrodošlice. Neki ne. Nećete vidjeti retke koje unesete. Većina poslužitelja ne emitira eho kako bi uštedjeli promet. Međutim, možete promijeniti postavke telneta postavljanjem opcije "Echo On". To se radi različito u različitim telnet klijentima, a neki uopće nemaju ovu značajku. Sada unesite:
poštanski broj 37642
Vidjet ćete odgovor poslužitelja:
CHURCH HILL, TN
Za prekid veze s poslužiteljem unesite:
prestati
Primjer 2 - pristup bazi podataka
Ovaj primjer emulira poslužitelj koji mora izvršavati zadatke blokiranja osim poziva utičnice. Mnogi poslužitelji su prisiljeni raditi u takvim uvjetima. Poslužitelji koji trebaju pristupiti bazi podataka, pozivima vanjskim procedurama ili izračunima često ne mogu prekinuti te pozive, jer su to vanjski pozivi ili zbog njihove složenosti. Pristup bazi podataka ne može se razdvojiti na male dijelove i programer mora čekati kraj operacije s bazom podataka. Ovo je značajka ne samo poziva baze podataka, već i drugih operacija kao što su kompresija, izračuni i druga obrada iste vrste.
U svrhu demonstracije, zamislimo da poslužitelj upućuje poziv bazi podataka za koji je potrebno 5 sekundi. Da pojednostavimo, učinimo to jednostavno s pauzom, upotrijebimo funkciju Sleep(5000) za to, umjesto stvarnog poziva.
Ovaj primjer također zahtijeva manje detalja nego prethodni primjer jer mnogi koncepti još nisu shvaćeni.
Izvor

glavna jedinica;

sučelje

koristi

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

IdBaseComponent, IdComponent, IdTCPServer;

tip

TformMain = class(TForm)

IdTCPServer1: TIdTCPServer;

procedure IdTCPServer1Execute(AThread: TIdPeerThread) ;

privatna

javnost

kraj ;

Glavni obrazac: Glavni obrazac;

implementacija

(R*.DFM)

procedure TformMain.IdTCPServer1Execute (AThread: TIdPeerThread) ;

I: cijeli broj;

početi

s AThreadom. Veza počinje

WriteLn("Pozdrav. DB poslužitelj 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 događa u kontekstu niti, kod za obradu može biti bilo koje duljine. Svaki klijent ima svoju nit i ne blokira druge klijente.
Testiranje
Za testiranje DB poslužitelja, prevedite ga i pokrenite. Povežite se s njim koristeći Telnet na port 6001. Poslužitelj će odgovoriti porukom dobrodošlice. Unesite broj. Poslužitelj će "obraditi" vaš zahtjev i odgovoriti u roku od 5 sekundi.

Indy komponente korištene u Delphiju 6.

Uz osnovne internetske usluge i protokole, postoji širok raspon dodatnih usluga, čije mogućnosti često koriste internetski programeri. Osim toga, mogućnost prikaza informacija pomoću preglednika nije uvijek prihvatljivo rješenje za internetske aplikacije. U tom slučaju razumno je koristiti internetsku infrastrukturu za razmjenu podataka, te osigurati prikaz informacija kroz složenije klijentske aplikacije razvijene, primjerice, u Delphiju.

Recimo da trebate implementirati specijaliziranu poslužiteljsku logiku koja nije uključena u standardne web poslužitelje. Za rješavanje ove klase problema, Delphi uključuje biblioteku Internet Direct (Indy) tvrtke Nevrona Designs (http://www.nevrona.com/Indy/). Ova biblioteka, razvijena posebno za Borland Delphi, već ima osam verzija, od kojih je posljednja uključena u novu verziju Delphija. Skup komponenti podijeljen je u tri skupine: klijent (Indy Client), poslužitelj (Indy Servers) i pomoćni (Indy Misc).

Indy klijenti i Indy poslužitelji

Većina komponenata Indy Client i Indy Servers su parovi koji odgovaraju klijentskim i poslužiteljskim dijelovima protokola i usluga (s izuzetkom određenih, uglavnom poslužiteljskih, komponenti kao što su TunnelMaster i TunnelSlave), i dopuštaju korištenje protokola kao što je TCP/IP , UDP, NNTP, SMTP, FTP, HTTP, kao i usluge ECHO, FINGER, WHOIS itd.

Komponente Indy klijenta napisane su pomoću utičnica. Utičnica na strani klijenta zahtijeva vezu s poslužiteljem. Ako je veza uspostavljena, klijent i poslužitelj mogu započeti razmjenu poruka. Te su poruke drugačije prirode, ali obično se razmjena odvija pomoću 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 također su i osnovne klase za komponente TIdSMTP i TIdFTP. Klasa TIdTCPServer ima svojstvo ThreadMgr koje je zadano postavljeno na nulu. Ako je ThreadMgr nula kada je TIdTCPServer omogućen, klasa TIdThreadMgrDeafault bit će kreirana implicitno. Inače se koristi instalirani upravitelj procesa.

TIdUDPClijent i TIdUDPServer

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

TIdChargenServer

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

TIdDayTime i TIdDayTimeServer

Komponente se koriste za pružanje vremenske usluge. Klijent zahtijeva, a poslužitelj javlja trenutni datum i vrijeme.

Razrješavač TIdDNSR

Ovo je klijentska komponenta koja poslužuje zahtjeve s DNS (Domain Name Service) poslužitelja. Upiti DNS poslužitelja dizajnirani su da zamijene ime računala njegovom IP adresom. TIdDNSResolver je potomak klase TIdUDPClient.

TIdDICTServer

Komponenta poslužitelja koja podržava Dictionary Server Protocol (DICT), rječnik na strani poslužitelja temeljen na TCP protokolu koji klijentu omogućuje pristup rječniku prirodnog jezika.

TIdDISCARDServer

Komponenta poslužitelja koja podržava poslužitelj zapisa. Snimke se mogu koristiti kao alat za otklanjanje pogrešaka i mjerenje. Evidenciona služba jednostavno preda sve podatke onome tko ih želi primiti.

TI dEcho i TI dECHOServer

Komponente su dizajnirane za pružanje usluge odgovora, koja se obično koristi za provjeru ispravnosti mreže. Klijent šalje tekstualnu poruku poslužitelju, poslužitelj vraća poruku klijentu. Ako je poruka iskrivljena, mreža ne radi ispravno.

TIdFinger i TIdFingerServer

Komponente su dizajnirane za pružanje protokola koji korisniku omogućuje postavljanje upita o podacima o prisutnosti drugih korisnika u sustavu. Neki poslužitelji obrađuju takve zahtjeve klijenata. Korištenje ovog para komponenti omogućit će vam servisiranje zahtjeva klijenata koji određuju prisutnost drugih korisnika u sustavu.

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 za rad koristi klasu TIdSimpleServer. Kada je prijenos FTP datoteke u tijeku, otvara se sekundarna TCP veza za prijenos podataka i zatvara se nakon prijenosa podataka. Ova se veza naziva "podatkovna veza", koja je jedinstvena za svaku datoteku koja se prenosi.

TIdGopher i TIdGopherServer

Ove komponente dizajnirane su za pružanje mrežnog protokola koji je nedavno iz WWW-a (World Wide Web) istisnut HTTP protokolom. Poslužitelj koji implementira ovaj protokol pruža hijerarhijski distribuirani sustav podrške protoku dokumenata. Primjer korištenja ovog para komponenti, koji se nalazi u direktorijima \demos\indy\GopherClient i \demos\indy\GopherServer, pokazuje kako pomoću ovog protokola možete pružiti informacije na lokalnoj mreži o datotekama koje se nalaze na vašem računalu, uključujući zatvorene .

TIdHostNameServer

Komponenta poslužitelja dizajnirana za prosljeđivanje naziva lokalnog poslužitelja klijentima.

TIdHTTP i TIdHTTPServer

Komponente se koriste za pružanje HTTP mrežnog protokola (podržane su verzije 1.0 i 1.1, uključujući operacije GET, POST i HEAD). Osim toga, omogućena je podrška za autentifikaciju i korištenje proxy poslužitelja. Komponenta poslužitelja koristi se za pružanje usluga drugom web poslužitelju koji podržava određeni protokol. TIdHTTPServer olakšava implementaciju funkcija kao što su kolačići, upravljanje stanjem itd.

TIdIcmpClient

Klijentska komponenta dizajnirana za pružanje Internet Control Message Protocol (ICMP), koji se koristi za izvođenje ping operacija i mrežnog praćenja.

TIdPOP3

Klijentska komponenta dizajnirana za pružanje protokola poštanskog ureda (POP), uključujući podršku za MIME kodiranje i dekodiranje i prijenos višebajtnih znakova.

TIdIMAP4Server

Komponenta poslužitelja dizajnirana za podršku IMAP (Internet Message Access Protocol) operacija na poslužitelju. Protokol vam omogućuje pretraživanje poruka e-pošte na poslužitelju. Razlika između IMAP i POP protokola je u tome što POP protokol zahtijeva dodatnu memoriju za pohranu podataka, a IMAP protokol pristupa poslužitelju umjesto klijentskom računalu. IMAP4 je stvoren da zamijeni POP3, ali POP3 je do danas široko korišten standard.

TIdIRCServer

Komponenta poslužitelja dizajnirana za podršku najčešće korištenim uslugama na Internetu, koje se obično nazivaju chat. Komponenta pruža osnovne građevne blokove za IRC (Internet Relay Chat) poslužitelj.

TIdMappedPortTCP

Komponenta poslužitelja dizajnirana za stvaranje mapiranih priključaka koji se često koriste u proxy poslužiteljima. Metode ove komponente omogućuju vam mapiranje jednog porta u drugi. Na primjer, port 80 mogao bi se preslikati na port 3000, a svi zahtjevi prema prvom portu (port 80) bili bi proslijeđeni na drugi port (port 3000).

TIdNNTP i TIdNNTPServer

Ove su komponente potrebne za podršku mrežnog protokola za prijenos 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. Komponenta poslužitelja omogućuje vam stvaranje poslužitelja vijesti. Važno je napomenuti da TIdNNTPServer nije poslužitelj za vijesti sa svim značajkama, već komponenta koja pruža osnovnu funkcionalnost za takav poslužitelj.

TIdQOTD i TIdQOTDServer

Komponente se koriste za pružanje usluge Quote of the Day. Komponenta klijenta povezuje se s instancom komponente poslužitelja kako bi dobila dnevnu ponudu. Svaka instanca poslužitelja sadrži jedinstvenu bazu podataka citata.

TIdSMTP

Klijentska komponenta dizajnirana za korištenje u aplikacijama Simple Mail Transfer Protocol (SMTP), pruža podršku za provjeru autentičnosti, MIME kodiranje i dekodiranje i podršku za višebajtne znakove.

TIdSNTP

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

TIdSimpleServer

Komponenta poslužitelja koja pruža lagani TCP poslužitelj. Omogućuje organiziranje veze od točke do točke. Koristi se za kreiranje poslužitelja s jednim korisnikom, odnosno može opsluživati ​​samo jednu vezu u isto vrijeme. Za razliku od komponente TIdTCPServer, ona ne pokreće sekundarne procese kada čeka zahtjeve od klijenata i kada obrađuje te zahtjeve. Drugim riječima, ako poslužitelj poslužuje zahtjev klijenta, au tom trenutku ga drugi klijent kontaktira radi povezivanja, tada će biti blokiran do kraja obrade prvog zahtjeva.

TIdTelnet i TIdTelnetServer

Komponenta klijenta koristi se za organiziranje udaljenih sesija na drugom računalu, uključujući pregovore konzole i autentifikaciju. Komunikacijski protokol pretpostavlja prisutnost osobe koja interaktivno komunicira s poslužiteljem. Klijentska komponenta nema podršku za prikaz ili emulaciju terminala, već jednostavno omogućuje vezu sa poslužiteljskim dijelom. Obično se poslužiteljski protokol TIdTelnetServer koristi za organiziranje udaljenih baza podataka s tekstualnim sučeljem za interaktivnu interakciju s klijentima.

TIdTime i TIdTimeServer

Klijentska komponenta je alternativa TIdSNTP komponenti za određivanje vremena. Važno je napomenuti da su formati dvaju protokola različiti. TIdTime se temelji na RFC 868 formatu (vraća vrijeme u internom UNIX OS standardu, izvodeći sve potrebne konverzije). Komponenta poslužitelja slična je u funkcioniranju poslužitelju DayTime. Može se koristiti za implementaciju vremenske usluge na lokalnom računalu. Nije potreban nikakav dodatni kod, samo kreirajte instancu TIdTimeServera koja će vratiti vrijeme unutarnjeg sata poslužiteljskog računala.

TIdTrivialFTP i TIdTrivialFTPServer

Ove komponente su potrebne za organiziranje jednostavnog protokola za prijenos datoteka. Klijentska komponenta ovog protokola koristi se za povezivanje s instancom odgovarajuće poslužiteljske komponente. Protokol je namijenjen privatnim, lakim, lokalnim slučajevima prijenosa datoteka, na primjer u lokalnim mrežama ili za učitavanje (učitavanje) tablica usmjeravanja u usmjerivače. Zbog oslabljenih karakteristika ovog protokola, njegova uporaba 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 poslužiteljskog tunela koriste se u proxy poslužiteljima za organiziranje više logičkih veza preko jednog fizičkog (tunela). Ove se klase mogu koristiti u razne svrhe, na primjer, za organiziranje tajne veze preko netajnih kanala.

TIdWhois i TIdWhoIsServer

Ova klijentska komponenta povezuje se s bilo kojim standardnim Whois poslužiteljem, omogućujući vam dobivanje informacija o domenama. Komponenta poslužitelja pruža osnovnu funkcionalnost NIC poslužitelja.

Indy Ostalo

Stranica Indy Miscellaneous Components uključuje BASE64, UUE, Quoted Printable i druge uobičajene komunikacijske formate e-pošte, kodere (MD2, MD4 i MD5) za kriptografske standarde koji se koriste za pohranjivanje lozinki i elektroničkih potpisa u nepovratnom (teškom za dešifriranje) obliku, kao i mnoge druge korisne komponente i pomoćne programe koji se često koriste u razvoju internetskih aplikacija.

TIdAntiFreeze

Zbog algoritama Indy komponenti koji se temelje na blokovima, često se čini da je aplikacija zapela dok veza radi. Da biste eliminirali korištenje sekundarnih procesa (dretvi) pri organiziranju komunikacije kako biste spriječili zamrzavanje aplikacije, dovoljno je postaviti navedenu komponentu na obrazac.

Komponenta radi tako da analizira zahtjeve iz TCP/IP protokola i šalje poruke aplikaciji tijekom odgode kada su vanjske 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. 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. U određenoj mjeri, to se može kontrolirati putem svojstava klase TIdAntiFreeze. Korištenje ove komponente nije obavezno, ali vam omogućuje da riješite problem sinkronizacije veza s vizualnim sučeljem aplikacije.

TIdDateTimeStamp

Klasa za izvođenje matematike datuma i vremena povezana s činjenicom da internetski protokoli koriste različite formate datuma i vremena; osim toga, klijenti i poslužitelji mogu se nalaziti u različitim vremenskim zonama.

TIdIPWatch

To je komponenta temeljena na mjeraču vremena koja stalno prati promjene u IP adresi računala. Događaji komponente događaju se kada se otkrije promjena. Ova se komponenta obično koristi za otkrivanje je li računalo spojeno 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) poslužitelj prilikom spajanja na novu mrežu.

TIdLogDebug

Svrha ove komponente je presretanje događaja bilo koje komponente klijenta ili poslužitelja i postavljanje zapisa događaja u navedenu datoteku. Ova je komponenta vrlo korisna za otklanjanje pogrešaka u Indy komponentama.

TIdMessage

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

TIdNetworkCalculator

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

TIdThreadMgrDefault

Komponenta prema zadanim postavkama osigurava kontrolu sekundarnih procesa. Stvara 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 stvaranje 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 elektronički ekvivalent posjetnice i može sadržavati vlasnikove osobne podatke i grafičke podatke.

TIdIMFDekoder

Dizajniran za dekodiranje internetskih poruka. Potomak je klase TIdCoder, baš kao i sve ostale komponente kodera. Klasa TIdCoder dekodira prema ARPA standardu formata internetske tekstualne poruke RFS-822, predloženom u kolovozu 1982., i USENET standardu za slanje poruka RFC 1036, predloženom u prosincu 1987.

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

TIdQuotedPrintableEncoder

QuotedPrintableEncoder vam omogućuje dešifriranje teksta u navedenom formatu. Može služiti kao samostalna komponenta s određenom vrstom kodiranja, omogućujući prijenos poruka koje sadrže novu vrstu kodiranja.

TIdBase64Encoder

Implementira još jedan algoritam šifriranja koji omogućuje prijenos znakova koji se ne mogu ispisati.

TIdUUEncoder

Implementira jedan od prvih algoritama šifriranja, UU kodiranje. Ponekad se koristi prilikom slanja članaka novinskoj službi.

TIdXXEncoder

Malo je vjerojatno da će se ova metoda šifriranja ikada koristiti. U biti, ovo je isto UU kodiranje, ali s drugačijom tablicom šifriranja.

TIdCoderMD2

Komponente s različitim vrstama algoritama šifriranja MD (Message Digest). Svi se temelje na slučajnom premještanju, jednosmjerni su i nemaju algoritme za dešifriranje.

Komponente klijenata protokola i poslužitelja mogu se koristiti za razvoj poslužiteljskih i klijentskih Internet aplikacija, zajedno sa ili umjesto osnovnih (ClientSocket, ServerSocket) i ostalih komponenti iz Internet i Fastnet palete. Indy komponente ne koriste WebBroker arhitekturu, implementirajući podršku niske razine za internetske protokole i usluge izravno u svom izvornom kodu (izvorni kodovi su uključeni).

TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL

SSL protokol - Secure Sockets Layer, koji osigurava tajnost i pouzdanost komunikacije između dvije aplikacije, ima dva sloja. Na niskoj razini višeslojnog transportnog protokola (kao što je TCP), SSL je protokol za snimanje i koristi se za kapsuliranje raznih protokola više razine. Prednost SSL-a je u tome što je to neovisni aplikacijski protokol, ali se povrh SSL-a može koristiti protokol više razine.

SSL pruža komunikacijsku sigurnost, koja ima tri glavne funkcije: pružanje povjerljive veze; šifriranje javnim ključem (koristi se za potvrdu identiteta primatelja); podrška za pouzdanost prijenosa podataka.

  • Simetrična kriptografija se koristi za šifriranje podataka (npr. DES, RC4, itd.).
  • Digitalni potpis osigurava se korištenjem asimetrične enkripcije s javnim ključem (na primjer, RSA, DSS itd.).
  • Pouzdanost komunikacije, prijenos poruka uključuje provjeru integriteta poruke putem MAC kodova za korekciju, sigurnih hash funkcija (npr. SHA, MD5, itd.) korištenjem MAC izračuna.

U kombinaciji s HTTP-om i autentifikacijom poslužitelja, SSL pruža potrebne funkcije šifriranja i dalje održava uspostavljenu vezu unakrsnom provjerom identiteta web poslužitelja itd. Važno je razumjeti da SSL štiti samo komunikaciju tijekom prijenosa podataka i ne zamjenjuje druge sigurnosne mehanizme.

Komponente TIdConnectionInterceptOpenSSL i TIdServerInterceptOpenSSL pružaju veze i na strani klijenta i na strani poslužitelja 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 implementacije sustava Windows temelji na funkcijama operativnog sustava.

Primjeri korištenja Indy komponenti mogu se pronaći u direktorijima /Delphi6/Demos/Indy. Ukupno, biblioteka Indy u verziji 8.0 sadrži 69 komponenti. Navedeno je 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ćuje da se koriste za razvoj višeplatformskih aplikacija. Sve Indy komponente podržavaju višenitnost.

Indy komponente implementiraju gotovo sve funkcionalnosti koje se nalaze u Internet i Fastnet komponentama, kao što je jasno prikazano u tablici.

Brze komponente Indy komponente Namjena komponenti
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Interakcija između dva računala (klijenta i poslužitelja) pomoću TCP/IP protokola
2 TNMDayTime TIdDayTime, TIdDayTimeServer Upitajte poslužitelj za trenutno vrijeme
3 TNMEcho TIdEcho, TIdEchoServer Koristi se za komunikaciju s poslužiteljem odgovora
4 TNMFinger TIdFinger, TIdFingerServer Koristi se za dobivanje informacija o korisniku s internetskog poslužitelja za pretraživanje
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Omogućite prijenos datoteka pomoću FTP protokola
6 TNMHTTP TIdHTTP, TIdHTTPServer Koristite HTTP protokol za razmjenu podataka
7 TNMMsgServ, TNMMsg Koristi se za prijenos jednostavnih tekstualnih poruka od klijenta do poslužitelja
8 TNMNNTP TIdNNTP, TIdNNTPServer Podržava razmjenu podataka s poslužiteljem vijesti
9 TNMPOP3 TIdPOP3 Koristi se za primanje e-pošte s poslužitelja e-pošte pomoću POP3 protokola
10 TNMSMTP TIdSMTP Koristi se za slanje e-pošte putem internetskog poslužitelja pošte
11 TNMStrm, TNMStrmServ Prenosi binarne podatke zapisane u tok pomoću TCP/IP protokola
12 TNMUDP TIdUDP, TIdUDPServer Prijenos podataka pomoću UDP protokola
13 TpowerSock, TNMGeneralServer Klase enkapsulirane komponentama koje su osnova za pisanje vlastitih klijenata (Powersock) i poslužitelja (NMGeneralServer)
14 TNMUUProcesor TIdUUEncoder, TIdUUDecoder Pretvara binarne datoteke u MIME ili UUENCODE format
15 TNMURL Pretvara nizove u HTML format i izvodi obrnutu konverziju

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

No, 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 tablice, glavne protokole i usluge ne pružaju samo klijentske, već i komponente poslužitelja. To su vremenske usluge, usluge odgovora, dobivanje korisničkih informacija, kao i HTTP, NNTP, UDP protokoli pa čak i najjednostavnija verzija FTP-a.

Neki primjeri korištenja Indy komponenti

U komponentama Indy sadržanim u Delphiju, IP adresa definirana je u svojstvu Host, obično samo u klijentskim aplikacijama. Komponente hostirane na poslužitelju imaju metode koje vam omogućuju da pokrenete ili zaustavite ispitivanje odgovarajućeg priključka - na primjer, promjena svojstva Active komponente IdTCPServer pokreće ili zaustavlja ispitivanje odgovarajućeg priključka. Nakon što se uspostavi veza između klijenta i poslužitelja, prijenos podataka može započeti.

Indy komponente stavljaju veliki naglasak na sigurnost i pouzdanost pri radu s podacima. Na primjer, komponenta IdTCPClient ima metode Connect i Disconnect. Korištenje tehnike programiranja poput donjeg koda sa strane klijenta:

s TCPClientom započnite povezivanje; pokušajte lstMain.Items.Add(ReadLn); napokon Isključi; kraj; kraj;

i koristeći svojstvo Connection proslijeđeno kao parametar AThread instanci klase TIdPeerThread sa strane poslužitelja:

s AThread.Connection do begin WriteLn("Pozdrav s poslužitelja Basic Indy Server."); Odspojiti se; kraj;

možete računati ili na normalno izvođenje veze ili na ispravno rukovanje pogreškama.

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

Baš kao i komponente Fastneta, klase komponenti Indy imaju događaje koji se mogu koristiti za upravljanje događajima. Na primjer, možete urediti da se poruka prikazuje na obrascu prilikom povezivanja s klijentom:

procedure TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Posluživanje klijenta ]"; kraj;

Indy pruža komponente koje implementiraju protokole s klijentskim i poslužiteljskim dijelovima 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 poslužitelja, pomažu u pregledu datoteka različitih vrsta, uključujući one označene kao skrivene, kao i direktorije na udaljeno računalo (slično kao naredba dir *.* u MS-DOS operativnom sustavu).

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) zadužena je za generiranje poruke, što slijedi iz njenog naziva, a IdSMTP je za organizaciju veze s mail serverom.

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

  • zatražite vezu s poslužiteljem;
  • postavljati zahtjeve za čitanje i pisanje poslužitelju (ovisno o vrsti poslužitelja, korak se izvodi jednom ili ponavlja mnogo puta);
  • prekinuti vezu s poslužiteljem i prekinuti vezu.

Indy komponente dizajnirane su za pružanje ultra-visoke razine apstrakcije. Zamršenost i detalji TCP/IP skupa skriveni su od programera kako bi se on mogao usredotočiti na zadatak koji mu treba.

Sljedeći mali primjer prikazuje tipičnu klijentsku bean sesiju:

s IndyClientom do begin Host:= "zip.pbe.com"; // Domaćin za poziv Port:= 6000; // Port za pozivanje poslužitelja na Connect; pokušajte // Vaš kod ide ovdje konačno Odspojite se; kraj; kraj;

U primjeru, čak i ako veza s poslužiteljem nije uspostavljena, veza će biti elegantno prekinuta zbog upotrebe naredbe try-finally.

Komponente poslužitelja Indy opisuju različite modele poslužitelja koji se mogu koristiti ovisno o vašim potrebama i protokolu koji koristite.

TIdTCPServer je najčešće korištena poslužiteljska komponenta koja stvara sekundarni proces neovisan o glavnom aplikacijskom procesu. Stvoreni proces čeka dolazne zahtjeve potencijalnih klijenata. Individualni sekundarni proces kreira se za svakog klijenta na čiji zahtjev odgovara. Događaji koji se događaju tijekom procesa održavanja povezani su s kontekstom odgovarajućih procesa.

Drugim riječima, za svaku vezu klijenta, klasa TIdTCPServer koristi jedinstvenu sekundarnu nit pozivanjem rukovatelja događajem 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 je instanca kreirana 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 s poslužiteljem (svaki poslani paket je neovisni skup podataka, a ne dio 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, stvara se nit za slušanje dolaznih UDP paketa. Za svaki primljeni paket pokreće se događaj OnUDPRead ili na glavnoj niti ili u kontekstu niti koja sluša, ovisno o vrijednosti svojstva ThreadedEvent. Kada ThreadedEvent ima vrijednost False, događaj se događa u glavnoj niti, inače se događa u niti koja sluša. Dok se događaj obrađuje, druge operacije poslužitelja su blokirane. Stoga je važno osigurati da se procedure OnUDPRead izvode što je brže moguće.

Ako trebate kreirati novu klijentsku aplikaciju za postojeći poslužitelj koristeći postojeći protokol, vaš je posao isključivo razviti i otkloniti pogreške klijentske aplikacije. Međutim, kada moramo razviti i klijentske i poslužiteljske aplikacije koristeći postojeći ili novi protokol, suočavamo se s klasičnim problemom "kokoš i jaje". Gdje početi programirati - od klijenta ili od poslužitelja?

Očito, i klijent i poslužitelj moraju biti stvoreni na kraju. Za mnoge aplikacije, posebno one koje koriste tekstualni protokol (kao što je HTTP), lakše je započeti s izgradnjom aplikacije projektiranjem poslužitelja. A za otklanjanje pogrešaka postoji prikladan klijent koji već postoji. Ovo je Telnet konzolna aplikacija koja je dostupna na Windowsima i UNIX-u.

Ako upišete konzolnu naredbu telnet 127.0.0.1 80 s IP adresom lokalnog računala i brojem priključka 80, koji prema zadanim postavkama koriste web poslužitelji, aplikacija će odgovoriti tekstom prikazanim na sl. 6, u slučaju Windows 2000 OS i IIS 5.0.

Za izradu najjednostavnijeg poslužitelja pomoću Indy komponenti potrebno vam je:

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

procedure TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: niz; započeti s AThread.Connection do try try s:= ReadLn; // Izvršite zadatak poslužitelja ovdje // ako se ne pokrene iznimka, // ispišite odgovor poslužitelja WriteLn(s); osim na e: Exception do begin WriteLn(e.Message); end; //on end; //pokušaj osim na kraju Prekini;kraj;kraj;

Ovaj mali primjer pokazuje korake za stvaranje jednostavnog tekstualnog poslužitelja, kao i kako ga otkloniti.

Gore opisani poslužitelj je tipičan primjer organizacije modernog distribuiranog računarstva.

Značajke kreiranja višeslojnih aplikacija

U posljednje vrijeme višestruki poslužitelji se sve više koriste za zadovoljenje zahtjeva klijenata. Poslužitelj ove vrste, nakon što je primio zahtjev klijenta i djelomično ga pripremio za daljnju obradu, kontaktira drugi poslužitelj i šalje mu transformirani zahtjev ili zahtjeve. Poslužitelj drugog reda može zauzvrat komunicirati s drugim poslužiteljima. Dakle, možemo govoriti o višeslojnoj arhitekturi poslužitelja.

Zatim ćemo kreirati poslužitelj za pristup podacima čija je svrha vraćanje podataka iz baze podataka. Ovaj poslužitelj, međutim, ne čita niti piše izravno u datoteke baze podataka. Umjesto toga, komunicira s poslužiteljem baze podataka u potrazi za podacima koje zahtijeva klijent.

Dakle, počinjemo razvijati aplikaciju s troslojnom arhitekturom. Za izradu poslužitelja baze podataka koristeći Indy komponente potrebno vam je:

  1. Napravite novi projekt.
  2. Postavite instancu komponente TIdTCPServer iz palete Indy Servers na glavni oblik projekta.
  3. Postavite svojstvo DefaultPort instance klase TIdTCPServer1 na 6001 (preporučuje se dodjeljivanje velikih vrijednosti kako bi se izbjeglo dupliciranje brojeva portova u različitim aplikacijama), a svojstvo Active postavite na true.
  4. Dodajte novi modul u projekt odabirom File | Novo | Data Module i na njega postavite instance komponenti SQLConnection i SQLDataSet s kartice dbExpress na paleti komponenti.
  5. Postavite svojstvo ConnectionName klase SQLConnection na IBLocal i LoginPrompt na False. Ako niste konfigurirali IBLocal na Emploee.gdb bazi podataka, prvo dovršite ovaj postupak.
  6. Postavite svojstvo SQLConnection klase SQLDataSet na SQLConnection1 i dodijelite svojstvo CommandText SQL izjavi: odaberite CUSTOMER, CONTACT_FIRST, CONTACT_LAST od CUSTOMER gdje CUST_NO = :cust.

Bok svima!

Prilikom razvoja sljedećeg Web projekta, pojavio se zadatak - implementirati klijentski softver u Delphiju, koji bi POST metodom prenosio podatke na poslužitelj. Aplikacija mora prenijeti tekst i učitati datoteke na web poslužitelj.

Implementacija takvog slanja podataka pomoću jezika na strani poslužitelja Web razvoj(na primjer, PHP) prilično je jednostavan, ali ako trebate napisati višekorisnički softver temeljen na aplikaciji koji je u interakciji s poslužiteljem, onda je malo kompliciraniji. Metoda izravnog povezivanja s bazom podataka i preko FTP-a na poslužitelj iz Delphija više nije potrebna jer nije sigurno, nije pouzdano (mijenjanje lozinki, podataka o povezivanju itd.) i stvara dodatne. problemi kompatibilnosti softvera na strani klijenta. Kako bih riješio problem, odlučio sam napisati skripte (serverski dio) u PHP-u koje će obrađivati ​​dolazne POST zahtjevi i vratiti rezultat klijentu (Delphi aplikacija). Prednosti ovog pristupa su u tome što se sve veze i obrada podataka odvijaju na poslužitelju, što je puno sigurnije od izravne "veze".

Kad sam počeo googlati, puno je razbacanih informacija odustalo, uglavnom po forumima, ali sve je bilo u komadima. Jedno je bilo sigurno da će se koristiti Indy, odnosno IdHTTP komponenta s implementiranom POST metodom. Zapravo, sve je jednostavno, ovu metodu uzima dva parametra Url resursa i DataStream (tok podataka), te vraća rezultat u tekstualnom obliku (može biti i HTML kod stranice). Glavna stvar je bila ispravna formacija DataStream-a (tok prenesenih podataka), ali usput su se pojavile dodatne zamke, naime rusko kodiranje (ako nije bilo dobro). Tu je počela zabava višesatnog lutanja internetom. Općenito, dosta brbljanja, prijeđimo na praksu i implementaciju softvera.

Dakle, program je jednostavan. Ona mora poslati podatke poslužitelju koristeći POST metodu, podaci sadrže " Naslov " (crta), " Opis » ( višeredni tekst) I grafička datoteka(jpg,png,gif-binarni podaci). Poslužitelj mora prihvatiti te podatke, obraditi ih, spremiti grafičku datoteku na poslužitelj i vratiti odgovor. Kao odgovor, aplikaciji ćemo vratiti Delphi, isti tekst samo s dodanim oznakama i poveznicom na preuzetu datoteku. Ništa više.

Počnimo s implementacijom poslužiteljskog dijela (slično API-ju stranice). Otvori bilo koju uređivač teksta(bilježnicu) i u nju napišite sljedeći kod:

"; ) else ( echo "Naslov: nedostaje"."
"; ) //Provjeri dolazne podatke za prisutnost podataka polja "content" if (!empty($_POST["content"]))( echo "Sadržaj: ".$_POST["content"]."
"; ) else ( echo "Sadržaj: nedostaje"."
"; ) //Provjerite dolazne podatke na prisutnost priložene datoteke "file" if (!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /dohvatite informacije o datoteci (naziv, ekstenzija, itd.) //Provjerite vrstu datoteke na popisu dopuštenih vrsta (IMPROVIZACIJA:)) ako (stripos("jpgpnggif",$finfo["ekstenzija"] )==0)( echo ">>>>>>>Nevažeća vrsta datoteke<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

Bilješka! Prilikom spremanja (putem notepada) morate navesti kodiranje "UTF-8", inače će biti problema s prikazom ćirilice!

Scenarij je pokušao dati detaljne komentare. Kopirajte ovu skriptu na svoj web poslužitelj, ako ga nemate, možete koristiti moju skriptu za test, nalazi se na: http://api..php

Izgled koristi sljedeće komponente: Label, Button (2 kom.), Edit (2 kom.), Memo (2 kom.), CheckBox, OpenDialog, IdHTTP. Dajte nazive sljedećim komponentama (svojstvo " Ime”):

  1. Uredi (naslov) – Ime=titula;
  2. Uredi (put do datoteke) Ime = imgfile;
  3. Podsjetnik (Sadržaj)Naziv = sadržaj;
  4. Podsjetnik (rezultat) – Ime = odgovor;
  5. Dugme(…) - Ime = chkfile;
  6. Gumb (POST) – Ime = PostBut;
  7. OpenDialog (Dijalog za odabir datoteke) – Naziv = PictDialog;

Ostavimo IdHTTP1 i CheckBox1 nepromijenjene (umorno! :)))).

Da ne bi slučajno" Uredi» put do Uredi( imgfile), postavite svojstvo ReadOnly na True. Isto tako, na imgfile I chkfile Postavite svojstvo Enabled na false. Njih ćemo aktivirati pomoću CheckBoxa, tj. Pružit ćemo mogućnost da odaberete želite li učitati sliku ili ne.

Za OpenDialog( PictDialog) trebate postaviti filtar (svojstvo filtra) na sljedeći način:

Stvarna vizualna priprema je gotova! Počnimo s kodiranjem!

U projektu ćemo generirati tok podataka koristeći vrstu uključenu u Indy - TidMultiPartFormDataStream. Iako smo naišli na mogućnosti implementacije koristeći TStream, rad s TidMultiPartFormDataStream – lakše!

Kako bi ovaj tip bio dostupan našem projektu, moramo dodati sljedeću biblioteku u Uses: IdMultipartFormData.

Za CheckBox1 kreirajte događaj OnClick (dvostrukim klikom miša na objekt) i dodajte sljedeći kod ovom događaju:

Procedura TForm1.CheckBox1Click(Pošiljatelj: TObject); početak //učini aktivnim ili neaktivnim elemente staze datoteke i dijaloške gumbe imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; kraj;

Ovdje aktiviramo objekte imgfile Ichkfile ovisno o prisutnosti kvačice (ako je potvrdni okvir označen, tada objekti postaju aktivni).

Sada organizirajmo odabir slike. Da biste to učinili, kreirajte događaj OnClick na gumbu chkfile(također duplim klikom na objekt) i napišite sljedeće:

Procedura TForm1.chkfileClick(Pošiljatelj: TObject); početak //otvorite dijaloški okvir i unesite puni put do datoteke u imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; kraj;

Ovaj događaj će pokrenuti dijaloški okvir za odabir slike i ako korisnik klikne " Otvoren", tada će se dodati put do ove datoteke imgfile.

I sada dolazimo do posljednjeg gumba "POST". Stvorite OnClick događaj za ovaj gumb i dodajte sljedeći kod:

Procedura TForm1.PostButClick(Pošiljatelj: TObject); var dataPost:TIdMultiPartFormDataStream; početak dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked and (trim(imgfile.Text)="") then //provjera je li datoteka odabrana ili nije start ShowMessage("Morate odabrati grafičku datoteku!"); Izlaz; kraj; ako je CheckBox1.Checked tada dataPost.AddFile("file",imgfile.Text,""); //dodajte polje s odgovorom datoteke.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; kraj;

Dakle, redom (iako ima komentara):

Datapost – objekt tipa TIdMultiPartFormDataStream. Omogućuje stvaranje strukture POST zahtjeva koja se sastoji od polja različitih vrsta.

dataPost . AddFormField (" titula ", titula . Tekst ," utf -8 "). ContentTransfer := " 8 malo "; – dodaje polje pod nazivom “title” u DataPost, vrijednost iz “title.Text”, postavlja kodiranje prenesenih podataka na “utf-8” (parametar je neobavezan, ali bez eksplicitne naznake, ćirilica se prenosi s upitnici “?”) i vrlo važna metoda "Prijenos sadržaja". Bez ove metode podaci se šalju na poslužitelj " abrakadabra" Imajte na umu da naziv polja (“naslov”) na strani koja šalje mora odgovarati nazivu navedenom u skripti: $_POST["naslov"].

Podaci se prenose slično kao i polje “sadržaj”.

dataPost . Dodaj datoteku (" datoteka ", imgfile . Tekst ,"") – ovom linijom kreiramo stream s podacima iz datoteke.

To je to, podaci su generirani, preostaje ih prenijeti u skriptu na poslužitelju i dobiti odgovor:

response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,);

jer TMemo ne razumije oznaku prijeloma retka "
", koristit ćemo funkciju " " da ga zamijenimo razumljivim prijelomima redaka "#13#10".

Kada je sve gotovo, očistite memoriju iz DataPost objekta s linijom:

datapost.Besplatno;

Iako će se u našem primjeru to dogoditi automatski na kraju postupka, ali ipak...

Stvarni rezultat programa na ekranu:

Dakle, možemo poslati onoliko podataka ili datoteka na poslužitelj koliko želimo, obraditi te podatke na poslužitelju i prijaviti aplikaciji rezultat skripte. Može čak biti samo 0 ili 1, što će signalizirati aplikaciji da dalje reagira.

Svi. Sretno svima. Nadam se da su informacije bile korisne i da ćete im koristiti.

Možete preuzeti gotov primjer i skriptu.

Cijeli kod modula:

Jedinica PostUnit; sučelje koristi Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; tip TForm1 = klasa(TForm) IdHTTP1: TIdHTTP; naslov: TEdit; sadržaj: TMemo; PostBut: TButton; odgovor: TMemo; Oznaka1: TLabel; Oznaka2: TLabel; Oznaka3: TLabel; imgfile:TEdit; chkfile: TButton; Oznaka4: TLabel; CheckBox1: TCheckBox; PictDialog:TOpenDialog; procedure PostButClick(Pošiljatelj: TObject); procedure chkfileClick(Pošiljatelj: TObject); procedure CheckBox1Click(Pošiljatelj: TObject); privatno ( Privatne izjave ) javno ( Javne izjave ) kraj; var Form1: TForm1; implementacija ($R *.dfm) procedure TForm1.CheckBox1Click(Sender: TObject); početak //učini aktivnim ili neaktivnim elemente staze datoteke i dijaloške gumbe imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; kraj; procedure TForm1.chkfileClick(Pošiljatelj: TObject); početak //otvorite dijaloški okvir i unesite puni put do datoteke u imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; kraj; procedure TForm1.PostButClick(Pošiljatelj: TObject); var dataPost:TIdMultiPartFormDataStream; početak dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; if CheckBox1.Checked and (trim(imgfile.Text)="") then //provjera je li datoteka odabrana ili nije start ShowMessage("Morate odabrati grafičku datoteku!"); Izlaz; kraj; ako je CheckBox1.Checked tada dataPost.AddFile("file",imgfile.Text,""); //dodajte polje s odgovorom datoteke.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; kraj; kraj.

Serge Dosyukov Mike Pham

Ovaj vam članak pokazuje kako stvoriti samostalnu web-uslugu koristeći Indy kit i Delphi 7 te kako koristiti Indy kit za podršku Delphi 7 SOAP-baziranih web-usluga. Za više informacija o stvaranju web usluga, pogledajte izvrstan članak Nicka Hodgesa na stranici zajednice Borland: Shakespeare na webu.

Prije ili kasnije, možda ćete morati stvoriti poslužitelj koji je samostalni HTTP poslužitelj i podržava web usluge. Na primjer, možda biste željeli stvoriti aplikacijski poslužitelj temeljen na SOAP-u za n-slojnu aplikaciju izgrađenu pomoću Delphija.

Uvod

Delphijeva online pomoć pruža izvrsne, korak-po-korak upute o tome kako kreirati web uslugu, MIDAS poslužitelj (COM, DCOM), ali nema praktički nikakvih informacija o stvaranju samostalne n-slojne SOAP-bazirane MIDAS aplikacije.

Prethodno objavio Dave Nottage. Ovaj članak opisao je ideju o tome kako stvoriti web uslugu u Delphiju 6 sa SOAP podrškom i mogućnošću objavljivanja SOAP sučelja Datamodulea, odnosno ovaj vam je članak omogućio da naučite kako izraditi vlastiti n-tier MIDAS sustavi.

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

Međutim, unatoč ugrađenoj podršci, ova značajka nije dokumentirana.

Nedavne objave na Borlandovoj mrežnoj konferenciji i pretraživanje interneta pomoću Google poslužitelja 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 je članak prvi dio trodijelne serije. Opisuje glavne odredbe. Drugi i treći dio bit će posvećeni nekim problemima i načinima njihova rješavanja. Počnimo s opisom glavne ideje.

  • biti samostalni HTTP poslužitelj;
  • koristiti Indy kao platformu;
  • podržavaju objavljivanje putem SOAP protokola;
  • biti sposoban objavljivati ​​SOAP DataModule, što bi vam omogućilo stvaranje vlastitog n-slojnog poslužitelja temeljenog na SOAP/HTML-u.

HTTP poslužitelj i SOAP

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

Ova datoteka nije dio izvršne datoteke Indy, pa je morate uključiti u svoj trenutni projekt kao standardnu ​​projektnu datoteku. (Da biste preveli projekt, trebat će vam i datoteka IdCompilerDefines.inc.) Ove datoteke moraju se kopirati u trenutni direktorij projekta. Za povećanje brzine možda će biti potrebne promjene koda, stoga je najbolje držati te datoteke odvojeno od Indy distribucije.

Slijedi opis implementacije zamjenske komponente iz THTTPServera, proširene za podršku SOAP paketa, nazvane TIdHTTPWebBrokerBridge. Ova konstrukcija je klasa koja nasljeđuje TCustomHTTPServer i podržava osnovno vezanje zahtjeva.

Budući da ovoj klasi nije moguće pristupiti iz palete, morat ćete je definirati kao običan objekt prilikom izvođenja vašeg koda.

Ovaj se objekt može koristiti na točno isti način kao i obični THTTPServer, s izuzetkom onih dodatnih svojstava koja omogućuju rad sa SOAP-om.
Ipak, prvo pogledajmo pripremu potrebnog koda.

WebBroker i Indy

Za one koji su prije stvorili web usluge, znate da koristite WebBroker. Delphi 7, kao i Delphi 6, koristi WebBroker arhitekturu za podršku SOAP-u.

Stoga morate izraditi modul TWebModule i u njega postavite sljedeće tri komponente: THTTPSoapDispatcher, THTTPSoapPascalInvoker i TWSDLHTMLPublish. Sve su one dostupne na kartici WebServices palete komponenti. Nakon povezivanja SOAPDispatchera sa SOAPPascalInvokerom, obrazac za prijavu je spreman. Krajnji rezultat trebao bi biti nešto poput onoga što je prikazano na sljedećoj slici:

(modul uWebModule.pas)

Najbolje je ostaviti sve kako jest, budući da nema potrebe mijenjati ili izvršavati prilagođeni kod za ovaj obrazac.

WebModule i Indy

Prijeđimo na drugi dio koda potrebnog za implementaciju HTTP poslužitelja.

Kao što vidite, TIdHTTPWebBrokerBridge ima metodu RegisterWebModuleClass, koja vam omogućuje da registrirate vlastiti WebModule i učinite ga dostupnim poslužitelju.

Dakle, nakon kreiranja objekta poslužitelja fServer, trebate samo pozvati klasu fServer.RegisterWebModuleClass (TwmSOAPIndy).

Bilješka. U normalnoj implementaciji TIdHTTPWebBrokerBridge, TwmSOAPIndy objekt će biti kreiran svaki put kada se primi zahtjev. Očito to nije potrebno. Stoga se klasa može modificirati kako bi se osiguralo trajno stvaranje ovog objekta sve dok postoji objekt poslužitelja. Preporuča se da pogledate dokumentaciju implementacije klase za više informacija.

Je li poslužitelj spreman?