Delphi dasturi POST usuli (Indy) yordamida serverga ma'lumotlarni yuboradi. Delphida ishlatiladigan Indy komponentlari

Indy - bu turli xil tarmoq ilovalarini ishlab chiqishga imkon beruvchi juda kuchli komponentlar to'plami. Ushbu qo'llanmada men sizga TIdTCPClient va TIdTCPServer komponentlari yordamida mijoz-server ilovalarini qanday yaratishingiz mumkinligini aytib beraman.

Avvalo, men ushbu komponentlarning ikkita muhim afzalliklarini qayd etmoqchiman. Ulardan eng muhimi multithreadingdir, ya'ni server har bir mijoz uchun alohida trek yaratadi va bu, albatta, ko'p yadroli protsessorli kompyuterlarda server dasturining ishlashiga ta'sir qiladi. Ikkinchi afzallik - foydalanish qulayligi. Oddiy mijoz-server ilovasini yozish uchun 10-20 qator kod yetarli. Ushbu komponentlar to'plami standart Delphi yig'ilishlarida mavjud.

Keling, yozaylik oddiy dastur, bu sizga matnli xabarni mijozdan serverga o'tkazish imkonini beradi. Serverni yaratishni boshlaylik.
Formaning “Indy serverlari” yorlig‘idan IdTCPServer komponentini joylashtiramiz. Biz ushbu komponent uchun barcha sozlamalarni ish vaqtida shaklning OnCreate hodisasida qilamiz:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= rost;
Bu erda hamma narsa oddiy - biz server ishlaydigan portni ko'rsatamiz va serverning o'zini faollashtiramiz.

Mijozdan serverda ma'lumotlarni olish uchun "OnExecute" maxsus hodisasi mavjud. Ushbu hodisa quyidagicha ko'rinadi:

boshlanishi
oxiri;

Keling, tadbir mazmunini quyidagicha tahrir qilaylik:
protsedura TForm3.IdTCPServer1Execute(ACContext: TIdContext);
var
l:string; // biz qabul qiladigan satr o'zgaruvchisi
boshlanishi
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
oxiri;

Endi serverga xabar kelishi bilan uni l qatorli o'zgaruvchiga yozamiz va uni ko'p qatorli matn maydoniga chiqaramiz.

Bu, ajablanarli emas, serverni yaratishni tugatadi. Qolganini Indi biz uchun qiladi. Keling, mijoz dasturidan boshlaylik. U serverga ulanadi, unga xabar yuboradi va serverdan uziladi.

Keling, yarataylik yangi loyiha, IdTCPClient komponentini formaga joylashtiring, uni "Indy Clients" yorlig'ida topishingiz mumkin. Bundan tashqari, oddiy Tahrirlash va tugmani joylashtiramiz. Keling, tugma uchun OnClick hodisasi ishlovchisi yarataylik, uning ichida biz yozamiz:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect;
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect;

Bu kodni OnCreate hodisasiga joylashtirish shart emas. Agar xohlasangiz, ushbu kodni xohlagan joyga joylashtirishingiz mumkin.
Birinchi qatorda biz portni tayinlaymiz va biz server dasturida ko'rsatgan portni ko'rsatishimiz kerak, aks holda mijoz serverni topa olmaydi. Keyin biz serverning IP manzilini ko'rsatamiz. Serverning o'zi ham joylashgan bo'lishi mumkin mahalliy tarmoq, va masofadan turib. Ikkinchi holda, ulanish Internet orqali amalga oshiriladi va siz Internetda IP-manzilni ko'rsatishingiz kerak bo'ladi.

Men "127.0.0.1" manzilini ko'rsatdim, ya'ni server mijoz ishlayotgan kompyuterdir. Ushbu usul tarmoq ilovalarini sinab ko'rish uchun juda qulaydir.
Keyin biz ulanishni amalga oshiramiz, xabar jo'natamiz va aloqani uzamiz.Xatning o'zi kabi, siz IP-manzilni Edit-dan yoki istalgan qator o'zgaruvchisidan olishingiz mumkin.

Mijoz dasturi ustida ish ham yakunlandi. Ko'rib turganingizdek, Indy biz uchun juda katta vazifani bajaradi, bu hatto tajribasiz dasturchiga ham o'z tarmoq dasturini yaratishga imkon beradi.

UDP protokoli uzatish uchun juda yaxshi matnli xabarlar, ya'ni siz mahalliy suhbatlar va shunga o'xshash narsalarni tashkil qilishingiz mumkin. Men Delphida UDP bilan eng oddiy ish misolini keltirishga qaror qildim.

Bosqichma-bosqich ko'rsatma:

Men misol keltirdim, lekin meni kechiring, men har bir satrni yozmadim, chunki ... Men hech qanday murakkab narsani ko'rmayapman va har kim buni tushunishi mumkin.

Aslida, agar biror narsa tushunarsiz bo'lsa, menga savol berishingiz mumkin. Va bu erda haqiqiy kod:

foydalanadi
Windows, Xabarlar, SysUtils, Variantlar, Sinflar, Grafika, Boshqaruv elementlari, Shakllar,
Dialoglar, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

turi
TForm1 = sinf (TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
1-tugma: TB tugmasi;
Label1: TLabel;
protsedura FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
protsedura Button1Click(Sender: TObject);
protsedura IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
Qabul qilish: TIdSocketHandle);
xususiy
(Shaxsiy deklaratsiyalar)
ommaviy
(Ommaviy deklaratsiyalar)
oxiri;

var
Shakl 1: TForm1;

($R *.dfm)
[b]//Xabar yuborish tartibi
protsedurasi TForm1.Button1Click(Sender: TObject);
boshlanishi
harakat qilib ko'ring
IdUDPClient1.Active:= To'g'ri;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
agar IdUDPClient1.Connected keyin
boshlanishi
IdUDPClient1.Send(TimeToStr(Vaqt));
Label1.Caption:= "yaxshi";
oxiri;
IdUDPClient1.Active:= False;
Ovozli signal; signal; signal;
bundan mustasno
MessageDlg("Nimadir noto'g'ri ketdi =(", mtError, , 0);
oxiri;
oxiri;
[b]
// Yoqilgan o'chirilgan. Shaklni ishga tushirish va yopish paytida UDP serveri
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
boshlanishi
IdUDPServer1.Active:= False;
oxiri;

protsedurasi TForm1.FormCreate(Sender: TObject);
boshlanishi
IdUDPServer1.Active:= To'g'ri;
oxiri;

[b]//Ma'lumotlarni qabul qilishda server reaktsiyasi tartibi
protsedura TForm1.IdUDPServer1UDPRead(AThread: TIdUDPLlistenerThread;
AData: Tbayt; Qabul qilish: TIdSocketHandle);
Var
i: Integer;
s: string;
boshlanishi
s:= "";
harakat qilib ko'ring
i:= 0;
esa (AData[i] 0) bajaring
boshlanishi
s:= s + chr(AData[i]);
i:= i + 1;
oxiri;
nihoyat
Label1. Caption:= s;
oxiri;
oxiri;

Serj Dosyukov Mayk Pham

Ushbu maqola Indy to'plami va Delphi 7 yordamida mustaqil veb-xizmatni qanday yaratishni va Delphi 7 SOAP-ga asoslangan veb-xizmatlarini qo'llab-quvvatlash uchun Indy to'plamidan qanday foydalanishni ko'rsatadi. Orqada Qo'shimcha ma'lumot Veb-xizmatlarni yaratish haqida ma'lumot olish uchun Nik Xodjning Borland hamjamiyatining saytidagi ajoyib maqolasiga qarang: Internetdagi Shekspir.

Ertami-kechmi, siz mustaqil HTTP server bo'lgan va veb-xizmatlarni qo'llab-quvvatlaydigan server yaratishingiz kerak bo'lishi mumkin. Masalan, Delphi yordamida qurilgan n-darajali dastur uchun SOAP-ga asoslangan dastur serverini yaratishni xohlashingiz mumkin.

Kirish

Delphi-ning onlayn yordami juda yaxshi ketma-ket ko'rsatma veb-xizmat, MIDAS serverini (COM, DCOM modeli) yaratish haqida, lekin SOAP protokoli asosida mustaqil n-darajali MIDAS ilovasini yaratish haqida deyarli hech qanday ma'lumot yo'q.

Ilgari Deyv Nottage tomonidan nashr etilgan. Ushbu maqola Delphi 6-da SOAP-ni qo'llab-quvvatlagan holda veb-xizmatni qanday yaratish va Datamodule-ning SOAP interfeyslarini nashr etish qobiliyati haqida g'oyani tasvirlab berdi, ya'ni ushbu maqola sizga o'zingizning n-darajangizni qanday yaratishni o'rganishga imkon berdi. MIDAS tizimlari.

Borlandning Delphi 7 va yangi Indy to'plami ushbu funksiya uchun o'rnatilgan yordamga ega.

Biroq, o'rnatilgan yordamga qaramay, bu xususiyat hujjatlashtirilmagan.

Borland tarmoq konferensiyasidagi so'nggi xabarlar va Google serveri yordamida internetda qidirish mualliflarga Delphi 6 dan Delphi 7 ga mavjud kodni aylantirish usulini ishlab chiqish imkonini berdi. Lekin hamma narsaning o'z vaqti bor.

asosiy fikr; asosiy g'oya

Ushbu maqola uch qismli turkumning birinchi qismidir. U asosiy qoidalarni tavsiflaydi. Ikkinchi va uchinchi qismlar ba'zi muammolar va ularni hal qilish yo'llariga bag'ishlanadi. Keling, asosiy g'oyani tasvirlashni boshlaylik.

  • mustaqil HTTP serveri bo'lish;
  • Indy-dan platforma sifatida foydalaning;
  • SOAP protokoli orqali nashr qilishni qo'llab-quvvatlash;
  • SOAP/HTML asosida o'z n-darajali serveringizni yaratishga imkon beradigan SOAP DataModules-ni nashr etish imkoniyatiga ega bo'ling.

HTTP server va SOAP

Ko'p odamlar Indy-ni bilishadi va avval THTTPServer komponentlaridan foydalanganlar. Ushbu komponentni ariza shakliga qo'yish oson, lekin uni qanday qilib SOAPni qo'llab-quvvatlashingiz mumkin? "C:Program FilesBorlandDelphi7SourceIndy" katalogida siz IdHTTPWebBrokerBridge.pas faylini topishingiz mumkin. Aynan shu narsa sizga kerak.

Ushbu fayl Indy bajariladigan faylning bir qismi emas, shuning uchun uni joriy loyihangizga standart loyiha fayli sifatida kiritishingiz kerak. (Loyihani kompilyatsiya qilish uchun sizga IdCompilerDefines.inc fayli ham kerak bo'ladi.) Bu fayllar joriy loyiha katalogiga ko'chirilishi kerak. Tezlikni oshirish uchun kodni o'zgartirish talab qilinishi mumkin, shuning uchun bu fayllarni Indy tarqatilishidan alohida saqlash yaxshidir.

Quyida TIdHTTPWebBrokerBridge deb nomlangan SOAP paketlarini qo'llab-quvvatlash uchun kengaytirilgan THTTPServer o'rnini bosuvchi komponentni amalga oshirish tasvirlangan. Bu konstruksiya TCustomHTTPServer-dan meros bo'lib, asosiy so'rovlarni bog'lashni qo'llab-quvvatlaydigan sinfdir.

Ushbu sinfga palitradan kirish imkoni bo'lmagani uchun kodingizni bajarishda uni oddiy ob'ekt sifatida belgilashingiz kerak bo'ladi.

Ushbu ob'ekt oddiy THTTPServer bilan bir xil tarzda ishlatilishi mumkin, SOAP bilan ishlashni ta'minlaydigan qo'shimcha xususiyatlar bundan mustasno.
Biroq, avval kerakli kodni tayyorlashni ko'rib chiqaylik.

WebBroker va Indy

Ilgari veb-xizmatlarni yaratganlar uchun siz foydalanayotganingizni bilasiz WebBroker. Delphi 7, Delphi 6 kabi, SOAPni qo'llab-quvvatlash uchun WebBroker arxitekturasidan foydalanadi.

Shuning uchun siz modul yaratishingiz kerak TWebModule va unga quyidagi uchta komponentni joylashtiring: THTTPSoapDispatcher, THTTPSoapPascalInvoker va TWSDLHTMLPublish. Ularning barchasi komponentlar palitrasining WebServices yorlig'ida mavjud. SOAPDispatcherni SOAPPascalInvoker bilan bog'lagandan so'ng, ariza shakli tayyor. Yakuniy natija quyidagi rasmda ko'rsatilganidek bo'lishi kerak:

(uWebModule.pas moduli)

Hamma narsani avvalgidek qoldirgan ma'qul, chunki bu forma uchun maxsus kodni o'zgartirish yoki bajarish shart emas.

WebModule va Indy

HTTP serverini amalga oshirish uchun zarur bo'lgan kodning boshqa qismiga o'tamiz.

Ko'rib turganingizdek, TIdHTTPWebBrokerBridge-da RegisterWebModuleClass usuli mavjud bo'lib, u sizga o'z WebModuleingizni ro'yxatdan o'tkazish va uni serverga taqdim etish imkonini beradi.

Shunday qilib, fServer server ob'ektini yaratgandan so'ng, fServer.RegisterWebModuleClass (TwmSOAPIndy) sinfiga qo'ng'iroq qilish kifoya.

Eslatma. TIdHTTPWebBrokerBridge-ning normal amalga oshirilishida har safar so'rov qabul qilinganda TwmSOAPIndy ob'ekti yaratiladi. Bu kerak emasligi aniq. Shuning uchun sinf doimiy yaratilishini ta'minlash uchun o'zgartirilishi mumkin ushbu ob'ektdan Server obyekti mavjud ekan. Qo'shimcha ma'lumot olish uchun sinfni amalga oshirish hujjatlariga murojaat qilish tavsiya etiladi.

Server tayyormi?

Delphi 6 da ishlatiladigan Indy komponentlari.

Asosiy Internet xizmatlari va protokollaridan tashqari, ko'pincha Internet-ishlab chiquvchilar tomonidan qo'llaniladigan qo'shimcha xizmatlarning keng doirasi mavjud. Bundan tashqari, brauzer yordamida ma'lumotni ko'rsatish qobiliyati har doim ham Internet ilovalari uchun maqbul echim emas. Bunday holda, ma'lumotlar almashinuvi uchun Internet infratuzilmasidan foydalanish va masalan, Delphida ishlab chiqilgan yanada murakkab mijoz ilovalari orqali ma'lumotlarni ko'rsatishni ta'minlash maqsadga muvofiqdir.

Aytaylik, standart Web-serverlarga kiritilmagan ixtisoslashtirilgan server mantiqini amalga oshirish kerak. Ushbu sinfdagi muammolarni hal qilish uchun Delphi Nevrona Designs kompaniyasining Internet Direct (Indy) kutubxonasini o'z ichiga oladi (http://www.nevrona.com/Indy/). Borland Delphi uchun maxsus ishlab chiqilgan ushbu kutubxonada allaqachon sakkizta versiya mavjud bo'lib, ularning oxirgisi kiritilgan yangi versiya Delphi. Komponentlar to'plami uch guruhga bo'lingan: mijoz (Indy Client), server (Indy Servers) va yordamchi (Indy Misc).

Indy mijozlari va Indy serverlari

Ko'pchilik Indi komponentlari Mijoz va Indy serverlari protokollar va xizmatlarning mijoz va server qismlariga mos keladigan juftliklardir (alohida, asosan TunnelMaster va TunnelSlave kabi serverga asoslangan komponentlar bundan mustasno) va TCP/IP, UDP kabi protokollardan foydalanishga ruxsat beradi. NNTP, SMTP, FTP , HTTP, shuningdek, ECHO, FINGER, WHOIS va boshqalar xizmatlari.

Indy mijoz komponentlari rozetkalar yordamida yoziladi. Mijoz tomonidagi soket serverga ulanishni talab qiladi. Agar ulanish o'rnatilsa, mijoz va server xabar almashishni boshlashlari mumkin. Bu xabarlar boshqa xarakterga ega, lekin odatda almashish ma'lum bir protokol (masalan, HTTP) yordamida amalga oshiriladi.

TIdTCPClient va TIdTCPServer

Ushbu komponentlar asosiy tarmoq protokollaridan biri - TCP (Transmission Control Protocol) ni qo'llab-quvvatlash uchun ishlatiladi, shuningdek, TIdSMTP va TIdFTP komponentlari uchun asosiy sinflardir. TIdTCPServer klassi standart nolga teng bo'lgan ThreadMgr xususiyatiga ega. TIdTCPServer yoqilganda ThreadMgr nolga teng bo'lsa, TIdThreadMgrDeafault klassi bilvosita yaratiladi. Aks holda, o'rnatilgan jarayon menejeri ishlatiladi.

TIdUDPClient va TIdUDPServer

Ushbu komponentlar qo'llab-quvvatlash uchun ishlatiladi tarmoq protokoli UDP (User Datagram Protocol) va boshqa bir qator Indy komponentlari uchun asosiy sinflardir.

TIdChargenServer

Komponent tasodifiy belgilarni yaratish uchun ishlatiladi, odatda sinov maqsadlarida.

TIdDayTime va TIdDayTimeServer

Komponentlar vaqt xizmatini ta'minlash uchun ishlatiladi. Mijoz so'raydi va server joriy sana va vaqt haqida xabar beradi.

TIdDNSResolver

Bu DNS (Domain Name Service) serveridan so'rovlarga xizmat qiluvchi mijoz komponentidir. DNS server so'rovlari kompyuter nomini uning IP manzili bilan almashtirish uchun mo'ljallangan. TIdDNSResolver TIdUDPClient sinfining avlodidir.

TIdDICTserver

Lug'at server protokolini (DICT) qo'llab-quvvatlaydigan server komponenti, mijozga tabiiy til lug'atiga kirish imkonini beruvchi TCP protokoliga asoslangan server tomonidagi lug'at.

TIdDISCARDServer

Yozuvlar serverini qo'llab-quvvatlaydigan server komponenti. Yozuvlar disk raskadrovka va o'lchash vositasi sifatida ishlatilishi mumkin. Yozuvlar xizmati har qanday ma'lumotni qabul qilishni istagan kishiga oddiygina topshiradi.

TI deEcho va TI dECHOServer

Komponentlar odatda tarmoqning sog'lig'ini tekshirish uchun ishlatiladigan javob xizmatini taqdim etish uchun mo'ljallangan. Mijoz serverga matnli xabar yuboradi, server xabarni mijozga qaytaradi. Agar xabar buzilgan bo'lsa, tarmoq noto'g'ri ishlaydi.

TIdFinger va TIdFingerServer

Komponentlar foydalanuvchiga tizimdagi boshqa foydalanuvchilar mavjudligi to'g'risidagi ma'lumotlarni so'rash imkonini beruvchi protokolni taqdim etish uchun mo'ljallangan. Ba'zi serverlar bunday mijoz so'rovlarini bajaradi. Ushbu juft komponentlardan foydalanish tizimda boshqa foydalanuvchilarning mavjudligini aniqlaydigan mijoz so'rovlariga xizmat ko'rsatish imkonini beradi.

Komponent fayl uzatish protokoli - FTP (Fayl uzatish protokoli) uchun to'liq yordamni o'z ichiga oladi. Passiv va faol ma'lumotlarni uzatish, shuningdek, GET va PUT, kataloglarni o'chirish, kvotalar, fayl va katalog o'lchamlarini olish kabi operatsiyalar qo'llab-quvvatlanadi. TI dFTP ishlash uchun TIdSimpleServer sinfidan foydalanadi. FTP faylini uzatish davom etayotganda, ma'lumotlarni uzatish uchun ikkilamchi TCP ulanishi ochiladi va ma'lumotlar uzatilganda yopiladi. Ushbu ulanish "ma'lumotlar havolasi" deb ataladi, har bir uzatiladigan fayl uchun noyobdir.

TIdGopher va TIdGopherServer

Ushbu komponentlar almashtirilgan tarmoq protokolini ta'minlash uchun mo'ljallangan Yaqinda WWW dan ( Butun dunyo Web) HTTP protokoli. Ushbu protokolni amalga oshiradigan server ierarxik taqsimlangan hujjat oqimini qo'llab-quvvatlash tizimini ta'minlaydi. DemosindyGopherClient va demosindy GopherServer katalogida joylashgan ushbu juft komponentlardan foydalanish misoli ushbu protokol yordamida qanday qilib mahalliy tarmoqda kompyuteringizda joylashgan fayllar, shu jumladan yopiq fayllar haqida ma'lumot berishingiz mumkinligini ko'rsatadi.

TIdHostNameServer

Mahalliy server nomini mijozlarga o'tkazish uchun mo'ljallangan server komponenti.

TIdHTTP va TIdHTTPServer

Komponentlar HTTP tarmoq protokolini ta'minlash uchun ishlatiladi (1.0 va 1.1 versiyalari, shu jumladan GET, POST va HEAD operatsiyalari qo'llab-quvvatlanadi). Bundan tashqari, autentifikatsiya va proksi-serverlardan foydalanish uchun yordam ko'rsatiladi. Server komponenti berilgan protokolni qo'llab-quvvatlaydigan boshqa veb-serverga xizmatlar ko'rsatish uchun ishlatiladi. TIdHTTPServer cookie fayllari, davlat boshqaruvi va boshqalar kabi funktsiyalarni amalga oshirishni osonlashtiradi.

TIdIcmpClient

Ping operatsiyalari va tarmoqni kuzatish uchun foydalaniladigan Internet boshqaruv xabari protokolini (ICMP) ta'minlash uchun mo'ljallangan mijoz komponenti.

Pochta bo'limi protokolini (POP) ta'minlash uchun mo'ljallangan mijoz komponenti, shu jumladan MIME kodlash va dekodlash va ko'p baytli belgilarni uzatishni qo'llab-quvvatlash.

TIdIMAP4 Server

Serverda IMAP (Internet Message Access Protocol) operatsiyalarini qo'llab-quvvatlash uchun mo'ljallangan server komponenti. Protokol sizga xabarlarni qidirish imkonini beradi Elektron pochta serverda. IMAP va POP protokollarining farqi shundaki, POP protokoli talab qiladi qo'shimcha xotira ma'lumotlarni saqlash uchun va IMAP protokoli mijoz mashinasi o'rniga serverga kiradi. IMAP4 POP3 o'rnini egallash uchun yaratilgan, ammo POP3 bugungi kungacha keng qo'llaniladigan standart bo'lib qolmoqda.

TIdIRCSserver

Internetdagi eng ko'p ishlatiladigan xizmat operatsiyalarini qo'llab-quvvatlash uchun mo'ljallangan server komponenti, odatda chat deb ataladi. Komponent asosni ta'minlaydi qurilish bloklari IRC (Internet Relay Chat) serveri uchun.

TIdMappedPortTCP

Ko'pincha proksi-serverlarda ishlatiladigan xaritalangan portlarni yaratish uchun mo'ljallangan server komponenti. Ushbu komponentning usullari bir portni boshqasiga joylashtirish imkonini beradi. Misol uchun, 80-portni 3000-portga solishtirish mumkin va birinchi portga (80-port) barcha so'rovlar ikkinchi portga (port 3000) yo'naltiriladi.

TIdNNTP va TIdNNTPServer

Ushbu komponentlar yangiliklar xizmatlarida qo'llaniladigan Network News Transfer Protocol (NNTP) ni qo'llab-quvvatlash uchun talab qilinadi. Mijoz komponenti MIME kodlash va dekodlashni qo'llab-quvvatlashni, shuningdek, ko'p baytli belgilar va muqobil kodlashni qo'llab-quvvatlashni o'z ichiga oladi. Server komponenti yangiliklar serverlarini yaratish imkonini beradi. Shuni ta'kidlash kerakki, TIdNNTPServer to'liq xususiyatli yangiliklar serveri emas, balki bunday server uchun asosiy funksionallikni ta'minlovchi komponent hisoblanadi.

TIdQOTD va TIdQOTDServer

Komponentlar "Kunning taklifi" xizmatini taqdim etish uchun ishlatiladi. Mijoz komponenti kunlik taklifni olish uchun server komponenti namunasiga ulanadi. Har bir server misolida noyob iqtiboslar bazasi mavjud.

Simple Mail Transfer Protocol (SMTP) ilovalarida foydalanish uchun mo'ljallangan mijoz komponenti autentifikatsiya, MIME kodlash va dekodlash hamda ko'p baytli belgilarni qo'llab-quvvatlashni ta'minlaydi.

SNTP (Simple Network Time Protocol) - vaqt xizmatini taqdim etish uchun mo'ljallangan mijoz komponenti. Aniqlash uchun istalgan vaqt xizmatiga ulanish uchun foydalanish mumkin joriy sanalar va vaqt.

TIdSimpleServer

Yengil TCP serverini ta'minlovchi server komponenti. Nuqtadan nuqtaga ulanishni tashkil qilish imkonini beradi. U bitta foydalanuvchi bilan serverlar yaratish uchun ishlatiladi, ya'ni bir vaqtning o'zida faqat bitta ulanishga xizmat qilishi mumkin. TIdTCPServer komponentidan farqli o'laroq, u mijozlar so'rovlarini kutish va ushbu so'rovlarni qayta ishlashda ikkilamchi jarayonlarni yaratmaydi. Boshqacha qilib aytadigan bo'lsak, agar server mijozning so'roviga xizmat qilsa va o'sha paytda boshqa mijoz ulanish uchun u bilan bog'lansa, u birinchi so'rovni qayta ishlash tugaguniga qadar bloklanadi.

TIdTelnet va TIdTelnetServer

Mijoz komponenti boshqa kompyuterda masofaviy seanslarni, jumladan, konsol muzokaralari va autentifikatsiyani tashkil qilish uchun ishlatiladi. Aloqa protokoli server bilan interaktiv aloqada bo'lgan shaxsning mavjudligini nazarda tutadi. Mijoz komponentida displeyni qo'llab-quvvatlash yoki terminal emulyatsiyasi mavjud emas, faqat server qismiga ulanishni ta'minlaydi. Odatda, TIdTelnetServer server protokoli mijozlar bilan interaktiv o'zaro aloqa qilish uchun matn interfeysi bilan masofaviy ma'lumotlar bazalarini tashkil qilish uchun ishlatiladi.

TIdTime va TIdTimeServer

Mijoz komponenti vaqtni aniqlash uchun TIdSNTP komponentiga muqobildir. Shuni ta'kidlash kerakki, ikkala protokolning formatlari har xil. TIdTime RFC 868 formatiga asoslangan (barcha kerakli konversiyalarni amalga oshirgan holda ichki UNIX OS standartida vaqtni qaytaradi). Server komponenti ishlash jihatidan DayTime serveriga o'xshaydi. Vaqt xizmatini amalga oshirish uchun foydalanish mumkin mahalliy kompyuter. Hech qanday qo'shimcha kod talab qilinmaydi, shunchaki server kompyuterining ichki soati vaqtini qaytaradigan TIdTimeServer namunasini yarating.

TIdTrivialFTP va TIdTrivialFTPServer

Ushbu komponentlar oddiy fayl uzatish protokolini tashkil qilish uchun zarur. Ushbu protokolning mijoz komponenti mos keladigan server komponentining nusxasiga ulanish uchun ishlatiladi. Protokol, masalan, mahalliy tarmoqlarda yoki marshrutlash jadvallarini marshrutizatorlarga yuklash (yuklash) uchun fayllarni uzatishning xususiy, engil, mahalliy holatlari uchun mo'ljallangan. Ushbu protokolning zaiflashgan xarakteristikalari tufayli autentifikatsiya algoritmlari yoki boshqa xavfsizlik mexanizmlaridan foydalanishda undan foydalanish tavsiya etilmaydi. Ushbu protokolning asosiy maqsadi fayllarni apparat qurilmasiga o'zgartirish maqsadida o'tkazishdir.

TIdTunnelMaster va TIdTunnelSlave

Server tunnel komponentlari proksi-serverlarda bir fizik (tunnel) orqali bir nechta mantiqiy ulanishlarni tashkil qilish uchun ishlatiladi. Ushbu sinflar turli maqsadlarda, masalan, maxfiy bo'lmagan kanallar orqali maxfiy ulanishni tashkil qilish uchun ishlatilishi mumkin.

TIdWhois va TIdWhoIsServer

Ushbu mijoz komponenti har qanday standart Whois serveriga ulanadi, bu sizga domenlar haqida ma'lumot olish imkonini beradi. Server komponenti NIC serverining asosiy funksiyalarini ta'minlaydi.

Indy Boshqa

Indy Miscellaneous Components palitrasi sahifasiga BASE64, UUE, Quoted Printable va boshqa keng tarqalgan elektron pochta aloqa formatlari, parollar va parollarni saqlash uchun ishlatiladigan kriptografiya standartlari uchun kodlovchilar (MD2, MD4 va MD5) kiradi. elektron imzolar qaytarib bo'lmaydigan (deshifrlash qiyin) shaklda, shuningdek, Internet-ilovalarni ishlab chiqishda tez-tez ishlatiladigan boshqa ko'plab foydali komponentlar va yordamchi dasturlar.

TIdAntiFreeze

Indy komponentlarining blokga asoslangan algoritmlari tufayli, ulanish ishlayotganda ilova ko'pincha tiqilib qolgandek ko'rinadi. Ilovaning muzlashiga yo'l qo'ymaslik uchun aloqalarni tashkil qilishda ikkilamchi jarayonlardan (iplardan) foydalanishni bartaraf etish uchun shaklga ko'rsatilgan komponentni joylashtirish kifoya.

Komponent TCP/IP protokoli stekidan so'rovlarni tahlil qilish va tashqi ulanishlar bloklanganda kechikish vaqtida ilovaga xabarlarni yuborish orqali ishlaydi, bu esa ishlaydigan kod xayolini yaratadi. Komponent bloklangan ulanishlarga faqat asosiy jarayon uchun ta'sir qilganligi sababli, ilovaning ikkilamchi jarayonlarida TIdAntiFreeze dan foydalanish talab qilinmaydi. Shuni yodda tutingki, TIdAntiFreeze komponenti ulanishlarni sekinlashtiradi, chunki asosiy jarayon vaqti-vaqti bilan xabarlarni qayta ishlash uchun to'xtatiladi. Bundan kelib chiqadiki, ishlab chiqilayotgan ilova OnClick, OnPaint, OnResize va boshqalarni o'z ichiga olgan xabarlarni qayta ishlashga juda ko'p vaqt sarflamasligi uchun ehtiyot bo'lish kerak. Buni ma'lum darajada TIdAntiFreeze sinfining xususiyatlari orqali boshqarish mumkin. Ushbu komponentdan foydalanish majburiy emas, lekin u ilovaning vizual interfeysi bilan ulanishlarni sinxronlashtirish muammosini hal qilishga imkon beradi.

TIdDateTimeStamp

Internet protokollari turli sana va vaqt formatlaridan foydalanishi bilan bog'liq sana va vaqt matematikasini bajarish uchun sinf; Bundan tashqari, mijozlar va serverlar turli vaqt zonalarida joylashgan bo'lishi mumkin.

TIdIPWatch

Bu taymerga asoslangan komponent bo'lib, u doimiy ravishda kompyuterning IP manzilidagi o'zgarishlarni kuzatib boradi. Komponent hodisalari o'zgarish aniqlanganda sodir bo'ladi. Ushbu komponent odatda kompyuterning Internetga yoki boshqa tarmoqqa ulanganligini aniqlash uchun ishlatiladi. Ushbu vaziyatda IP manzilining o'zgarishi yangi tarmoqqa ulanishda DHCP (Dynamic Host Configuration Protocol) serveri tomonidan tayinlangan IP manzili tufayli yuzaga kelishi mumkin.

TIdLogDebug

Ushbu komponentning maqsadi har qanday mijoz yoki server komponentining hodisalarini ushlab turish va voqea qaydini joylashtirishdir belgilangan fayl. Ushbu komponent Indy komponentlarini disk raskadrovka qilish uchun juda foydali.

TIdMessage

Komponent xabarlarni to'g'ri hal qilish yoki kodlash uchun boshqa komponentlar bilan birgalikda ishlatiladi. Bular POP, SMTP va NNTP komponentlari bo'lishi mumkin. Sinf MIME shifrlash va shifrni ochish, ko'p baytli belgilar va ISO kodlashni qo'llab-quvvatlaydi.

TIdNetwork Calculator

Ilovalarni yaratishda foydalanish mumkin bo'lgan bir nechta Indy komponentlaridan biri. Tarmoq kalkulyatori IP-manzillar, jumladan, tarmoq maskalari, quyi tarmoq, tarmoq sinflari va boshqalar bo'yicha hisob-kitoblarni amalga oshirish uchun ishlatilishi mumkin.

TIdThreadMgrDefault

Komponent sukut bo'yicha ikkilamchi jarayonlarni boshqarishni ta'minlaydi. Jarayonni boshqarishni qo'llab-quvvatlaydigan har qanday Indy komponentida TIdThreadManager sinfining aniqlangan namunasi bo'lmaganida yaratilgan. Komponent ikkilamchi jarayonlarni boshqarish uchun faqat asosiy imkoniyatlarni taqdim etadi: ularni talab bo'yicha yaratish va yo'q qilish.

TIdThreadMgrPool

TIdThreadMgrDefault-dan ko'ra ilg'or jarayonlarni boshqarish komponenti, chunki u talab bo'yicha ularni yaratish yoki yo'q qilish o'rniga jarayonlarni birlashtiradi.

TIdVCard

VCard vizitkaning elektron ekvivalenti bo'lib, egasining shaxsiy ma'lumotlari va grafik ma'lumotlarini o'z ichiga olishi mumkin.

TIdIMFDekoder

Internet xabarlarini dekodlash uchun mo'ljallangan. U boshqa barcha kodlovchi komponentlar singari TIdCoder sinfining avlodidir. TIdCoder klassi 1982 yil avgustda taklif qilingan ARPA Internet matnli xabar formati standarti RFS-822 va 1987 yil dekabr oyida taklif qilingan USENET xabar almashish standarti RFC 1036 bo'yicha dekodlanadi.

Komponent TIdCoder sinfini kengaytirib, RFS-822 formatini sarlavha konteksti bo'yicha aniqlashga imkon beradi, qabul qilishda shifrni ochish rejimi va MIME shifrlash va shifrni hal qilishni ta'minlaydi. TIdIMFDecoder komponenti TIdMessageClient sinfida qabul qilingan va uzatilgan xabarlarni dekodlash uchun ishlatiladi.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder ko'rsatilgan formatdagi matnni shifrlash imkonini beradi. Belgilangan kodlash turiga ega bo'lgan mustaqil komponent sifatida xizmat qilishi mumkin, bu esa yangi kodlash turini o'z ichiga olgan xabarlarni uzatish imkonini beradi.

TIdBase64Encoder

Bosib bo'lmaydigan belgilarni uzatish imkonini beruvchi boshqa shifrlash algoritmini amalga oshiradi.

TIdUUEnkoder

Birinchi shifrlash algoritmlaridan birini, UU kodlashni amalga oshiradi. Ba'zan yangiliklar xizmatiga maqolalarni yuborishda foydalaniladi.

TIdXXEnkoder

Ushbu shifrlash usuli hech qachon qo'llanilmaydi. Aslida, bu bir xil UU kodlash, lekin boshqa shifrlash jadvali bilan.

TIdCoderMD2

Har xil turdagi MD (Message Digest) shifrlash algoritmiga ega komponentlar. Ularning barchasi aralashishga asoslangan, bir tomonlama va shifrni ochish algoritmlariga ega emas.

Protokol mijozlari va serverlarining komponentlari asosiy (ClientSocket, ServerSocket) va Internet va Fastnet palitrasining boshqa komponentlari bilan birgalikda yoki ularning o'rniga server va mijoz Internet ilovalarini ishlab chiqish uchun ishlatilishi mumkin. Indy komponentlari WebBroker arxitekturasidan foydalanmaydi, ular to'g'ridan-to'g'ri manba kodlarida Internet protokollari va xizmatlarini past darajadagi qo'llab-quvvatlaydi ( manba kodlari biriktirilgan).

TIdConnectionInterceptOpenSSL va TIdServerInterceptOpenSSL

Ikki dastur o'rtasidagi aloqaning maxfiyligi va ishonchliligini ta'minlaydigan SSL protokoli - Secure Sockets Layer ikki qatlamga ega. Ko'p qatlamli transport protokolining past darajasida (masalan, TCP) SSL yozib olish protokoli bo'lib, turli yuqori darajadagi protokollarni qamrab olish uchun ishlatiladi. SSL ning afzalligi shundaki, u mustaqil dastur protokoli, lekin SSL tepasida yuqori darajadagi protokoldan foydalanish mumkin.

SSL aloqa xavfsizligini ta'minlaydi, bu uchta asosiy funktsiyaga ega: maxfiy ulanishni ta'minlash; bilan shifrlash umumiy kalit(adresatning haqiqiyligini tasdiqlash uchun foydalaniladi); ma'lumotlarni uzatish ishonchliligini qo'llab-quvvatlash.

  • Simmetrik kriptografiya ma'lumotlarni shifrlash uchun ishlatiladi (masalan, DES, RC4 va boshqalar).
  • Raqamli imzo assimetrik ochiq kalit shifrlash (masalan, RSA, DSS va boshqalar) yordamida taqdim etiladi.
  • Aloqa ishonchliligi, xabarlarni tashish MAC tuzatish kodlari, MAC hisob-kitoblari yordamida xavfsiz xesh funktsiyalari (masalan, SHA, MD5 va boshqalar) orqali xabarning yaxlitligini tekshirishni o'z ichiga oladi.

HTTP va server autentifikatsiyasi bilan birgalikda SSL taqdim etadi zarur funktsiyalar shifrlash va o'rnatilgan ulanishni davom ettirish, veb-serverning haqiqiyligini ikki marta tekshirish va h.k. Shuni tushunish kerakki, SSL faqat ma'lumotlarni uzatish paytida aloqalarni himoya qiladi va boshqa xavfsizlik mexanizmlarini almashtirmaydi.

TIdConnectionInterceptOpenSSL va TIdServerInterceptOpenSSL komponentlari SSL protokoli yordamida mijoz va server tomoni ulanishlarini ta'minlaydi. Shuni ta'kidlash kerakki, TIdConnectionInterceptOpenSSL va TIdServerInterceptOpenSSL komponentlari Kylix-da emas, balki faqat Delphi 6 da mavjud. Bu Windows-ni amalga oshirishda operatsion tizim funktsiyalariga asoslangan protokolning murakkabligi bilan bog'liq.

Indy komponentlarini ishlatish misollarini /Delphi6/Demos/Indy kataloglarida topish mumkin. Hammasi bo'lib, 8.0 versiyasidagi Indy kutubxonasi 69 ta komponentni o'z ichiga oladi. Ta'kidlanishicha, 9.0 versiyasida ko'rsatilgan kutubxona 86 ta komponentdan iborat bo'ladi. Barcha komponentlar birlashtirilgan va Delphi 6 va Kylix-ga kiritilgan, bu esa ularni platformalararo ilovalarni ishlab chiqishda ishlatish imkonini beradi. Barcha Indy komponentlari ko'p ish zarralarini qo'llab-quvvatlaydi.

Indy komponentlari jadvalda aniq ko'rsatilganidek, Internet va Fastnet komponentlarida joylashgan deyarli barcha funksiyalarni amalga oshiradi.

Tez va komponentlar Indi komponentlari Komponentlarning maqsadi
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket TCP/IP protokoli yordamida ikkita kompyuter (mijoz va server) o'rtasidagi o'zaro ta'sir
2 TNMDayTime TIdDayTime, TIdDayTimeServer Joriy vaqt uchun serverni so'rang
3 TNMEcho TIdEcho, TIdEchoServer Javob serveri bilan aloqa qilish uchun foydalaniladi
4 TNMFinger TIdFinger, TIdFingerServer Internet qidiruv serveridan foydalanuvchi haqida ma'lumot olish uchun foydalaniladi
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer FTP protokoli yordamida fayl uzatishni ta'minlang
6 TNMHTTP TIdHTTP, TIdHTTPServer Ma'lumotlar almashinuvi uchun HTTP protokolidan foydalaning
7 TNMMsgServ, TNMMsg Mijozdan serverga oddiy matnli xabarlarni uzatish uchun foydalaniladi
8 TNMNNTP TIdNNTP, TIdNNTPSserver Yangiliklar serveri bilan ma'lumotlar almashinuvini qo'llab-quvvatlaydi
9 TNMPOP3 TIdPOP3 POP3 protokoli yordamida pochta serveridan elektron pochta xabarlarini olish uchun foydalaniladi
10 TNMSMTP TIdSMTP Internet pochta serveri orqali elektron pochta xabarlarini yuborish uchun foydalaniladi
11 TNMStrm, TNMStrmServ TCP/IP protokoli yordamida oqimga yozilgan ikkilik ma'lumotlarni uzatadi
12 TNMUDP TIdUDP, TIdUDPServer UDP protokoli yordamida ma'lumotlarni uzatish
13 TpowerSock, TNMGeneralServer O'z mijozlaringizni (Powersock) va serverlaringizni (NMGeneralServer) yozish uchun asos bo'lgan komponent-kapsullangan sinflar
14 TNMUUprotsessor TIdUUEnkoder, TIdUUDekoder Qayta kodlashni amalga oshiring ikkilik fayllar MIME yoki UUENCODE formatiga
15 TNMURL Satrlarni ga aylantiradi HTML formati va teskari qayta kodlashni amalga oshiradi

Istisnolar TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL kabi sinflar bo'lib, ular eskirgan protokollarni amalga oshiradilar yoki muqobil sinflarning katta guruhida amalga oshirilgan funksionallikka ega.

Biroq, o'zidan oldingilaridan - Internet va Fastnet komponentlaridan farqli o'laroq, Indy server komponentlari va ma'lumotlarni transkodlash va shifrlash, shuningdek autentifikatsiyani qo'llab-quvvatlash (Indy Misc palitrasi) uchun boyroq server komponentlarini o'z ichiga oladi. Yuqoridagi jadvaldan ko'rinib turibdiki, asosiy protokollar va xizmatlar nafaqat mijoz tomonidan, balki server komponentlari tomonidan ham taqdim etiladi. Bular vaqt xizmatlari, javob xizmatlari, foydalanuvchi ma'lumotlarini olish, shuningdek, HTTP, NNTP, UDP protokollari va hatto FTP ning eng oddiy versiyasidir.

Indy komponentlarini ishlatishning ba'zi misollari

Delphi tarkibidagi Indy komponentlarida IP-manzil Xost xususiyatida aniqlanadi, odatda faqat mijoz ilovalarida. Serverda joylashgan komponentlar mos keladigan portni so'rovni boshlash yoki to'xtatish imkonini beruvchi usullarga ega - masalan, IdTCPServer komponentining Active xususiyatini o'zgartirish mos keladigan portni so'rashni boshlaydi yoki to'xtatadi. Mijoz va server o'rtasida aloqa o'rnatilgandan so'ng, ma'lumotlarni uzatish boshlanishi mumkin.

Indy komponentlari ma'lumotlar bilan ishlashda xavfsizlik va ishonchlilikka katta e'tibor beradi. Masalan, IdTCPClient komponentida Connect va Disconnect usullari mavjud. Mijoz tomonidan quyidagi kod kabi dasturlash texnikasidan foydalanish:

TCPClient bilan ulanishni boshlang; lstMain.Items.Add(ReadLn) ni sinab ko'ring; nihoyat o'chirish; oxiri; oxiri;

va server tomonidan TIdPeerThread sinfining AThread namunasiga parametr sifatida uzatilgan Connection xususiyatidan foydalanish:

AThread.Connection bilan WriteLn ("Basic Indy Server serveridan salom."); O'chirish; oxiri;

ulanishning normal bajarilishiga yoki xatoni to'g'ri hal qilishga ishonishingiz mumkin.

Tegishli sinflarning ReadLn va WriteLn usullariga e'tibor bering - ular standart Paskal kiritish-chiqarish operatorlariga o'xshaydi. Bu UNIX dasturlash texnikasiga hurmat bo'lib, ko'pchilik tizim operatsiyalari tegishli fayllarni o'qish va yozish orqali amalga oshiriladi.

Xuddi Fastnet komponentlari singari, Indy komponentlari sinflarida ham voqealarni boshqarishni ta'minlash uchun ishlatilishi mumkin bo'lgan voqealar mavjud. Masalan, mijozga ulanishda xabarni formada ko'rsatishni tashkil qilishingiz mumkin:

Protsedura TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); begin lblStatus.caption:= "[ Mijozga xizmat ko'rsatmoqda ]"; oxiri;

Indy ushbu kutubxonaga xos bo'lgan mijoz va server qismlari bilan protokollarni amalga oshiradigan komponentlarni taqdim etadi. TIdGopherServer va TIdGopher komponentlari mijoz tomonidagi GetExtendedMenu, GetFile, GetMenu, GetTextFile usullari va server tomonida ReturnGopherItem, SendDirectoryEntry tufayli fayllarni ko'rishga yordam beradi. har xil turlari, shu jumladan yashirin deb belgilanganlar, shuningdek kataloglar masofaviy kompyuter(dir *.* buyrug'i bajaradigan narsaga o'xshash operatsion tizim MS-DOS).

IdSMTP va IdMessage komponentlaridan foydalanib, siz SMTP protokoli yordamida pochta jo'natishi mumkin bo'lgan o'z veb-ilovangizni osongina yaratishingiz mumkin.

Bunday holda, IdMessage klassi (Indy Misc sahifasidagi 23 komponentdan biri) uning nomidan kelib chiqadigan xabarni yaratish uchun javobgardir, IdSMTP esa pochta serveri bilan ulanishni tashkil qilish uchun.

Indy-da qo'llaniladigan texnologiya qulflash o'qish va yozish operatsiyalaridan foydalanadi. Indy-da ishlatiladigan har qanday Connect operatsiyasi ulanish tugashini kutadi. Indy mijoz komponentlari bilan ishlashda odatda quyidagilarni bajarishingiz kerak:

  • serverga ulanishni so'rash;
  • serverga o'qish va yozish so'rovlarini amalga oshirish (server turiga qarab, qadam bir marta yoki ko'p marta takrorlanadi);
  • serverga ulanishni tugating va o'chiring.

Indy komponentlari juda yuqori darajadagi abstraktsiyani ta'minlash uchun mo'ljallangan. TCP/IP stekining nozik jihatlari va tafsilotlari dasturchidan yashirin bo'lib, u diqqatini topshirilgan vazifaga qaratishi mumkin.

Quyidagi kichik misol odatiy mijoz fasol seansini ko'rsatadi:

IndyClient bilan Xost:= "zip.pbe.com"; // Qo'ng'iroq qilish uchun xost Port:= 6000; // Connect-da serverga qo'ng'iroq qilish uchun port; harakat qilib ko'ring // Sizning kodingiz shu yerga keladi nihoyat Ulanishni uzing; oxiri; oxiri;

Misolda, agar serverga ulanish o'rnatilmagan bo'lsa ham, try-finally iborasidan foydalanish tufayli ulanish chiroyli tarzda to'xtatiladi.

Indy server komponentlari sizning ehtiyojlaringiz va foydalanayotgan protokolingizga qarab ishlatilishi mumkin bo'lgan turli xil server modellarini tavsiflaydi.

TIdTCPServer eng ko'p ishlatiladigan server komponenti bo'lib, u asosiy dastur jarayonidan mustaqil ikkilamchi jarayonni yaratadi. Yaratilgan jarayon kiruvchi so'rovlarni kutadi potentsial mijozlar. So'roviga javob beradigan har bir mijoz uchun alohida ikkinchi darajali jarayon yaratiladi. Texnik xizmat ko'rsatish jarayonida yuzaga keladigan hodisalar tegishli jarayonlar konteksti bilan bog'liq.

Boshqacha qilib aytadigan bo'lsak, har bir mijoz ulanishi uchun TIdTCPServer klassi ushbu oqimning OnExecute hodisasi ishlovchisini chaqirish orqali noyob ikkilamchi oqimdan foydalanadi. OnExecute usulining rasmiy parametri yaratilgan ipga mos keladigan Athread sinfining namunasiga havoladir. Bu sinfning Connection xususiyati TIdTCPConnection sinfiga havola bo‘lib, uning namunasi mijoz so‘rovini qayta ishlash uchun yaratilgan. TIdTCPConnection ulanish orqali o'qish va yozishni, shuningdek, aloqa seansini o'rnatish va tugatishni qo'llab-quvvatlaydi.

UDP protokoli avval server bilan aloqa o'rnatmasdan ishlaydi (har bir yuborilgan paket mustaqil ma'lumotlar to'plamidir va kattaroq seans yoki ulanishning bir qismi emas). TIdTCPServer har bir ulanish uchun alohida ish zarralarini yaratsa-da, TIdUDPServer barcha UDP protokoli so'rovlarini bajaradigan asosiy yoki bitta ikkinchi darajali ipdan foydalanadi. TIdUDPServer faol bo'lganda, kiruvchi UDP paketlarini tinglash uchun ip yaratiladi. Qabul qilingan har bir paket uchun OnUDPRead hodisasi ThreadedEvent xossasining qiymatiga qarab asosiy oqimda yoki tinglash kontekstida ko'tariladi. ThreadedEvent False deb baholanganda, hodisa asosiy ish zarrachasida sodir bo'ladi, aks holda u tinglash oqimida sodir bo'ladi. Hodisa qayta ishlanayotganda, boshqa server operatsiyalari bloklanadi. Shuning uchun, OnUDPRead protseduralarini iloji boricha tezroq bajarishni ta'minlash muhimdir.

Mavjud protokoldan foydalangan holda mavjud server uchun yangi mijoz ilovasini yaratishingiz kerak bo'lsa, sizning vazifangiz faqat mijoz ilovasini ishlab chiqish va disk raskadrovka qilishdir. Biroq, siz ham mijozni, ham rivojlantirishingiz kerak bo'lganda server ilovasi Mavjud yoki yangi protokoldan foydalanamizmi, biz klassik "tovuq va tuxum" muammosiga duch kelamiz. Dasturlashni qayerdan boshlash kerak - mijozdanmi yoki serverdanmi?

Shubhasiz, mijoz ham, server ham oxir-oqibat yaratilishi kerak. Ko'pgina ilovalar uchun, ayniqsa matnga asoslangan protokoldan foydalanadiganlar uchun (masalan, HTTP), serverni loyihalash orqali dasturni yaratishni boshlash osonroq. Nosozliklarni tuzatish uchun allaqachon mavjud bo'lgan qulay mijoz mavjud. Bu Windows va UNIX da mavjud Telnet konsol ilovasi.

Agar siz konsolni yozsangiz telnet buyrug'i 127.0.0.1 80 mahalliy kompyuterning IP-manzili va veb-serverlar tomonidan sukut bo'yicha ishlatiladigan port raqami 80, keyin dastur rasmda ko'rsatilgan matn bilan javob beradi. 6, Windows 2000 OS va IIS 5.0 bo'lsa.

Indy komponentlaridan foydalangan holda eng oddiy serverni yaratish uchun sizga kerak bo'ladi:

Agar siz ulanish uzilganda mijozlarni nafaqat to'g'ri xabardor qiladigan, balki ularga yuzaga kelgan xatolik holatlari haqida ma'lumot beradigan serverni loyihalashingiz kerak bo'lsa, try-finally o'rniga try-except iborasidan foydalaning - masalan, quyidagi misolda ko'rsatilgan:

Protsedura TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: string; AThread bilan boshlang.Ulanishni sinab ko'ring s:= ReadLn; // Server topshirig'ini shu yerda bajaring // agar istisno bo'lmasa, // server javobini yozing WriteLn(s); e dan tashqari: Istisno boshlanadi WriteLn(e.Message); end; //on end; // harakat qilib ko'ring, faqat finally Ulanishni o'chirish; tugatish; tugatish;

Ushbu kichik misol oddiy matn serverini yaratish bosqichlarini, shuningdek, uni qanday tuzatishni ko'rsatadi.

Yuqorida tavsiflangan server zamonaviy taqsimlangan hisoblashlarni tashkil etishning odatiy namunasidir.

Ko'p bosqichli ilovalarni yaratish xususiyatlari

So'nggi paytlarda mijozlar so'rovlarini qondirish uchun bir nechta serverlar tobora ko'proq foydalanilmoqda. Ushbu turdagi server mijoz so'rovini qabul qilib, uni keyingi qayta ishlashga qisman tayyorlab, boshqa server bilan bog'lanadi va unga o'zgartirilgan so'rov yoki so'rovlarni yuboradi. Ikkinchi darajali server, o'z navbatida, boshqa serverlar bilan aloqa o'rnatishi mumkin. Shunday qilib, biz ko'p bosqichli server arxitekturasi haqida gapirishimiz mumkin.

Keyinchalik biz ma'lumotlarga kirish serverini yaratamiz, uning maqsadi ma'lumotlar bazasidan ma'lumotlarni qaytarishdir. Biroq, bu server ma'lumotlar bazasi fayllarini to'g'ridan-to'g'ri o'qimaydi yoki yozmaydi. Buning o'rniga, mijoz tomonidan talab qilinadigan ma'lumotlarni qidirishda ma'lumotlar bazasi serveri bilan bog'lanadi.

Shunday qilib, biz uch bosqichli arxitekturaga ega dasturni ishlab chiqishni boshlaymiz. Indy komponentlaridan foydalangan holda ma'lumotlar bazasi serverini yaratish uchun sizga kerak bo'ladi:

  1. Yangi loyiha yarating.
  2. Qo'ying asosiy shakli Indy Servers palitrasidan TIdTCPServer komponentining loyiha namunasi.
  3. TIdTCPServer1 sinf namunasining DefaultPort xususiyatini 6001 ga o'rnating (turli ilovalarda port raqamlarini takrorlamaslik uchun katta qiymatlarni belgilash tavsiya etiladi) va Active xususiyatini rost deb o'rnating.
  4. Fayl | ni tanlab loyihaga yangi modul qo'shing Yangi | Ma'lumotlar moduli va SQLConnection va SQLDataSet komponentlarining namunalarini komponentlar palitrasidagi dbExpress yorlig'idan joylashtiring.
  5. SQLConnection sinfining ConnectionName xususiyatini IBLocal va LoginPrompt-ni False ga o'rnating. Agar siz IBLocal-ni staffe.gdb ma'lumotlar bazasida sozlamagan bo'lsangiz, avval ushbu protsedurani bajaring.

Hammaga salom!

Keyingi veb-loyihani ishlab chiqishda vazifa paydo bo'ldi - Delphida POST usuli yordamida serverga ma'lumotlarni uzatadigan mijoz dasturiy ta'minotini amalga oshirish. Ilova matnni uzatishi va fayllarni veb-serverga yuklashi kerak.

Server tomonidagi tillar yordamida bunday ma'lumotlarni yuborishni amalga oshirish Veb ishlab chiqish(masalan, PHP) juda oddiy, lekin agar siz server bilan o'zaro aloqada bo'lgan dasturga asoslangan, ko'p foydalanuvchili dasturiy ta'minotni yozishingiz kerak bo'lsa, unda bu biroz murakkabroq. To'g'ridan-to'g'ri ma'lumotlar bazasiga va FTP orqali Delphi serveriga ulanish usuli endi kerak emas, chunki u xavfsiz emas, ishonchli emas (parollarni o'zgartirish, ulanish ma'lumotlari va boshqalar) va qo'shimcha yaratadi. mijoz tomonida dasturiy ta'minot muvofiqligi muammolari. Muammoni hal qilish uchun PHP da kiruvchi xabarlarni qayta ishlovchi skriptlarni (server qismi) yozishga qaror qildim POST so'rovlari va natijani mijozga qaytaring (Delphi ilovasi). Ushbu yondashuvning afzalliklari shundaki, barcha ulanishlar va ma'lumotlarni qayta ishlash serverda sodir bo'ladi, bu to'g'ridan-to'g'ri "ulanish" dan ancha xavfsizroqdir.

Men googlingni boshlaganimda, ko'plab tarqoq ma'lumotlardan voz kechishdi, asosan forumlarda, lekin barchasi parcha-parcha edi. Indy-dan, ya'ni POST usuli bilan IdHTTP komponentidan foydalanilishi aniq edi. Aslida, hamma narsa oddiy, bu usul resursning ikkita parametri URL manzili va DataStream (maʼlumotlar oqimi) ni oladi va natijani matn koʻrinishida qaytaradi (bu sahifaning HTML kodi ham boʻlishi mumkin). Asosiysi, DataStream ning to'g'ri shakllanishi (uzatiladigan ma'lumotlar oqimi), lekin bu yo'lda qo'shimcha tuzoqlar paydo bo'ldi, ya'ni rus kodlash (agar u yaxshi bo'lmasa). Bu erda bir necha soat davomida Internetda sayr qilishning o'yin-kulgi boshlandi. Umuman olganda, suhbat etarli, keling, dasturiy ta'minotni amaliyotga va amalga oshirishga o'tamiz.

Shunday qilib, dastur oddiy. U POST usuli yordamida serverga ma'lumotlarni yuborishi kerak, ma'lumotlar tarkibida " Sarlavha "(satr)," Tavsif » ( ko'p qatorli matn) Va grafik fayl(jpg, png, gif-ikkilik ma'lumotlar). Server ushbu ma'lumotlarni qabul qilishi, uni qayta ishlashi, grafik faylni serverda saqlashi va javob qaytarishi kerak. Javob sifatida biz Delphi-ni dasturga qaytaramiz, xuddi shu matn faqat qo'shilgan teglar va yuklab olingan faylga havola. Boshqa hech narsa.

Keling, server qismini amalga oshirishdan boshlaylik (saytning API-ga o'xshash). Har birini oching matn muharriri(bloknot) va unga quyidagi kodni yozing:

"; ) else ( "Sarlavha: etishmayotgan" aks-sadosi."
"; ) //Kiruvchi ma'lumotlarda "kontent" maydoni ma'lumotlari mavjudligini tekshiring, agar (!empty($_POST["content"]))( echo "Content: ".$_POST["content"]."
"; ) else ( "Tarkib: etishmayotgan" aks-sadosi."
"; ) //Kirish ma'lumotlarini biriktirilgan "fayl" fayli mavjudligini tekshiring, agar (!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /fayl haqida ma'lumot olish (nomi, kengaytmasi va boshqalar) // Ruxsat etilgan turlar ro'yxatida fayl turini tekshiring (IMPROVISATION:)) if (stripos("jpgpnggif",$finfo["kengaytma"] )==0)( echo ">>>>>>>Fayl turi noto'g'ri<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

Eslatma! Saqlashda (bloknot orqali) siz "UTF-8" kodlashni belgilashingiz kerak, aks holda kirill alifbosini ko'rsatishda muammolar paydo bo'ladi!

Skript batafsil sharhlar berishga harakat qildi. Ushbu skriptni veb-serveringizga nusxalang, agar sizda yo'q bo'lsa, test uchun mening skriptimdan foydalanishingiz mumkin, u quyidagi manzilda joylashgan: http://api..php

Tartib quyidagi komponentlardan foydalanadi: Label, Button (2 dona), Edit (2 dona), Memo (2 dona), CheckBox, OpenDialog, IdHTTP. Quyidagi komponentlarga nom bering (xususiyat " Ism”):

  1. Tahrirlash (sarlavha) - Ism = sarlavha;
  2. Tahrirlash (faylga yo'l) Ism = imgfayl;
  3. Eslatma (tarkib)Ism = tarkib;
  4. Eslatma (natija) - Ism = javob;
  5. Tugma (…) - Ism = chkfayl;
  6. Tugma (POST) - Ism = PostBut;
  7. OpenDialog (Fayl tanlash dialogi) - Ism = PictDialog;

Keling, IdHTTP1 va CheckBox1 ni o'zgarishsiz qoldiramiz (charchagan! :)))).

Tasodifan bo'lmasligi uchun " tahrirlash» Tahrirlash yoʻli( imgfayl), uning ReadOnly xossasini True qilib belgilang. Xuddi shunday, at imgfayl Va chkfayl Enabled xususiyatini noto'g'ri qilib belgilang. Biz ularni CheckBox yordamida faollashtiramiz, ya'ni. Biz rasmni yuklash yoki yuklamaslikni tanlash imkoniyatini beramiz.

OpenDialog uchun( PictDialog) filtrni (Filtr xususiyati) quyidagicha o'rnatishingiz kerak:

Haqiqiy vizual tayyorgarlik tugadi! Keling, kodlashni boshlaylik!

Loyihada biz Indy-ga kiritilgan turdan foydalanib ma'lumotlar oqimini yaratamiz - TidMultiPartFormDataStream. Biz TStream yordamida amalga oshirish variantlariga duch kelgan bo'lsak-da, bilan ishlash TidMultiPartFormDataStream - Sekinroq!

Ushbu turni loyihamizda mavjud qilish uchun biz Uses-ga quyidagi kutubxonani qo'shishimiz kerak: IdMultipartFormData.

CheckBox1 uchun OnClick hodisasini yarating (ob'ekt ustida sichqonchani ikki marta bosish orqali) va ushbu hodisaga quyidagi kodni qo'shing:

Protsedura TForm1.CheckBox1Click(Sender: TObject); start //fayl yo'li elementlari va dialog tugmalarini faol yoki nofaol qilish imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; oxiri;

Bu erda biz ob'ektlarni faollashtiramiz imgfayl Vachkfayl tasdiq belgisi mavjudligiga qarab (agar katakcha belgilansa, ob'ektlar faollashadi).

Endi rasm tanlashni tashkil qilaylik. Buning uchun tugma ustida OnClick hodisasini yarating chkfayl(shuningdek, ob'ektni ikki marta bosish orqali) va quyidagilarni yozing:

Protsedura TForm1.chkfileClick(Sender: TObject); boshlash //muloqot oynasini oching va agar PictDialog.Execute bo'lsa, keyin imgfile.Text:= PictDialog.FileName bo'lsa imgfile(TEdit) da faylga to'liq yo'lni kiriting; oxiri;

Ushbu hodisa rasm tanlash dialogini ishga tushiradi va agar foydalanuvchi " Ochiq", keyin ushbu faylga yo'l qo'shiladi imgfayl.

Va endi biz oxirgi "POST" tugmasiga keldik. Ushbu tugma uchun OnClick hodisasini yarating va quyidagi kodni qo'shing:

Protsedura TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; start dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; agar CheckBox1.Checked va (trim(imgfile.Text)="") keyin //fayl tanlangan yoki boshlanmaganligini tekshirish ShowMessage("Siz grafik faylni tanlashingiz kerak!"); Chiqish; oxiri; agar CheckBox1.Checked keyin dataPost.AddFile("fayl",imgfile.Text,""); //fayl javobi bilan maydon qo'shing.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end;

Shunday qilib, tartibda (sharhlar mavjud bo'lsa ham):

Datapost - turdagi ob'ekt TIdMultiPartFormDataStream. Har xil turdagi maydonlardan iborat POST so'rovi strukturasini yaratishga imkon beradi.

dataPost . AddFormField (" sarlavha ", sarlavha . Matn ," utf -8 "). Kontentni uzatish := " 8 bit "; – DataPost-ga “title” nomli maydonni qo‘shadi, “title.Text” qiymatidan, uzatilayotgan ma’lumotlarning kodlanishini “utf-8” ga o‘rnatadi (parametr ixtiyoriy, lekin aniq ko‘rsatilmagan holda, kirill alifbosi bilan uzatiladi. savol belgilari "?") va juda muhim usul "Content Transfer". Ushbu usulsiz ma'lumotlar serverga yuboriladi " abrakadabra" E'tibor bering, jo'natuvchi tomondagi maydon nomi (“sarlavha”) skriptda ko'rsatilgan nomga mos kelishi kerak: $_POST["title"].

Ma'lumotlar xuddi shunday "tarkib" maydoniga uzatiladi.

dataPost . AddFile (" fayl ", imgfayl . Matn ,"") – bu qator bilan fayldan ma’lumotlar bilan oqim hosil qilamiz.

Hammasi shu, ma'lumotlar yaratiladi, uni serverdagi skriptga o'tkazish va javob olish qoladi:

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

chunki TMemo chiziq uzilishi tegini tushunmaydi "
", biz " " funksiyasidan foydalanib, uni tushunarli "#13#10" qator uzilishlari bilan almashtiramiz.

Har bir narsa tugagach, DataPost obyektidan xotirani qator bilan tozalang:

datapost.Free;

Garchi bizning misolimizda bu jarayon oxirida avtomatik ravishda sodir bo'ladi, lekin baribir...

Ekrandagi dasturning haqiqiy natijasi:

Shunday qilib, biz serverga xohlagancha ma'lumot yoki fayllarni yuborishimiz, ushbu ma'lumotlarni serverda qayta ishlashimiz va skript natijasini dasturga qaytarishimiz mumkin. Bu atigi 0 yoki 1 bo'lishi mumkin, bu ilovaga keyingi reaktsiyani bildiradi.

Hammasi. Hammaga omad. Umid qilamanki, ma'lumot foydali bo'ldi va siz undan foydalanishni topasiz.

Siz tugallangan misol va skriptni yuklab olishingiz mumkin.

To'liq modul kodi:

Birlik PostUnit; interfeysi Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCdPConnection, IdTCTCConnection-dan foydalanadi. IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; TForm1 turi = sinf (TForm) IdHTTP1: TIdHTTP; sarlavha: TEdit; tarkib: TMemo; PostBut: TButton; javob: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; imgfayl: TEdit; chkfayl: TButton; Label4: TLabel; CheckBox1: TCheckBox; PictDialog:TOpenDialog; protsedurasi PostButClick(Sender: TObject); chkfileClick protsedurasi(Yuborgan: TObject); protsedura CheckBox1Click(Sender: TObject); xususiy ( Private declarations ) public ( Public declarations ) end; var Form1: TForm1; amalga oshirish ($R *.dfm) protsedurasi TForm1.CheckBox1Click(Sender: TObject); start //fayl yo'li elementlari va dialog tugmalarini faol yoki nofaol qilish imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; oxiri; protsedura TForm1.chkfileClick(Sender: TObject); boshlash //muloqot oynasini oching va agar PictDialog.Execute bo'lsa, keyin imgfile.Text:= PictDialog.FileName bo'lsa imgfile(TEdit) da faylga to'liq yo'lni kiriting; oxiri; protsedurasi TForm1.PostButClick(Sender: TObject); var dataPost:TIdMultiPartFormDataStream; start dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; agar CheckBox1.Checked va (trim(imgfile.Text)="") keyin //fayl tanlangan yoki boshlanmaganligini tekshirish ShowMessage("Siz grafik faylni tanlashingiz kerak!"); Chiqish; oxiri; agar CheckBox1.Checked keyin dataPost.AddFile("fayl",imgfile.Text,""); //fayl javobi bilan maydon qo'shing.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Bepul; end; end.