Delphi aplikacija šalje podatke poslužitelju POST metodom (Indy). Indy komponente korištene u Delphiju

Indy je prilično moćan paket komponenti koji vam omogućuje razvoj različitih mrežnih aplikacija. U ovom vodiču ću vam reći kako možete kreirati klijent-poslužitelj aplikacije pomoću komponenti TIdTCPClient i TIdTCPServer.

Prije svega, želio bih napomenuti dvije važne prednosti ovih komponenti. Najvažniji od njih je multithreading, što znači da poslužitelj kreira zasebnu drevu za svakog klijenta, a to svakako utječe na performanse poslužiteljskog programa na računalima s višejezgrenim procesorom. Druga prednost je jednostavnost korištenja. 10-20 redaka koda dovoljno je za pisanje jednostavne klijent-poslužitelj aplikacije. Ovaj paket komponenti prisutan je u standardnim Delphi sklopovima.

Idemo pisati jednostavan program, koji vam omogućuje prijenos tekstualne poruke s klijenta na poslužitelj. Počnimo stvarati poslužitelj.
Postavimo komponentu IdTCPServer iz kartice “Indy Servers” na obrazac. Napravit ćemo sve postavke za ovu komponentu tijekom izvođenja u OnCreate događaju obrasca:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= true;
Ovdje je sve jednostavno - označavamo port na kojem će poslužitelj raditi i aktivirati sam poslužitelj.

Za primanje podataka na poslužitelju od klijenta postoji poseban događaj “OnExecute”. Ovaj događaj izgleda ovako:

početi
kraj;

Uredimo sadržaj događaja na sljedeći način:
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l: niz; // string varijabla u koju ćemo primati
početi
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
kraj;

Sada, čim poruka stigne na poslužitelj, zapisat ćemo je u string varijablu l i ispisati je u tekstualno polje s više redaka.

Ovo, ne iznenađuje, završava stvaranje poslužitelja. Indy će učiniti ostalo za nas. Počnimo s klijentskim programom. Spojit će se na poslužitelj, poslati mu poruku i prekinuti vezu s poslužiteljem.

Kreirajmo novi projekt, postavite IdTCPClient komponentu na obrazac, koja se nalazi na kartici “Indy Clients”. Također ćemo postaviti jednostavan Edit i gumb. Kreirajmo OnClick rukovatelj događajem za gumb unutar kojeg ćemo napisati:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;

Ovaj kod ne mora biti smješten u događaj OnCreate. Ovaj kod možete postaviti gdje god želite ako želite.
U prvom retku dodjeljujemo port, a potrebno je navesti isti port koji smo naveli u poslužiteljskom programu, inače klijent jednostavno neće pronaći poslužitelj. Zatim označavamo IP adresu poslužitelja. Sam poslužitelj može se nalaziti ili u lokalna mreža, i to na daljinu. U potonjem slučaju, veza će se uspostaviti putem interneta i morat ćete navesti IP adresu na internetu.

Naveo sam adresu “127.0.0.1”, što znači da je poslužitelj računalo na kojem radi klijent. Ova je metoda vrlo prikladna za testiranje mrežnih aplikacija.
Zatim uspostavimo vezu, pošaljemo poruku i prekinemo vezu. Kao i sama poruka, IP adresu možete uzeti iz Edita ili iz bilo koje string varijable.

Završen je i rad na klijentskom programu. Kao što možete vidjeti, Indy za nas obavlja ogroman posao, što čak i neiskusnom programeru omogućuje stvaranje vlastite mrežne aplikacije.

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

Korak po korak upute:

Dao sam primjer, ali oprostite, nisam zapisao svaki red, jer... Ne vidim ništa komplicirano i svatko to može shvatiti.

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

koristi
Windows, Poruke, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dijalozi, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

tip
TForm1 = klasa(TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Gumb1: TButton;
Oznaka1: TLabel;
procedure FormCreate(Pošiljatelj: TObject);
procedure FormClose(Pošiljatelj: TObject; var Akcija: TCloseAction);
procedure Button1Click(Pošiljatelj: TObject);
procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
privatna
(Privatne izjave)
javnost
(Javne izjave)
kraj;

var
Obrazac1: TForm1;

($R *.dfm)
[b]//Procedura za slanje poruke
procedure TForm1.Button1Click(Pošiljatelj: TObject);
početi
probati
IdUDPClient1.Active:= True;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
if IdUDPClient1.Connected then
početi
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
kraj;
IdUDPClient1.Active:= False;
Bip;Bip;Bip;
osim
MessageDlg("Nešto nije u redu =(", mtError, , 0);
kraj;
kraj;
[b]
//Uključeno, Isključeno. UDP poslužitelj prilikom pokretanja i zatvaranja forme
procedure TForm1.FormClose(Pošiljatelj: TObject; var Akcija: TCloseAction);
početi
IdUDPServer1.Active:= False;
kraj;

procedure TForm1.FormCreate(Pošiljatelj: TObject);
početi
IdUDPServer1.Active:= True;
kraj;

[b]//Procedura reakcije poslužitelja prilikom primanja podataka
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
ADpodaci: Tbajti; ABinding: TIdSocketHandle);
Var
i:cijeli broj;
s:String;
početi
s:= "";
probati
i:= 0;
dok (AData[i] 0) učiniti
početi
s:= s + chr(AData[i]);
i:= i + 1;
kraj;
konačno
Label1.Caption:= s;
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. Iza dodatne informacije Za informacije 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 izvrsnu sekvencijalna instrukcija o tome kako izraditi Web servis, MIDAS server (COM, DCOM model), ali praktički nema informacija o izradi samostalne n-tier MIDAS aplikacije temeljene na SOAP protokolu.

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 omogućila trajno stvaranje ovog objekta sve dok objekt Server postoji. Preporuča se da pogledate dokumentaciju implementacije klase za više informacija.

Je li poslužitelj spreman?

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žitelji

Većina Indy komponente Klijent i Indy poslužitelji su parovi koji odgovaraju klijentskom i poslužiteljskom dijelu protokola i usluga (s iznimkom pojedinačnih, uglavnom poslužiteljskih komponenti kao što su TunnelMaster i TunnelSlave), i dopuštaju korištenje protokola kao što su 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 ( Širom svijeta Web) HTTP protokol. 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 direktoriju demosindyGopherClient i demosindy 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 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 trenutni datumi i vrijeme.

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 priloženi su).

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 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 Provedite rekodiranje binarne datoteke u MIME ili UUENCODE format
15 TNMURL Pretvara nizove u HTML format i vrši obrnuto rekodiranje

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 morate razvijati i klijenta i poslužiteljska aplikacija Bilo da koristimo postojeći ili novi protokol, suočeni smo 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.

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.