Aplikácia Delphi odosiela dáta na server pomocou metódy POST (Indy). Indy komponenty používané v Delphi

Indy je pomerne výkonný balík komponentov, ktorý vám umožňuje vyvíjať rôzne sieťové aplikácie. V tomto návode vám poviem, ako môžete vytvárať aplikácie klient-server pomocou komponentov TIdTCPClient a TIdTCPServer.

Najprv by som chcel poznamenať dve dôležité výhody týchto komponentov. Najdôležitejším z nich je multithreading, čo znamená, že server vytvára samostatné vlákno pre každého klienta, čo určite ovplyvňuje výkon serverového programu na počítačoch s viacjadrovým procesorom. Druhou výhodou je jednoduchosť použitia. Na napísanie jednoduchej klient-server aplikácie stačí 10-20 riadkov kódu. Tento balík komponentov je prítomný v štandardných zostavách Delphi.

Píšme jednoduchý program, ktorý vám umožňuje preniesť textovú správu z klienta na server. Začnime vytvárať server.
Umiestnime komponent IdTCPServer zo záložky „Indy Servers“ na formulári. Všetky nastavenia pre tento komponent vykonáme za behu v udalosti OnCreate formulára:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= true;
Všetko je tu jednoduché - uvádzame port, na ktorom bude server pracovať, a aktivujeme samotný server.

Na prijímanie údajov na server od klienta existuje špeciálna udalosť „OnExecute“. Táto udalosť vyzerá takto:

začať
koniec;

Upravme obsah udalosti takto:
procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l:string; // reťazcová premenná, do ktorej dostaneme
začať
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
koniec;

Teraz, keď správa príde na server, zapíšeme ju do reťazcovej premennej l a vypíšeme ju do viacriadkového textového poľa.

Tým nie je prekvapujúce, že vytváranie servera končí. Indy urobí zvyšok za nás. Začnime klientskym programom. Pripojí sa k serveru, odošle naň správu a odpojí sa od servera.

Poďme tvoriť nový projekt, umiestnite komponent IdTCPClient do formulára, ktorý nájdete na karte “Indy Clients”. Umiestnime aj jednoduchú Úpravu a tlačidlo. Vytvorme obsluhu udalosti OnClick pre tlačidlo, do ktorého napíšeme:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Odpojiť;

Tento kód nie je potrebné umiestniť do udalosti OnCreate. Ak chcete, môžete tento kód umiestniť kdekoľvek chcete.
V prvom riadku priradíme port a je potrebné zadať rovnaký port, aký sme zadali v serverovom programe, inak klient server jednoducho nenájde. Potom uvedieme IP adresu servera. Samotný server môže byť umiestnený buď v lokálna sieť a na diaľku. V druhom prípade sa pripojenie uskutoční cez internet a budete musieť zadať IP adresu na internete.

Zadal som adresu „127.0.0.1“, čo znamená, že server je počítač, na ktorom beží klient. Táto metóda je veľmi vhodná na testovanie sieťových aplikácií.
Potom nadviažeme spojenie, odošleme správu a odpojíme sa.Tak ako samotnú správu, aj IP adresu môžete prevziať z Edit alebo z ľubovoľnej reťazcovej premennej.

Ukončené sú aj práce na klientskom programe. Ako môžete vidieť, Indy pre nás odvádza skvelú prácu, ktorá umožňuje aj neskúsenému programátorovi vytvoriť si vlastnú sieťovú aplikáciu.

Na prenos je celkom dobrý protokol UDP textové správy, to znamená, že môžete organizovať miestne chaty a podobne. Rozhodol som sa uviesť príklad najjednoduchšej práce s UDP v Delphi.

Pokyny krok za krokom:

Uviedol som príklad, ale prepáčte, nezapísal som si každý riadok, pretože... Nevidím v tom nič zložité a každý si s tým poradí.

V skutočnosti, ak je niečo nejasné, môžete sa ma opýtať. A tu je skutočný kód:

používa
Windows, Správy, SysUtils, Varianty, Triedy, Grafika, Ovládacie prvky, Formuláre,
Dialógové okná, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

typu
TForm1 = trieda (TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Button1: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure IdUDPServer1UDPRead(ATvlákno: TIdUDPListenerThread; ADúdaje: TBytes;
ABinding: TIdSocketHandle);
súkromné
(Súkromné ​​vyhlásenia)
verejnosti
(Verejné vyhlásenia)
koniec;

var
Form1: TForm1;

($R *.dfm)
[b]//Postup odoslania správy
procedure TForm1.Button1Click(Sender: TObject);
začať
skúste
IdUDPClient1.Active:= True;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
ak IdUDPClient1.Connected then
začať
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
koniec;
IdUDPClient1.Active:= False;
Beep;Beep;Beep;
okrem
MessageDlg("Niečo sa pokazilo =(", mtError, , 0);
koniec;
koniec;
[b]
//Zapnuté vypnuté. UDP server pri spúšťaní a zatváraní formulára
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
začať
IdUDPServer1.Active:= False;
koniec;

procedure TForm1.FormCreate(Sender: TObject);
začať
IdUDPServer1.Active:= True;
koniec;

[b]//Procedúra reakcie servera pri prijímaní údajov
procedure TForm1.IdUDPServer1UDPRead(ATvlákno: TIdUDPListenerThread;
ADúdaje: TBytes; ABinding: TIdSocketHandle);
Var
i:Integer;
s:String;
začať
s:= "";
skúste
i:= 0;
zatiaľ čo (AData[i] 0) robia
začať
s:= s + chr(AData[i]);
i:= i + 1;
koniec;
konečne
Label1.Caption:= s;
koniec;
koniec;

Serge Dosyukov Mike Pham

Tento článok vám ukáže, ako vytvoriť samostatnú webovú službu pomocou súpravy Indy a Delphi 7 a ako použiť súpravu Indy na podporu webových služieb založených na SOAP v Delphi 7. vzadu Ďalšie informácie Informácie o vytváraní webových služieb nájdete vo vynikajúcom článku Nicka Hodgesa na komunitnej stránke Borland: Shakespeare on the Web.

Skôr alebo neskôr možno budete musieť vytvoriť server, ktorý je samostatným HTTP serverom a podporuje webové služby. Môžete napríklad chcieť vytvoriť aplikačný server založený na SOAP pre n-vrstvovú aplikáciu postavenú pomocou Delphi.

Úvod

Online pomoc Delphi poskytuje vynikajúce sekvenčná inštrukcia o tom, ako vytvoriť webovú službu, server MIDAS (model COM, DCOM), ale prakticky neexistujú žiadne informácie o vytvorení samostatnej n-vrstvovej aplikácie MIDAS založenej na protokole SOAP.

Predtým publikované Dave Nottage. Tento článok opísal myšlienku, ako vytvoriť webovú službu v Delphi 6 s podporou SOAP a schopnosťou publikovať rozhrania SOAP Datamodule, to znamená, že tento článok vám umožnil naučiť sa, ako vytvoriť vlastnú n-vrstvu. systémy MIDAS.

Borland Delphi 7 a nová súprava Indy majú vstavanú podporu pre túto funkciu.

Napriek vstavanej podpore však táto funkcia nie je zdokumentovaná.

Nedávne príspevky na sieťovej konferencii Borland a vyhľadávanie na webe pomocou servera Google umožnili autorom vyvinúť spôsob, ako konvertovať existujúci kód z Delphi 6 na Delphi 7. Ale všetko má svoj čas.

Hlavná myšlienka

Tento článok je prvou časťou trojdielneho seriálu. Opisuje hlavné ustanovenia. Druhá a tretia časť budú venované niektorým problémom a spôsobom ich riešenia. Začnime popisovať hlavnú myšlienku.

  • byť samostatným HTTP serverom;
  • použiť Indy ako platformu;
  • podpora publikovania cez protokol SOAP;
  • byť schopný publikovať SOAP DataModules, čo by vám umožnilo vytvoriť si vlastný n-tier server založený na SOAP/HTML.

HTTP server a SOAP

Mnoho ľudí pozná Indy a už predtým používali komponenty THTTPServer. Je ľahké umiestniť tento komponent na formulár žiadosti, ale ako dosiahnete, aby podporoval SOAP? V adresári "C:Program FilesBorlandDelphi7SourceIndy" nájdete súbor IdHTTPWebBrokerBridge.pas. To je presne to, čo je potrebné.

Tento súbor nie je súčasťou spustiteľného súboru Indy, takže ho musíte zahrnúť do svojho aktuálneho projektu ako štandardný súbor projektu. (Na zostavenie projektu budete potrebovať aj súbor IdCompilerDefines.inc.) Tieto súbory je potrebné skopírovať do aktuálneho adresára projektu. Na zvýšenie rýchlosti môžu byť potrebné zmeny kódu, preto je najlepšie uchovávať tieto súbory oddelene od distribúcie Indy.

Nasledujúci text popisuje implementáciu náhradného komponentu z THTTPServera, rozšíreného o podporu paketov SOAP, nazývaného TIdHTTPWebBrokerBridge. Táto konštrukcia je trieda, ktorá dedí z TCustomHTTPServer a podporuje základné viazanie požiadaviek.

Pretože táto trieda nie je prístupná z palety, budete ju musieť pri vykonávaní kódu definovať ako bežný objekt.

Tento objekt je možné použiť presne rovnakým spôsobom ako bežný server THTTP, s výnimkou tých dodatočných vlastností, ktoré umožňujú prevádzku so SOAP.
Najprv sa však pozrime na prípravu potrebného kódu.

WebBroker a Indy

Pre tých, ktorí už vytvorili webové služby, viete, že ich používate WebBroker. Delphi 7, podobne ako Delphi 6, používa architektúru WebBroker na podporu SOAP.

Preto je potrebné vytvoriť modul TWebModule a umiestnite do nej nasledujúce tri komponenty: THTTPSoapDispatcher, THTTPSoapPascalInvoker a TWSDLHTMLPublish. Všetky sú dostupné na karte WebServices palety komponentov. Po prepojení SOAPDispatcher s SOAPPascalInvoker je formulár žiadosti pripravený. Konečný výsledok by mal byť podobný tomu, čo je znázornené na nasledujúcom obrázku:

(modul uWebModule.pas)

Najlepšie je nechať všetko tak, ako je, pretože pre tento formulár nie je potrebné meniť ani spúšťať žiadny vlastný kód.

WebModule a Indy

Prejdime k ďalšej časti kódu potrebného na implementáciu HTTP servera.

Ako vidíte, TIdHTTPWebBrokerBridge má metódu RegisterWebModuleClass, ktorá vám umožňuje zaregistrovať svoj vlastný modul WebModule a sprístupniť ho serveru.

Po vytvorení objektu servera fServer teda stačí zavolať triedu fServer.RegisterWebModuleClass (TwmSOAPIndy).

Poznámka. V normálnej implementácii TIdHTTPWebBrokerBridge sa objekt TwmSOAPIndy vytvorí vždy, keď bude prijatá požiadavka. Očividne to nie je potrebné. Preto je možné triedu upraviť tak, aby poskytovala trvalé vytváranie tohto objektu pokiaľ objekt Server existuje. Viac informácií nájdete v dokumentácii implementácie triedy.

Je server pripravený?

Komponenty Indy používané v Delphi 6.

Okrem základných internetových služieb a protokolov existuje široká škála doplnkových služieb, ktorých možnosti často využívajú internetoví vývojári. Okrem toho možnosť zobrazenia informácií pomocou prehliadača nie je vždy prijateľným riešením pre internetové aplikácie. V tomto prípade je rozumné využiť na výmenu dát internetovú infraštruktúru a poskytovať zobrazovanie informácií prostredníctvom zložitejších klientskych aplikácií vyvinutých napríklad v Delphi.

Povedzme, že potrebujete implementovať špecializovanú serverovú logiku, ktorá nie je súčasťou štandardných webových serverov. Na vyriešenie tejto triedy problémov obsahuje Delphi knižnicu Internet Direct (Indy) od Nevrona Designs (http://www.nevrona.com/Indy/). Táto knižnica, vyvinutá špeciálne pre Borland Delphi, má už osem verzií, z ktorých najnovšia je súčasťou Nová verzia Delphi. Sada komponentov je rozdelená do troch skupín: klient (Indy Client), server (Indy Servers) a pomocný (Indy Misc).

Klienti Indy a servery Indy

Väčšina Indy komponenty Klient a server Indy sú páry zodpovedajúce klientským a serverovým častiam protokolov a služieb (s výnimkou jednotlivých, hlavne serverových komponentov, ako sú TunnelMaster a TunnelSlave), a umožňujú používanie protokolov ako TCP/IP, UDP, NNTP, SMTP, FTP, HTTP, ako aj služby ECHO, FINGER, WHOIS atď.

Komponenty klienta Indy sú napísané pomocou soketov. Soket na strane klienta vyžaduje pripojenie k serveru. Ak je spojenie vytvorené, klient a server si môžu začať vymieňať správy. Tieto správy majú rôznu povahu, ale k výmene zvyčajne dochádza pomocou špecifického protokolu (napríklad HTTP)

TIdTCPClient a TIdTCPServer

Tieto komponenty sa používajú na podporu jedného z hlavných sieťových protokolov - TCP (Transmission Control Protocol) a sú tiež základnými triedami pre komponenty TIdSMTP a TIdFTP. Trieda TIdTCPServer má vlastnosť ThreadMgr, ktorá má predvolenú hodnotu nula. Ak je ThreadMgr nula, keď je povolený TIdTCPServer, trieda TIdThreadMgrDeafault sa vytvorí implicitne. V opačnom prípade sa použije nainštalovaný správca procesov.

TIdUDPClient a TIdUDPServer

Tieto komponenty slúžia na podporu sieťový protokol UDP (User Datagram Protocol) a sú tiež základnými triedami pre množstvo ďalších komponentov Indy.

TIdChagenServer

Komponent sa používa na generovanie náhodných symbolov, zvyčajne na testovacie účely.

TIdDayTime a TIdDayTimeServer

Komponenty sa používajú na poskytovanie časovej služby. Klient požiada a server oznámi aktuálny dátum a čas.

TIdDNSResolver

Toto je komponent klienta, ktorý obsluhuje požiadavky zo servera DNS (Domain Name Service). Dotazy servera DNS sú navrhnuté tak, aby nahradili názov počítača jeho IP adresou. TIdDNSResolver je potomkom triedy TIdUDPClient.

TidDICTServer

Serverový komponent, ktorý podporuje Dictionary Server Protocol (DICT), slovník na strane servera založený na protokole TCP, ktorý umožňuje klientovi prístup k slovníku prirodzeného jazyka.

Server TIdDISCARD

Komponent servera, ktorý podporuje server záznamov. Nahrávky možno použiť ako nástroj na ladenie a meranie. Záznamová služba jednoducho odovzdá akékoľvek údaje tomu, kto je ochotný ich prijať.

TI dEcho a TI dECHOServer

Komponenty sú navrhnuté tak, aby poskytovali službu odozvy, ktorá sa zvyčajne používa na kontrolu stavu siete. Klient odošle textovú správu na server, server vráti správu klientovi. Ak je správa skomolená, sieť nefunguje správne.

TIdFinger a TIdFingerServer

Komponenty sú navrhnuté tak, aby poskytovali protokol, ktorý umožňuje používateľovi dotazovať sa na údaje týkajúce sa prítomnosti iných používateľov v systéme. Niektoré servery spracovávajú takéto požiadavky klientov. Použitie tejto dvojice komponentov vám umožní obsluhovať požiadavky klientov, ktoré určujú prítomnosť iných používateľov v systéme.

Komponent obsahuje plnú podporu protokolu prenosu súborov - FTP (File Transfer Protocol). Podporovaný je pasívny a aktívny prenos dát, ako aj operácie ako GET a PUT, mazanie adresárov, získavanie kvót, veľkostí súborov a adresárov. TI dFTP používa na prevádzku triedu TIdSimpleServer. Keď prebieha prenos súboru FTP, otvorí sa sekundárne pripojenie TCP na prenos údajov a zatvorí sa, keď sa údaje prenesú. Toto spojenie sa nazýva „dátové spojenie“, jedinečné pre každý prenášaný súbor.

TIdGopher a TIdGopherServer

Tieto komponenty sú navrhnuté tak, aby poskytovali sieťový protokol, ktorý bol nahradený V poslednej dobe z WWW ( World Wide Web) HTTP protokol. Server, ktorý implementuje tento protokol, poskytuje hierarchický systém podpory distribuovaného toku dokumentov. Príklad použitia tejto dvojice komponentov, ktoré sa nachádzajú v adresári demosindyGopherClient a demosindy GopherServer, ukazuje, ako pomocou tohto protokolu môžete poskytnúť informácie o súboroch na vašom počítači, vrátane uzavretých, v lokálnej sieti.

TIdHostNameServer

Serverový komponent určený na odovzdávanie názvu lokálneho servera klientom.

TIdHTTP a TIdHTTPServer

Komponenty sa používajú na poskytovanie sieťového protokolu HTTP (podporované sú verzie 1.0 a 1.1 vrátane operácií GET, POST a HEAD). Okrem toho je poskytovaná podpora pre autentifikáciu a používanie proxy serverov. Serverový komponent sa používa na poskytovanie služieb inému webovému serveru, ktorý podporuje daný protokol. TIdHTTPServer uľahčuje implementáciu funkcií, ako sú cookies, správa stavu atď.

TIdIcmpClient

Klientsky komponent navrhnutý na poskytovanie protokolu ICMP (Internet Control Message Protocol), ktorý sa používa na vykonávanie operácií ping a sledovanie siete.

Klientsky komponent navrhnutý tak, aby poskytoval Post Office Protocol (POP), vrátane podpory MIME kódovania a dekódovania a viacbajtového prenosu znakov.

Server TIdIMAP4

Serverový komponent navrhnutý na podporu operácií IMAP (Internet Message Access Protocol) na serveri. Protokol vám umožňuje vyhľadávať správy Email na serveri. Rozdiel medzi protokolmi IMAP a POP je v tom, že protokol POP vyžaduje dodatočná pamäť na ukladanie údajov a protokol IMAP pristupuje k serveru namiesto klientskeho počítača. IMAP4 bol vytvorený, aby nahradil POP3, ale POP3 zostáva dodnes široko používaným štandardom.

TidIRCServer

Serverový komponent navrhnutý na podporu najbežnejšie používaných operácií služieb na internete, bežne nazývaných chat. Komponent poskytuje zákl stavebné bloky pre IRC (Internet Relay Chat) server.

TIdMappedPortTCP

Serverový komponent určený na vytváranie mapovaných portov, ktoré sa často používajú v proxy serveroch. Metódy tohto komponentu umožňujú mapovať jeden port na druhý. Napríklad port 80 by mohol byť namapovaný na port 3000 a všetky požiadavky na prvý port (port 80) by boli presmerované na druhý port (port 3000).

TIdNNTP a TIdNNTPServer

Tieto komponenty sú potrebné na podporu protokolu NNTP (Network News Transfer Protocol) používaného v spravodajských službách. Klientsky komponent zahŕňa podporu kódovania a dekódovania MIME, ako aj podporu viacbajtových znakov a alternatívneho kódovania. Komponent server vám umožňuje vytvárať servery správ. Je dôležité poznamenať, že TIdNNTPServer nie je plnohodnotný spravodajský server, ale komponent, ktorý poskytuje základnú funkčnosť pre takýto server.

TIdQOTD a TIdQOTDServer

Komponenty sa používajú na poskytovanie služby Quote of the Day. Klientsky komponent sa pripojí k inštancii serverového komponentu, aby získal dennú cenovú ponuku. Každá inštancia servera obsahuje jedinečnú databázu citácií.

Klientsky komponent navrhnutý na použitie v aplikáciách SMTP (Simple Mail Transfer Protocol), ktorý poskytuje podporu pre autentifikáciu, MIME kódovanie a dekódovanie a podporu viacbajtových znakov.

Klientsky komponent určený na poskytovanie SNTP (Simple Network Time Protocol) – časovej služby. Môže byť použitý na pripojenie k akejkoľvek časovej službe na určenie aktuálne dátumy a čas.

TIdSimpleServer

Serverový komponent, ktorý poskytuje ľahký TCP server. Umožňuje vám zorganizovať spojenie bod-bod. Používa sa na vytváranie serverov s jedným používateľom, to znamená, že môže súčasne obsluhovať iba jedno pripojenie. Na rozdiel od komponentu TIdTCPServer nevytvára sekundárne procesy pri čakaní na požiadavky od klientov a pri spracovaní týchto požiadaviek. Inými slovami, ak server obsluhuje požiadavku od klienta a v tom čase ho kontaktuje iný klient, aby sa pripojil, potom bude zablokovaný až do konca spracovania prvej požiadavky.

TIdTelnet a TIdTelnetServer

Klientsky komponent sa používa na organizovanie vzdialených relácií na inom počítači, vrátane vyjednávania konzoly a autentifikácie. Komunikačný protokol predpokladá prítomnosť osoby interagujúcej so serverom. Klientsky komponent nemá podporu displeja ani emuláciu terminálu, ale jednoducho poskytuje pripojenie k serverovej časti. Serverový protokol TIdTelnetServer sa zvyčajne používa na organizáciu vzdialených databáz s textovým rozhraním pre interaktívnu interakciu s klientmi.

TIdTime a TIdTimeServer

Klientsky komponent je alternatívou komponentu TIdSNTP na určenie času. Je dôležité poznamenať, že formáty týchto dvoch protokolov sú odlišné. TIdTime je založený na formáte RFC 868 (vracia čas v internom štandarde OS UNIX a vykonáva všetky potrebné konverzie). Komponent servera funguje podobne ako server DayTime. Môže byť použitý na implementáciu časovej služby na lokálny počítač. Nevyžaduje sa žiadny ďalší kód, stačí vytvoriť inštanciu TIdTimeServer, ktorá vráti čas vnútorných hodín serverového počítača.

TIdTrivialFTP a TIdTrivialFTPServer

Tieto komponenty sú potrebné na organizáciu jednoduchého protokolu prenosu súborov. Klientsky komponent tohto protokolu sa používa na pripojenie k inštancii zodpovedajúceho serverového komponentu. Protokol je určený pre súkromné, odľahčené, lokálne prípady prenosu súborov, napríklad v lokálnych sieťach alebo na načítanie (nahrávanie) smerovacích tabuliek do smerovačov. Vzhľadom na oslabené vlastnosti tohto protokolu sa jeho použitie neodporúča pri použití autentifikačných algoritmov alebo iných bezpečnostných mechanizmov. Hlavným účelom tohto protokolu je prenos súborov do hardvérového zariadenia za účelom jeho úpravy.

TIdTunnelMaster a TIdTunnelSlave

Komponenty tunela servera sa používajú v proxy serveroch na organizáciu viacerých logických pripojení cez jeden fyzický (tunel). Tieto triedy možno použiť na rôzne účely, napríklad na organizovanie tajného spojenia cez neutajované kanály.

TIdWhois a TIdWhoIsServer

Tento klientsky komponent sa pripája k akémukoľvek štandardnému serveru Whois, čo vám umožňuje získať informácie o doménach. Serverový komponent poskytuje základnú funkčnosť NIC servera.

Indy Rôzne

Stránka s paletou Indy Miscellaneous Components obsahuje BASE64, UUE, Quoted Printable a ďalšie bežné e-mailové komunikačné formáty, kódovače (MD2, MD4 a MD5) pre kryptografické štandardy používané na ukladanie hesiel a elektronické podpisy v nezvratnej (ťažko dešifrovateľnej) podobe, ako aj mnoho ďalších užitočných komponentov a utilít často používaných pri vývoji internetových aplikácií.

TIdAntiFreeze

Vzhľadom na blokové algoritmy komponentov Indy sa často zdá, že aplikácia je zaseknutá, kým pripojenie funguje. Na elimináciu použitia sekundárnych procesov (vlákna) pri organizovaní komunikácie, aby sa zabránilo zamrznutiu aplikácie, stačí umiestniť zadaný komponent do formulára.

Komponent funguje tak, že analyzuje požiadavky zo zásobníka TCP/IP protokolov a posiela správy do aplikácie počas oneskorenia, keď sú externé spojenia zablokované, čo vytvára ilúziu spusteného kódu. Keďže komponent ovplyvňuje blokované pripojenia iba pre hlavný proces, použitie TIdAntiFreeze v sekundárnych procesoch aplikácie sa nevyžaduje. Majte na pamäti, že komponent TIdAntiFreeze spomaľuje pripojenia, pretože hlavný proces je pravidelne prerušovaný kvôli spracovaniu správ. Z toho vyplýva, že je potrebné dbať na to, aby vyvíjaná aplikácia nestrávila príliš veľa času spracovaním správ, vrátane OnClick, OnPaint, OnResize atď. Do určitej miery to možno ovládať prostredníctvom vlastností triedy TIdAntiFreeze. Použitie tohto komponentu nie je povinné, ale umožňuje vám vyriešiť problém synchronizácie spojení s vizuálnym rozhraním aplikácie.

TIdDateTimeStamp

Trieda na vykonávanie matematiky dátumu a času súvisiaca so skutočnosťou, že internetové protokoly používajú rôzne formáty dátumu a času; okrem toho sa klienti a servery môžu nachádzať v rôznych časových pásmach.

TIDIPWatch

Je to komponent založený na časovači, ktorý neustále monitoruje zmeny v IP adrese počítača. Udalosti komponentov nastanú, keď sa zistí zmena. Tento komponent sa zvyčajne používa na zistenie, či je počítač pripojený k internetu alebo inej sieti. Zmena adresy IP v tejto situácii môže nastať v dôsledku pridelenia adresy IP serverom DHCP (Dynamic Host Configuration Protocol) pri pripájaní k novej sieti.

TIdLogDebug

Účelom tohto komponentu je zachytiť udalosti akéhokoľvek komponentu klienta alebo servera a umiestniť záznam o udalosti zadaný súbor. Tento komponent je veľmi užitočný na ladenie komponentov Indy.

TIdMessage

Komponent sa používa v kombinácii s inými komponentmi na správne dešifrovanie alebo kódovanie správ. Môžu to byť komponenty POP, SMTP a NNTP. Trieda podporuje šifrovanie a dešifrovanie MIME, viacbajtové znaky a kódovanie ISO.

TIdNetworkCalculator

Jeden z mála komponentov Indy, ktorý možno použiť pri vytváraní aplikácií. Sieťovú kalkulačku možno použiť na výpočty IP adries vrátane sieťových masiek, podsiete, tried siete atď.

Predvolená hodnota TIdThreadMgr

Komponent štandardne poskytuje riadenie sekundárnych procesov. Vytvorí sa, keď akýkoľvek komponent Indy, ktorý podporuje riadenie procesov, nemá definovanú inštanciu triedy TIdThreadManager. Komponent poskytuje len základné možnosti na riadenie sekundárnych procesov: ich vytváranie a ničenie na požiadanie.

TIdThreadMgrPool

Pokročilejší komponent riadenia procesov ako TIdThreadMgrDefault, pretože procesy skôr spája, než aby ich na požiadanie vytváral alebo ničil.

TIdVCard

VCard je elektronický ekvivalent vizitky a môže obsahovať osobné informácie a grafické údaje majiteľa.

TIdIMFDecoder

Určené na dekódovanie internetových správ. Je to potomok triedy TIdCoder, rovnako ako všetky ostatné komponenty kódovača. Trieda TIdCoder sa dekóduje podľa štandardu internetového formátu textových správ ARPA RFS-822, ktorý bol navrhnutý v auguste 1982, a štandardu správ USENET RFC 1036, ktorý bol navrhnutý v decembri 1987.

Komponent rozširuje triedu TIdCoder tak, aby umožňovala detekciu formátu RFS-822 podľa kontextu hlavičky, pričom poskytuje režim dešifrovania pri príjme a šifrovanie a dešifrovanie MIME. Komponent TIdIMFDecoder sa používa v triede TIdMessageClient na dekódovanie prijatých a odoslaných správ.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder vám umožňuje dešifrovať text v zadanom formáte. Môže slúžiť ako samostatný komponent so špecifikovaným typom kódovania, čo umožňuje prenos správ obsahujúcich nový typ kódovania.

Kódovač TIDBase64

Implementuje ďalší šifrovací algoritmus, ktorý umožňuje prenášať netlačiteľné znaky.

TIdUUEncoder

Implementuje jeden z prvých šifrovacích algoritmov, kódovanie UU. Niekedy sa používa pri odosielaní článkov do spravodajskej služby.

TIdXXEncoder

Táto metóda šifrovania sa pravdepodobne nikdy nepoužije. V podstate ide o rovnaké kódovanie UU, ale s inou šifrovacou tabuľkou.

TIDCoderMD2

Komponenty s rôznymi typmi šifrovacieho algoritmu MD (Message Digest). Všetky sú založené na náhodnom poradí, jednosmerné a nemajú žiadne dešifrovacie algoritmy.

Komponenty protokolových klientov a serverov je možné použiť na vývoj serverových a klientskych internetových aplikácií spolu so základnými (ClientSocket, ServerSocket) alebo namiesto nich a ďalšími komponentmi z palety Internet a Fastnet. Komponenty Indy nepoužívajú architektúru WebBroker, implementujúc nízkoúrovňovú podporu internetových protokolov a služieb priamo v ich zdrojovom kóde ( zdrojové kódy sú pripojené).

TIdConnectionInterceptOpenSSL a TIdServerInterceptOpenSSL

Protokol SSL - Secure Sockets Layer, ktorý zabezpečuje utajenie a spoľahlivosť komunikácie medzi dvoma aplikáciami, má dve vrstvy. Na nízkej úrovni viacvrstvového transportného protokolu (ako je TCP) je SSL záznamový protokol a používa sa na zapuzdrenie rôznych protokolov vyššej úrovne. Výhodou SSL je, že ide o nezávislý aplikačný protokol, no nad rámec SSL možno použiť aj protokol vyššej úrovne.

SSL poskytuje bezpečnosť komunikácie, ktorá má tri hlavné funkcie: poskytovanie dôverného spojenia; šifrovanie s verejný kľúč(používa sa na potvrdenie pravosti adresáta); podpora spoľahlivosti prenosu dát.

  • Symetrická kryptografia sa používa na šifrovanie dát (napr. DES, RC4 a pod.).
  • Digitálny podpis sa poskytuje pomocou asymetrického šifrovania verejným kľúčom (napríklad RSA, DSS atď.).
  • Spoľahlivosť komunikácie, prenos správ zahŕňa kontrolu integrity správy pomocou opravných kódov MAC, bezpečných hashovacích funkcií (napr. SHA, MD5 atď.) pomocou výpočtov MAC.

V kombinácii s HTTP a autentifikáciou servera poskytuje SSL potrebné funkciešifrovanie a ďalej udržiava vytvorené spojenie, dvojitá kontrola pravosti webového servera atď. Je dôležité pochopiť, že SSL chráni iba komunikáciu počas prenosu údajov a nenahrádza iné bezpečnostné mechanizmy.

Komponenty TIdConnectionInterceptOpenSSL a TIdServerInterceptOpenSSL poskytujú pripojenia na strane klienta aj na strane servera pomocou protokolu SSL. Treba poznamenať, že komponenty TIdConnectionInterceptOpenSSL a TIdServerInterceptOpenSSL sú dostupné iba v Delphi 6, ale nie v Kylixe. Je to spôsobené zložitosťou protokolu, ktorý je v prípade implementácie Windows založený na funkciách operačného systému.

Príklady použitia komponentov Indy možno nájsť v adresároch /Delphi6/Demos/Indy. Celkovo obsahuje knižnica Indy vo verzii 8.0 69 komponentov. Uvádza sa, že vo verzii 9.0 bude špecifikovaná knižnica obsahovať 86 komponentov. Všetky komponenty sú zjednotené a zahrnuté v Delphi 6 aj Kylixe, čo umožňuje ich použitie na vývoj multiplatformových aplikácií. Všetky komponenty Indy podporujú multithreading.

Komponenty Indy implementujú takmer všetky funkcie nachádzajúce sa v komponentoch Internet a Fastnet, ako je jasne znázornené v tabuľke.

Fastn a komponenty Indy komponenty Účel komponentov
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket Interakcia medzi dvoma počítačmi (klient a server) pomocou protokolu TCP/IP
2 TNMDayTime TIdDayTime, TIdDayTimeServer Opýtajte sa servera na aktuálny čas
3 TNMEcho TIdEcho, TIdEchoServer Používa sa na komunikáciu s odpoveďovým serverom
4 TNMFinger TIdFinger, TIdFingerServer Používa sa na získanie informácií o používateľovi z internetového vyhľadávacieho servera
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer Poskytnite prenos súborov pomocou protokolu FTP
6 TNMHTTP TIdHTTP, TIdHTTPServer Na výmenu údajov použite protokol HTTP
7 TNMMsgServ, TNMMsg Používa sa na prenos jednoduchých textových správ z klienta na server
8 TNMNNTP TIdNNTP, TIdNNTPServer Podporuje výmenu dát s news serverom
9 TNMPOP3 TIDPOP3 Používa sa na prijímanie e-mailov z poštového servera pomocou protokolu POP3
10 TNMSMTP TIDSMTP Používa sa na odosielanie e-mailov cez internetový poštový server
11 TNMStrm, TNMStrmServ Prenáša binárne dáta zapísané do streamu pomocou protokolu TCP/IP
12 TNMUDP TIdUDP, TIdUDPServer Prenos dát pomocou protokolu UDP
13 TpowerSock, TNMGeneralServer Triedy zapuzdrené komponentmi, ktoré sú základom pre písanie vašich vlastných klientov (Powersock) a serverov (NMGeneralServer)
14 Procesor TNMUU TIdUUEncoder, TIdUUDecoder Vykonajte prekódovanie binárne súbory do formátu MIME alebo UUENCODE
15 TNMURL Konvertuje reťazce na HTML formát a vykoná spätné prekódovanie

Výnimkou sú triedy ako TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL, ktoré buď implementujú zastarané protokoly, alebo majú funkcionalitu implementovanú vo veľkej skupine alternatívnych tried.

Na rozdiel od svojich predchodcov – komponentov Internet a Fastnet, však Indy obsahuje bohatšie serverové komponenty a komponenty na prekódovanie a šifrovanie dát, ako aj podporu autentifikácie (paleta Indy Misc). Ako je zrejmé z vyššie uvedenej tabuľky, hlavné protokoly a služby poskytuje nielen klient, ale aj serverové komponenty. Ide o časové služby, služby odozvy, získavanie používateľských informácií, ale aj protokoly HTTP, NNTP, UDP a dokonca aj najjednoduchšiu verziu FTP.

Niekoľko príkladov použitia komponentov Indy

V komponentoch Indy obsiahnutých v Delphi je IP adresa definovaná vo vlastnosti Host, zvyčajne iba v klientskych aplikáciách. Komponenty hosťované na serveri majú metódy, ktoré vám umožňujú spustiť alebo zastaviť dotazovanie príslušného portu – napríklad zmena vlastnosti Active komponentu IdTCPServer spustí alebo zastaví dotazovanie príslušného portu. Po nadviazaní spojenia medzi klientom a serverom môže začať prenos dát.

Komponenty Indy kladú veľký dôraz na bezpečnosť a spoľahlivosť pri práci s dátami. Napríklad komponent IdTCPClient má metódy Connect a Disconnect. Pomocou programovacej techniky, ako je kód uvedený nižšie, zo strany klienta:

S TCPClient začnite Connect; skúste lstMain.Items.Add(ReadLn); nakoniec Odpojiť; koniec; koniec;

a pomocou vlastnosti Connection odovzdanej ako parameter inštancii AThread triedy TIdPeerThread zo strany servera:

S AThread.Connection začnite WriteLn("Dobrý deň zo servera Basic Indy Server."); Odpojiť; koniec;

môžete počítať buď s normálnym vykonaním pripojenia, alebo so správnym spracovaním chýb.

Všimnite si metódy ReadLn a WriteLn zodpovedajúcich tried - podobajú sa štandardným I/O príkazom Pascalu. Toto je pocta technike programovania UNIX, kde sa väčšina systémových operácií vykonáva čítaním a zápisom do zodpovedajúcich súborov.

Rovnako ako komponenty Fastnet, triedy komponentov Indy majú udalosti, ktoré možno použiť na poskytovanie správy udalostí. Môžete napríklad zariadiť, aby sa správa zobrazila vo formulári pri pripájaní ku klientovi:

Procedure TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Poskytujúci klient ]"; koniec;

Indy poskytuje komponenty, ktoré implementujú protokoly s časťami klienta a servera, ktoré sú jedinečné pre túto knižnicu. Komponenty TIdGopherServer a TIdGopher vďaka metódam GetExtendedMenu, GetFile, GetMenu, GetTextFile na strane klienta a ReturnGopherItem, SendDirectoryEntry na strane servera pomáhajú prezerať súbory rôzne druhy vrátane tých, ktoré sú označené ako skryté, ako aj adresárov na vzdialený počítač(podobne ako to robí príkaz dir *.* operačný systém MS-DOS).

Pomocou komponentov IdSMTP a IdMessage si môžete jednoducho vytvoriť vlastnú webovú aplikáciu, ktorá dokáže odosielať poštu pomocou protokolu SMTP.

V tomto prípade je trieda IdMessage (jedna z 23 komponentov zo stránky Indy Misc) zodpovedná za generovanie správy, ktorá vyplýva z jej názvu, a IdSMTP je za organizáciu spojenia s poštovým serverom.

Technológia používaná v Indy využíva zamykanie operácií čítania a zápisu. Akákoľvek operácia pripojenia použitá v Indy čaká na dokončenie pripojenia. Pri práci s komponentmi klienta Indy zvyčajne musíte urobiť nasledovné:

  • požiadať o pripojenie k serveru;
  • zadávať požiadavky na čítanie a zápis na server (v závislosti od typu servera sa krok vykoná raz alebo sa mnohokrát opakuje);
  • ukončite pripojenie k serveru a odpojte sa.

Komponenty Indy sú navrhnuté tak, aby poskytovali ultra vysokú úroveň abstrakcie. Zložitosti a detaily zásobníka TCP/IP sú pred programátorom skryté, aby sa mohol sústrediť na danú úlohu.

Nasledujúci malý príklad ukazuje typickú reláciu klientskej fazule:

S IndyClient začnite Host:= "zip.pbe.com"; // Hostiteľ na volanie Port:= 6000; // Port na volanie servera na Connect; skúste // Váš kód sa dostane sem konečne Disconnect; koniec; koniec;

V tomto príklade, aj keď sa spojenie so serverom nevytvorí, spojenie bude plynulo ukončené z dôvodu použitia príkazu try-finally.

Komponenty servera Indy popisujú rôzne modely serverov, ktoré možno použiť v závislosti od vašich potrieb a protokolu, ktorý používate.

TIdTCPServer je najčastejšie používaný serverový komponent, ktorý vytvára sekundárny proces nezávislý od hlavného aplikačného procesu. Vytvorený proces čaká na prichádzajúce požiadavky od potenciálnych klientov. Pre každého klienta, na ktorého požiadavku reaguje, je vytvorený individuálny sekundárny proces. Udalosti, ktoré sa vyskytnú počas procesu údržby, súvisia s kontextom príslušných procesov.

Inými slovami, pre každé pripojenie klienta trieda TIdTCPServer používa jedinečné sekundárne vlákno volaním obsluhy udalosti OnExecute daného vlákna. Formálnym parametrom metódy OnExecute je odkaz na inštanciu triedy Athread zodpovedajúcej vytvorenému vláknu. Vlastnosť Connection tejto triedy je odkazom na triedu TIdTCPConnection, ktorej inštancia je vytvorená na spracovanie požiadavky klienta. TIdTCPConnection podporuje čítanie a zápis cez pripojenie, ako aj vytvorenie a ukončenie komunikačnej relácie.

Protokol UDP funguje bez predchádzajúceho nadviazania spojenia so serverom (každý odoslaný paket je nezávislá množina údajov a nie je súčasťou väčšej relácie alebo spojenia). Zatiaľ čo TIdTCPServer vytvára samostatné vlákna pre každé pripojenie, TIdUDPServer používa hlavné vlákno alebo jedno sekundárne vlákno, ktoré spracováva všetky požiadavky protokolu UDP. Keď je TIdUDPServer aktívny, vytvorí sa vlákno na počúvanie prichádzajúcich paketov UDP. Pre každý prijatý paket sa vyvolá udalosť OnUDPRead buď v hlavnom vlákne alebo v kontexte počúvajúceho vlákna, v závislosti od hodnoty vlastnosti ThreadedEvent. Keď sa ThreadedEvent vyhodnotí ako False, udalosť nastane v hlavnom vlákne, inak sa vyskytne v počúvacom vlákne. Počas spracovania udalosti sú ostatné operácie servera zablokované. Preto je dôležité zabezpečiť, aby postupy OnUDPRead prebiehali čo najrýchlejšie.

Ak potrebujete vytvoriť novú klientsku aplikáciu pre existujúci server pomocou existujúceho protokolu, vašou úlohou je výlučne vyvinúť a ladiť klientsku aplikáciu. Keď však musíte rozvíjať aj klienta a serverová aplikáciaČi už používame existujúci alebo nový protokol, čelíme klasickému problému „sliepky a vajce“. Kde začať s programovaním – od klienta alebo zo servera?

Je zrejmé, že klient aj server musia byť nakoniec vytvorené. Pre mnohé aplikácie, najmä tie, ktoré používajú textový protokol (napríklad HTTP), je jednoduchšie začať zostavovať aplikáciu návrhom servera. A na ladenie existuje pohodlný klient, ktorý už existuje. Toto je aplikácia konzoly Telnet, ktorá je dostupná v systéme Windows aj UNIX.

Ak napíšete konzolu príkaz telnet 127.0.0.1 80 s IP adresou lokálneho počítača a číslom portu 80, ktorý štandardne používajú webové servery, potom aplikácia odpovie textom zobrazeným na obr. 6, v prípade operačného systému Windows 2000 a IIS 5.0.

Na vytvorenie najjednoduchšieho servera pomocou komponentov Indy potrebujete:

Ak potrebujete navrhnúť server, ktorý bude nielen správne informovať svojich klientov o strate spojenia, ale poskytne im aj informácie o chybových situáciách, ktoré sa vyskytli, použite príkaz try-except namiesto try-finally - napríklad ako zobrazené v nasledujúcom príklade:

Procedure TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: reťazec; začnite s AThread.Connection skúste skúsiť s:= ReadLn; // Tu vykonajte úlohu servera // ak nie je vyvolaná žiadna výnimka, // vypíšte odpoveď servera WriteLn(s); okrem e: Výnimka do begin WriteLn(e.Message); end; //on end; //skús okrem konečne Disconnect; end; end;

Tento malý príklad ukazuje kroky na vytvorenie jednoduchého textového servera, ako aj spôsob jeho ladenia.

Vyššie popísaný server je typickým príkladom organizácie moderných distribuovaných výpočtov.

Funkcie vytvárania viacvrstvových aplikácií

V poslednej dobe sa na uspokojenie požiadaviek klientov čoraz viac používa viacero serverov. Server tohto typu, ktorý prijal požiadavku klienta a čiastočne ju pripravil na ďalšie spracovanie, kontaktuje iný server a odošle mu transformovanú požiadavku alebo požiadavky. Server druhej vrstvy môže zase komunikovať s inými servermi. Môžeme teda hovoriť o viacvrstvovej architektúre servera.

Ďalej vytvoríme dátový prístupový server, ktorého účelom je vracať dáta z databázy. Tento server však nečíta ani nezapisuje priamo do databázových súborov. Namiesto toho komunikuje s databázovým serverom pri hľadaní údajov požadovaných klientom.

Začneme teda vyvíjať aplikáciu s trojvrstvovou architektúrou. Na vytvorenie databázového servera pomocou komponentov Indy potrebujete:

  1. Vytvorte nový projekt.
  2. Umiestnite na hlavná forma inštancia projektu komponentu TIdTCPServer z palety serverov Indy.
  3. Nastavte vlastnosť DefaultPort inštancie triedy TIdTCPServer1 na 6001 (odporúča sa priradiť veľké hodnoty, aby ste sa vyhli duplikácii čísel portov v rôznych aplikáciách) a nastavte vlastnosť Active na true.
  4. Pridajte nový modul do projektu výberom položky Súbor | Nový | Data Module a umiestnite naň inštancie komponentov SQLConnection a SQLDataSet zo záložky dbExpress na palete komponentov.
  5. Nastavte vlastnosť ConnectionName triedy SQLConnection na IBLocal a LoginPrompt na hodnotu False. Ak ste nenakonfigurovali IBLocal v databáze zamestnanec.gdb, vykonajte najskôr tento postup.

Ahojte všetci!

Pri vývoji ďalšieho webového projektu vyvstala úloha - implementovať klientsky softvér v Delphi, ktorý by prenášal dáta na server metódou POST. Aplikácia musí preniesť text a nahrať súbory na webový server.

Implementácia takéhoto odosielania údajov pomocou jazykov na strane servera vývoj webových aplikácií(napríklad PHP) je pomerne jednoduché, ale ak potrebujete napísať softvér pre viacerých používateľov, ktorý je založený na aplikácii, ktorý interaguje so serverom, potom je to trochu komplikovanejšie. Metóda priameho pripojenia k databáze a cez FTP k serveru od Delphi už nie je potrebná, pretože nie je bezpečný, nespoľahlivý (zmena hesiel, údajov o pripojení atď.) a vytvára ďalšie. problémy s kompatibilitou softvéru na strane klienta. Na vyriešenie problému som sa rozhodol napísať skripty (serverová časť) v PHP, ktoré budú spracovávať prichádzajúce žiadosti POST a vrátiť výsledok klientovi (aplikácia Delphi). Výhodou tohto prístupu je, že všetky pripojenia a spracovanie údajov prebieha na serveri, čo je oveľa bezpečnejšie ako priame „pripojenie“.

Keď som začal googliť, veľa roztrúsených informácií sa vzdalo, väčšinou na fórach, ale všetko bolo v kusoch. Jedna vec bola istá, že sa použije Indy, a to komponent IdHTTP s implementovanou metódou POST. V skutočnosti je všetko jednoduché, túto metódu berie dva parametre Url zdroja a DataStream (dátový tok) a vráti výsledok v textovej forme (môže to byť aj HTML kód stránky). Hlavná vec bola správna tvorba DataStreamu (prúdu prenášaných údajov), ale po ceste sa objavili ďalšie úskalia, konkrétne ruské kódovanie (ak by nebolo dobré). Tu sa začala zábava na niekoľkohodinovom blúdení po internete. Vo všeobecnosti dosť klebetenia, prejdime k nácviku a implementácii softvéru.

Program je teda jednoduchý. Musí odoslať údaje na server pomocou metódy POST, údaje obsahujú " Smerovanie " (riadok), " Popis » ( viacriadkový text) A grafický súbor(binárne dáta jpg, png, gif). Server musí tieto údaje prijať, spracovať, uložiť grafický súbor na server a vrátiť odpoveď. Ako odpoveď vrátime do aplikácie Delphi, rovnaký text len ​​s pridanými menovkami a odkazom na stiahnutý súbor. Nič viac.

Začnime s implementáciou serverovej časti (podobne ako API stránky). Otvorte ľubovoľné textový editor(poznámkový blok) a napíšte do neho nasledujúci kód:

"; ) else ( echo "Titul: Chýba"."
"; ) //Skontrolujte prichádzajúce údaje na prítomnosť údajov poľa "obsah" if (!empty($_POST["obsah"]))( echo "Obsah: ".$_POST["obsah"]."
"; ) else ( echo "Obsah: chýba"."
"; ) //Skontrolujte prichádzajúce údaje na prítomnosť priloženého súboru "súbor" if (!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /získať informácie o súbore (názov, prípona atď.) //Skontrolujte typ súboru v zozname povolených typov (IMPROVIZÁCIA:)) if (stripos("jpgpnggif",$finfo["prípona"] )==0)( echo ">>>>>>>Neplatný typ súboru<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

Poznámka! Pri ukladaní (cez poznámkový blok) musíte zadať kódovanie „UTF-8“, inak budú problémy so zobrazením azbuky!

Scenár sa snažil poskytnúť podrobné komentáre. Skopírujte tento skript na váš webový server, ak ho nemáte, môžete na test použiť môj skript, ktorý sa nachádza na adrese: http://api..php

Rozloženie využíva tieto komponenty: Label, Button (2 ks), Edit (2 ks), Memo (2 ks), CheckBox, OpenDialog, IdHTTP. Uveďte nasledujúce názvy komponentov (vlastnosť „ názov”):

  1. Upraviť (názov) – Meno=titul;
  2. Upraviť (cesta k súboru) Meno = imgfile;
  3. Poznámka (obsah)Meno = obsah;
  4. Poznámka (výsledok) – Meno = odpoveď;
  5. Tlačidlo (…) – Meno = chkfile;
  6. Tlačidlo (POST) – Meno = PostBut;
  7. OpenDialog (dialógové okno výberu súboru) – Názov = PictDialog;

Nechajme IdHTTP1 a CheckBox1 bez zmeny (unavení! :)))).

Aby sa náhodou nestalo" upraviť» cesta k úprave( imgfile), nastavte jeho vlastnosť ReadOnly na True. Rovnako tak pri imgfile A chkfile Nastavte vlastnosť Enabled na hodnotu false. Budeme ich aktivovať pomocou CheckBoxu, t.j. Poskytneme vám možnosť vybrať si, či chcete nahrať obrázok alebo nie.

Pre OpenDialog( PictDialog) musíte nastaviť filter (vlastnosť Filter) takto:

Skutočná vizuálna príprava je u konca! Začnime kódovať!

V projekte vygenerujeme dátový tok pomocou typu zahrnutého v Indy - TidMultiPartFormDataStream. Aj keď sme narazili na možnosti implementácie pomocou TStream, práca s TidMultiPartFormDataStream – jednoduchšie!

Aby sme tento typ sprístupnili nášmu projektu, musíme pridať nasledujúcu knižnicu do Use: IdMultipartFormData.

Pre CheckBox1 vytvorte udalosť OnClick (dvojitým kliknutím myšou na objekt) a pridajte do tejto udalosti nasledujúci kód:

Procedure TForm1.CheckBox1Click(Sender: TObject); begin //aktivácia alebo deaktivácia prvkov cesty k súboru a dialógových tlačidiel imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Schecked; koniec;

Tu aktivujeme objekty imgfile Achkfile v závislosti od prítomnosti začiarknutia (ak je začiarkavacie políčko začiarknuté, objekty sa stanú aktívnymi).

Teraz usporiadajme výber obrázkov. Ak to chcete urobiť, vytvorte na tlačidle udalosť OnClick chkfile(aj dvojitým kliknutím na objekt) a napíšte:

Procedure TForm1.chkfileClick(Sender: TObject); begin //otvorte dialógové okno a zadajte úplnú cestu k súboru do súboru imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; koniec;

Táto udalosť spustí dialógové okno výberu obrázka a ak používateľ klikne na „ OTVORENÉ“, potom bude pridaná cesta k tomuto súboru imgfile.

A teraz sa dostávame k poslednému tlačidlu „POST“. Vytvorte udalosť OnClick pre toto tlačidlo a pridajte nasledujúci kód:

Procedure TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; begin 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 //kontrola, či je súbor vybratý alebo nie začne ShowMessage("Musíte vybrať grafický súbor!"); VÝCHOD; koniec; if CheckBox1.Checked then dataPost.AddFile("file",imgfile.Text,""); //pridajte pole so súborom response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end;

Takže v poradí (aj keď existujú komentáre):

Datapost – objekt typu TIdMultiPartFormDataStream. Umožňuje vám vytvoriť štruktúru požiadavky POST pozostávajúcu z polí rôznych typov.

dataPost . AddFormField (" titul ", titul . Text ," utf -8 "). Content Transfer := " 8 trocha "; – pridá do DataPost pole s názvom „title“, hodnotu z „title.Text“, nastaví kódovanie prenášaných údajov na „utf-8“ (parameter je voliteľný, ale bez jeho explicitného označenia sa azbuka prenáša s otázniky „?“) a veľmi dôležitá metóda „Prenos obsahu“. Bez tejto metódy sa údaje odošlú na server " abrakadabra" Upozorňujeme, že názov poľa („názov“) na strane odosielateľa sa musí zhodovať s názvom uvedeným v skripte: $_POST["názov"].

Údaje sa prenášajú podobne ako v poli „obsah“.

dataPost . Pridať súbor (" súbor ", imgfile . Text ,"") – týmto riadkom vytvoríme stream s údajmi zo súboru.

To je všetko, údaje sa vygenerujú, zostáva ich len preniesť do skriptu na serveri a dostať odpoveď:

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

pretože TMemo nerozumie značke zalomenia riadku "
", pomocou funkcie " " ho nahradíme zrozumiteľnými zalomeniami riadkov "#13#10".

Keď je všetko dokončené, vymažte pamäť z objektu DataPost riadkom:

datapost.Free;

Aj keď v našom príklade sa to stane automaticky na konci postupu, ale stále...

Aktuálny výsledok programu na obrazovke:

Môžeme teda poslať na server toľko údajov alebo súborov, koľko chceme, spracovať tieto údaje na serveri a oznámiť aplikácii výsledok skriptu. Môže to byť dokonca len 0 alebo 1, čo signalizuje aplikácii, aby reagovala ďalej.

Všetky. Veľa šťastia všetkým. Dúfam, že informácie boli užitočné a že ich využijete.

Hotový príklad a skript si môžete stiahnuť.

Celý kód modulu:

Jednotka PostUnit; rozhranie používa Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPC IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; typ TForm1 = trieda(TForm) IdHTTP1: TIdHTTP; názov: TEdit; obsah: TMemo; PostBut: TButton; odpoveď: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; imgfile:TEdit; chkfile: TButton; Label4: TLabel; CheckBox1: TCheckBox; PictDialog:TOpenDialog; procedure PostButClick(Sender: TObject); procedure chkfileClick(Sender: TObject); procedure CheckBox1Click(Sender: TObject); súkromné ​​(Súkromné ​​vyhlásenia) verejné (Verejné vyhlásenia) koniec; var Form1: TForm1; implementácia ($R *.dfm) procedure TForm1.CheckBox1Click(Sender: TObject); begin //aktivácia alebo deaktivácia prvkov cesty k súboru a dialógových tlačidiel imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Schecked; koniec; procedure TForm1.chkfileClick(Sender: TObject); begin //otvorte dialógové okno a zadajte úplnú cestu k súboru do súboru imgfile(TEdit) if PictDialog.Execute then imgfile.Text:= PictDialog.FileName; koniec; procedure TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; begin 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 //kontrola, či je súbor vybratý alebo nie začne ShowMessage("Musíte vybrať grafický súbor!"); VÝCHOD; koniec; if CheckBox1.Checked then dataPost.AddFile("file",imgfile.Text,""); //pridajte pole so súborom response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end; end.