Delphi-д ашигласан Indy бүрэлдэхүүн хэсгүүд. Delphi дахь Indy UDP бүрэлдэхүүн хэсгүүдтэй (сервер, үйлчлүүлэгч) ажиллах жишээ

Товчхондоо, Indy бол алдартай интернет протоколуудтай ажиллахад тохиромжтой бүрэлдэхүүн хэсэг юм. Тэдний үйл ажиллагааны зарчим нь хаах горимд залгуурыг ашиглахад суурилдаг. Инди нь нэлээд хийсвэр учраас сонирхолтой бөгөөд тохиромжтой. Инди хэл дээрх програмчлал нь шугаман програмчлалд ордог. Дашрамд хэлэхэд, орчуулсан нийтлэл интернетэд өргөн тархсан бөгөөд "хаах горим нь чөтгөр биш" гэсэн үгс байдаг :)) Нэгэн цагт энэ орчуулгыг хараад маш их хөгжилтэй байсан. Уг нийтлэл нь Гувер, Харири нарын "Индигийн гүн" номын нэг хэсэг юм. Зарчмын хувьд Indy-тэй ажиллахын тулд бүгдийг нь унших шаардлагагүй, гэхдээ би Интернет протоколууд хэрхэн ажилладаг зарчмуудтай танилцахыг зөвлөж байна. Харин "чөтгөрийн" дэглэмийн тухайд. Блоклох залгуур нь даалгавраа дуусгахаас нааш удирдлагыг буцааж өгдөггүй. Үндсэн утас дээр дуудлага хийх үед програмын интерфейс хөлдөж болзошгүй. Энэхүү таагүй нөхцөл байдлаас зайлсхийхийн тулд Энэтхэгийн хөгжүүлэгчид TIdAntiFreeze бүрэлдэхүүн хэсгийг бүтээжээ. Та зүгээр л маягт дээр шидэх хэрэгтэй - дуудлагыг хаах үед хэрэглэгчийн интерфэйсийг хялбархан дахин зурах болно.

Та Delphi дахь янз бүрийн "Indy (...)" табуудын агуулгыг аль хэдийн мэддэг болсон байх. Тэнд олон бүрэлдэхүүн хэсгүүд байдаг бөгөөд тус бүр нь ашигтай байж болно. Би өөрөө хүн бүртэй ажиллаж байгаагүй, учир нь би тэднийг тодорхой даалгаваргүйгээр судлах шаардлагагүй гэж үздэг.

Delphi-ийн үндсэн тархалт нь пеннитэй Indy v.9-г агуулдаг. Нэн даруй шинэчлэгдэх нь зүйтэй болов уу шинэ хувилбар(жишээ нь, надад одоогоор 10.0.76 байгаа, гэхдээ дараа нь бас байгаа бололтой).

Ижил протоколуудтай ажиллахад зориулагдсан клиент болон серверийн бүрэлдэхүүн хэсгүүд байдаг. Indy нь залгуур дээрх ижил функцийг хөгжүүлэх сонголтоос ялгаатай нь програмын хөгжүүлэлтийг үнэхээр хялбаршуулдаг. Жишээлбэл, сервертэй холболт үүсгэхийн тулд та зүгээр л Connect аргыг дуудах хэрэгтэй. Амжилттай холболт үүсгэсэн тохиолдолд үл хамаарах зүйлгүйгээр буцах аргаар тэмдэглэнэ. Хэрэв холболт тогтоогдоогүй бол онцгой тохиолдол гарна.

"Академик" жишээ (код ажиллахгүй байна, битгий ажиллуулаарай :)):

IndyClient-ийн тусламжтайгаар үүнийг хий
Эхлэх
Хост:= "test.com";
Порт:= 2000;
Холбох;
Оролдоод үз
// өгөгдөлтэй ажиллах (унших, бичих...)
эцэст нь
Салгах;
Төгсгөл;
Төгсгөл;

Хост болон портыг объект шалгагч эсвэл ажиллах хугацаанд тохируулж болно.

Та яагаад Indy бүрэлдэхүүн хэсгүүдийг даалгавруудыг задлан шинжлэхэд ашиглаж болох вэ? Төрөл бүрийн хэрэглээ! Хамгийн энгийн зүйл бол IdHTTP бүрэлдэхүүнийг ашиглан хуудасны агуулгыг авах явдал юм (хүн бүр ийм зүйлтэй тулгарсан байж магадгүй):

Var
rcvrdata: TMemoryStream;
idHttp1: TidHttp;
Эхлэх
idHttp1:= TidHttp.Create(nil);
rcvrdata:= TMemoryStream.Create;
idHttp1.Request.UserAgent:= "Mozilla/4.0 (тохиромжтой; MSIE 5.5; Windows 98)";
idHttp1.Request.AcceptLanguage:= "ru";
idHttp1.Response.KeepAlive:= үнэн;
idHttp1.HandleRedirects:= үнэн;
хичээ
idHttp1.Get(Edit1.Text, rcvrdata);
эцэст нь
idHttp1.Үнэгүй;
Төгсгөл;
хэрэв rcvrdata.Size > 0 бол эхэлнэ
ShowMessage("Хүлээн авсан" + inttostr(rcvrdata.Size));
rcvrdata.SaveToFile("c:\111.tmp");
Төгсгөл;
rcvrdata.Free;
Төгсгөл;

Таны харж байгаагаар та хуудасны агуулгыг авахаас гадна тодорхой үйлчлүүлэгчээс баримт бичгийг ачаалах дууриамал хийх боломжтой. Indy бүрэлдэхүүн хэсгүүд нь толгой болон POST хүсэлтийг үүсгэхэд ерөнхийдөө хэрэгтэй байдаг. Энэ талаар дараагийн удаа жишээн дээр илүү дэлгэрэнгүй.

Блогын шинэчлэлттэй байнга холбоотой байхын тулд та боломжтой

Delphi 6-д ашигласан Indy бүрэлдэхүүн хэсгүүд.

Интернэтийн үндсэн үйлчилгээ, протоколуудаас гадна олон төрлийн нэмэлт үйлчилгээнүүд байдаг бөгөөд тэдгээрийн чадавхийг интернет хөгжүүлэгчид ихэвчлэн ашигладаг. Нэмж дурдахад хөтөч ашиглан мэдээллийг харуулах чадвар нь интернетийн хэрэглээний хувьд үргэлж хүлээн зөвшөөрөгдөх шийдэл биш юм. Энэ тохиолдолд өгөгдөл солилцохын тулд интернетийн дэд бүтцийг ашиглах, жишээлбэл, Delphi-д боловсруулсан илүү төвөгтэй клиент програмуудаар дамжуулан мэдээллийг харуулах нь зүйтэй юм.

Стандарт вэб серверт ороогүй тусгай серверийн логикийг хэрэгжүүлэх хэрэгтэй гэж бодъё. Энэ ангиллын асуудлыг шийдэхийн тулд Delphi нь Nevrona Designs (http://www.nevrona.com/Indy/)-ийн Internet Direct (Indy) номын санг агуулдаг. Borland Delphi-д зориулж тусгайлан боловсруулсан энэхүү номын сан нь аль хэдийн найман хувилбартай бөгөөд хамгийн сүүлийнх нь Delphi-ийн шинэ хувилбарт багтсан болно. Бүрэлдэхүүн хэсгүүд нь үйлчлүүлэгч (Indy Client), сервер (Indy Servers) болон туслах (Indy Misc) гэсэн гурван бүлэгт хуваагддаг.

Indy Clients болон Indy Servers

Ихэнх Indy Client болон Indy Servers бүрэлдэхүүн хэсгүүд нь протокол, үйлчилгээний клиент болон серверийн хэсгүүдэд тохирох хосууд (TunnelMaster, TunnelSlave зэрэг серверийн бүрэлдэхүүн хэсгүүдээс бусад) бөгөөд TCP/IP зэрэг протоколуудыг ашиглахыг зөвшөөрдөг. , UDP, NNTP, SMTP, FTP, HTTP, түүнчлэн ECHO, FINGER, WHOIS гэх мэт үйлчилгээнүүд.

Indy клиентийн бүрэлдэхүүн хэсгүүдийг сокет ашиглан бичдэг. Үйлчлүүлэгчийн талын залгуур нь сервертэй холбогдохыг шаарддаг. Хэрэв холболт хийгдсэн бол үйлчлүүлэгч болон сервер хоёр мессеж солилцож эхлэх боломжтой. Эдгээр мессежүүд нь өөр шинж чанартай боловч ихэвчлэн тодорхой протокол (жишээлбэл, HTTP) ашиглан солилцдог.

TIdTCPClient болон TIdTCPServer

Эдгээр бүрэлдэхүүн хэсгүүд нь сүлжээний үндсэн протоколуудын нэг болох TCP (Transmission Control Protocol) -ийг дэмжихэд ашиглагддаг бөгөөд TIdSMTP болон TIdFTP бүрэлдэхүүн хэсгүүдийн үндсэн анги юм. TIdTCPServer анги нь ThreadMgr шинж чанартай бөгөөд анхдагч нь тэг болно. TIdTCPServer идэвхжсэн үед ThreadMgr тэг байвал TIdThreadMgrDeafault анги нь далд хэлбэрээр үүсгэгдэнэ. Үгүй бол суулгасан процессын менежерийг ашигладаг.

TIdUDPClient болон TIdUDPServer

Эдгээр бүрэлдэхүүн хэсгүүдийг дэмжихэд ашигладаг сүлжээний протокол UDP (User Datagram Protocol) ба бусад хэд хэдэн Indy бүрэлдэхүүн хэсгүүдийн үндсэн ангиуд юм.

TIdChargenServer

Бүрэлдэхүүн хэсэг нь ихэвчлэн туршилтын зорилгоор санамсаргүй тэмдэг үүсгэхэд ашиглагддаг.

TIdDayTime болон TIdDayTimeServer

Бүрэлдэхүүн хэсгүүд нь цагийн үйлчилгээ үзүүлэхэд ашиглагддаг. Үйлчлүүлэгч хүсэлт гаргах бөгөөд сервер нь одоогийн огноо, цагийг мэдээлдэг.

TIdDNSResolver

Энэ нь DNS (Домэйн Нэрийн Үйлчилгээ) серверийн хүсэлтэд үйлчилдэг үйлчлүүлэгчийн бүрэлдэхүүн хэсэг юм. DNS серверийн асуулга нь компьютерийн нэрийг түүний IP хаягаар солих зориулалттай. TIdDNSResolver нь TIdUDPClient ангийн удам юм.

TIdDICTSсервер

Үйлчлүүлэгчид байгалийн хэлний толь бичигт хандах боломжийг олгодог TCP протокол дээр суурилсан сервер талын толь бичиг болох Dictionary Server Protocol (DICT)-ийг дэмждэг серверийн бүрэлдэхүүн хэсэг.

TIdDISCARDServer

Бичлэгийн серверийг дэмждэг серверийн бүрэлдэхүүн хэсэг. Бичлэгийг дибаг хийх, хэмжих хэрэгсэл болгон ашиглаж болно. Бүртгэлийн үйлчилгээ нь аливаа өгөгдлийг хүлээн авахыг хүссэн хүнд шууд дамжуулдаг.

TI dEcho болон TI dECHOServer

Бүрэлдэхүүн хэсгүүд нь сүлжээний эрүүл мэндийг шалгахад ихэвчлэн ашиглагддаг хариу үйлчилгээ үзүүлэх зорилготой юм. Үйлчлүүлэгч сервер рүү мессеж илгээдэг бол сервер нь мессежийг үйлчлүүлэгч рүү буцаана. Хэрэв мессеж эвдэрсэн бол сүлжээ буруу ажиллана.

TIdFinger болон TIdFingerServer

Бүрэлдэхүүн хэсгүүд нь хэрэглэгчээс системд байгаа бусад хэрэглэгчид байгаа эсэх талаар мэдээлэл авах боломжийг олгодог протоколоор хангах зорилготой юм. Зарим серверүүд ийм үйлчлүүлэгчийн хүсэлтийг хариуцдаг. Энэхүү хос бүрэлдэхүүн хэсгүүдийг ашигласнаар системд бусад хэрэглэгчид байгаа эсэхийг тодорхойлох үйлчлүүлэгчийн хүсэлтэд үйлчлэх боломжтой болно.

TIdFTP

Бүрэлдэхүүн хэсэг нь файл дамжуулах протоколын бүрэн дэмжлэгийг агуулдаг - FTP (Файл дамжуулах протокол). Идэвхгүй, идэвхтэй өгөгдөл дамжуулах, GET, PUT, санг устгах, квот авах, файл, лавлах хэмжээ зэрэг үйлдлүүдийг дэмждэг. TI dFTP нь ажиллахын тулд TIdSimpleServer ангиллыг ашигладаг. FTP файл дамжуулах үед хоёрдогч TCP холболт нь өгөгдөл дамжуулахад нээгдэж, өгөгдөл дамжуулах үед хаагдана. Энэ холболтыг "өгөгдлийн холбоос" гэж нэрлэдэг бөгөөд энэ нь дамжуулагдаж буй файл бүрт өвөрмөц байдаг.

TIdGopher болон TIdGopherServer

Эдгээр бүрэлдэхүүн хэсгүүд нь орлуулсан сүлжээний протоколоор хангах зорилготой юм Сүүлийн үед WWW-ээс (Дэлхийн Өргөн сүлжээ) HTTP протокол. Энэ протоколыг хэрэгжүүлдэг сервер нь шаталсан хуваарилагдсан баримт бичгийн урсгалыг дэмжих системийг хангадаг. \demos\indy\GopherClient болон \demos\indy\GopherServer лавлахуудад байрлах энэхүү хос бүрэлдэхүүн хэсгүүдийн жишээ нь энэхүү протоколыг хангахад хэрхэн ашиглаж болохыг харуулж байна. дотоод сүлжээтаны компьютер дээр байгаа файлуудын тухай мэдээлэл, түүний дотор хаалттай файлууд.

TIdHostNameServer

Дотоод серверийн нэрийг үйлчлүүлэгчдэд дамжуулах зориулалттай серверийн бүрэлдэхүүн хэсэг.

TIdHTTP болон TIdHTTPServer

Бүрэлдэхүүн хэсгүүдийг HTTP сүлжээний протоколоор хангахад ашигладаг (GET, POST болон HEAD үйлдлүүд зэрэг 1.0 ба 1.1 хувилбаруудыг дэмждэг). Нэмж дурдахад, баталгаажуулалт болон прокси серверүүдийг ашиглахад дэмжлэг үзүүлдэг. Серверийн бүрэлдэхүүн хэсэг нь өгөгдсөн протоколыг дэмждэг өөр вэб серверт үйлчилгээ үзүүлэхэд ашиглагддаг. TIdHTTPServer нь күүки, төрийн удирдлага гэх мэт функцуудыг хэрэгжүүлэхэд тусалдаг.

TIdIcmpClient

Интернэт хяналтын мессежийн протоколыг (ICMP) хангах зорилготой үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь пинг үйлдлүүд болон сүлжээг хянахад ашиглагддаг.

TIdPOP3

MIME кодчилол, код тайлах, олон байт тэмдэгт дамжуулахад дэмжлэг үзүүлэх зэрэг шуудангийн протокол (POP)-ийг хангах зорилготой үйлчлүүлэгчийн бүрэлдэхүүн хэсэг.

TIdIMAP4Сервер

Сервер дээрх IMAP (Internet Message Access Protocol) ажиллагааг дэмжих зориулалттай серверийн бүрэлдэхүүн хэсэг. Протокол нь танд мессеж хайх боломжийг олгодог Имэйлсервер дээр. IMAP болон POP протоколуудын ялгаа нь POP протоколыг шаарддаг нэмэлт санах ойөгөгдөл хадгалах ба IMAP протокол нь үйлчлүүлэгчийн машины оронд серверт ханддаг. IMAP4 нь POP3-ыг орлох зорилгоор бүтээгдсэн боловч POP3 өнөөг хүртэл өргөн хэрэглэгддэг стандарт хэвээр байна.

TIdIRCS сервер

Интернэт дэх хамгийн түгээмэл хэрэглэгддэг үйлчилгээний үйл ажиллагааг дэмжихэд зориулагдсан серверийн бүрэлдэхүүн хэсэг бөгөөд үүнийг ихэвчлэн чат гэж нэрлэдэг. Бүрэлдэхүүн хэсэг нь үндсэн Барилгын тоосго нь IRC (Internet Relay Chat) серверт зориулсан.

TIdMappedPortTCP

Прокси серверт ихэвчлэн ашиглагддаг, зурагдсан портуудыг үүсгэхэд зориулагдсан серверийн бүрэлдэхүүн хэсэг. Энэ бүрэлдэхүүн хэсгийн аргууд нь нэг портыг нөгөө порт руу буулгах боломжийг олгодог. Жишээлбэл, 80-р портыг 3000-р порт руу буулгаж болох бөгөөд эхний порт руу (80-р порт) илгээсэн бүх хүсэлтийг хоёр дахь порт руу (3000 порт) дамжуулна.

TIdNNTP болон TIdNNTPSсервер

Эдгээр бүрэлдэхүүн хэсгүүд нь мэдээний үйлчилгээнд хэрэглэгддэг Сүлжээний мэдээ дамжуулах протоколыг (NNTP) дэмжихэд шаардлагатай. Үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь MIME кодчилол, декодчилол, олон байт тэмдэгтүүд болон өөр кодчилолуудын дэмжлэгийг агуулдаг. Серверийн бүрэлдэхүүн хэсэг нь танд мэдээний сервер үүсгэх боломжийг олгодог. TIdNNTPServer нь бүрэн хэмжээний мэдээллийн сервер биш, харин ийм серверийн үндсэн функцийг хангадаг бүрэлдэхүүн хэсэг гэдгийг анхаарах нь чухал юм.

TIdQOTD болон TIdQOTDServer

Бүрэлдэхүүн хэсгүүдийг "Өдрийн үнийн санал" үйлчилгээг үзүүлэхэд ашигладаг. Үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь өдөр тутмын үнийн саналыг авахын тулд серверийн бүрэлдэхүүн хэсэгтэй холбогддог. Серверийн жишээ бүр өвөрмөц ишлэлийн мэдээллийн санг агуулдаг.

TIdSMTP

Энгийн шуудан дамжуулах протокол (SMTP) програмуудад ашиглахад зориулагдсан үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь нэвтрэлт танилт, MIME кодчилол, код тайлах, олон байт тэмдэгтийн дэмжлэг үзүүлдэг.

TIdSNTP

SNTP (Энгийн сүлжээний цагийн протокол) - цагийн үйлчилгээ үзүүлэхэд зориулагдсан үйлчлүүлэгчийн бүрэлдэхүүн хэсэг. Одоогийн огноо, цагийг тодорхойлохын тулд ямар ч цагийн үйлчилгээнд холбогдоход ашиглаж болно.

TIdSimpleServer

Хөнгөн TCP серверээр хангадаг серверийн бүрэлдэхүүн хэсэг. Цэгээс цэгийн холболтыг зохион байгуулах боломжийг танд олгоно. Энэ нь нэг хэрэглэгчтэй сервер үүсгэхэд ашиглагддаг, өөрөөр хэлбэл нэг удаад зөвхөн нэг холболтоор үйлчлэх боломжтой. TIdTCPServer бүрэлдэхүүн хэсгээс ялгаатай нь энэ нь үйлчлүүлэгчдийн хүсэлтийг хүлээж, эдгээр хүсэлтийг боловсруулах үед хоёрдогч процессуудыг үүсгэдэггүй. Өөрөөр хэлбэл, хэрэв сервер нь үйлчлүүлэгчийн хүсэлтэд үйлчилж байгаа бөгөөд тэр үед өөр үйлчлүүлэгч холбогдохоор холбогдож байгаа бол эхний хүсэлтийг боловсруулж дуустал хаагдах болно.

TIdTelnet болон TIdTelnetServer

Үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь консолын хэлэлцээр, баталгаажуулалт зэрэг өөр компьютер дээр алсын сессийг зохион байгуулахад ашиглагддаг. Харилцаа холбооны протокол нь сервертэй харилцан үйлчлэлцэж буй хүн байгаа гэж үздэг. Үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь дэлгэцийн дэмжлэг эсвэл терминалын эмуляцгүй, харин серверийн хэсэгтэй холболтыг хангадаг. Ихэвчлэн TIdTelnetServer серверийн протоколыг үйлчлүүлэгчидтэй харилцан үйлчлэхийн тулд текст интерфэйс бүхий алсын мэдээллийн санг зохион байгуулахад ашигладаг.

TIdTime болон TIdTimeServer

Үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь цагийг тодорхойлох TIdSNTP бүрэлдэхүүн хэсгийн өөр хувилбар юм. Хоёр протоколын формат өөр гэдгийг анхаарах нь чухал юм. TIdTime нь RFC 868 формат дээр суурилдаг (дотоод UNIX OS стандартад цагийг буцааж, шаардлагатай бүх хөрвүүлэлтийг гүйцэтгэдэг). Серверийн бүрэлдэхүүн хэсэг нь DayTime сервертэй төстэй. Цагийн үйлчилгээг хэрэгжүүлэхэд ашиглаж болно орон нутгийн компьютер. Нэмэлт код шаардлагагүй, зүгээр л серверийн компьютерийн дотоод цагийн цагийг буцаах TIdTimeServer-ийн жишээг үүсгэ.

TIdTrivialFTP болон TIdTrivialFTPServer

Эдгээр бүрэлдэхүүн хэсгүүд нь энгийн файл дамжуулах протоколыг зохион байгуулахад шаардлагатай байдаг. Энэ протоколын клиент бүрэлдэхүүн хэсэг нь холбогдох серверийн бүрэлдэхүүн хэсэгтэй холбогдоход хэрэглэгддэг. Протокол нь хувийн, хөнгөн, орон нутгийн файл дамжуулах тохиолдлуудад, жишээлбэл, дотоод сүлжээн дэх эсвэл чиглүүлэгч рүү чиглүүлэгчийн хүснэгтийг ачаалах (байршуулах) зориулалттай. Энэ протоколын шинж чанар суларсан тул түүнийг баталгаажуулах алгоритм эсвэл бусад аюулгүй байдлын механизм ашиглах үед ашиглахыг зөвлөдөггүй. Энэхүү протоколын гол зорилго нь файлуудыг техник хангамжийн төхөөрөмжид өөрчлөх зорилгоор шилжүүлэх явдал юм.

TIdTunnelMaster болон TIdTunnelSlave

Серверийн туннелийн бүрэлдэхүүн хэсгүүдийг нэг физик (туннель) дээр олон логик холболтыг зохион байгуулахад прокси серверт ашигладаг. Эдгээр ангиудыг янз бүрийн зорилгоор ашиглаж болно, жишээлбэл, нууц бус сувгуудаар нууц холболтыг зохион байгуулах.

TIdWhois болон TIdWhoIsServer

Энэхүү үйлчлүүлэгчийн бүрэлдэхүүн хэсэг нь ямар ч стандарт Whois сервертэй холбогдож, домэйны талаарх мэдээллийг авах боломжийг танд олгоно. Серверийн бүрэлдэхүүн хэсэг нь NIC серверийн үндсэн функцийг хангадаг.

Indy Misc

Indy Miscellaneous Components палитр хуудсанд BASE64, UUE, Quoted Printable болон бусад нийтлэг имэйл харилцааны формат, кодлогч (MD2, MD4, MD5) зэрэг нууц үг болон цахим гарын үсэгэргэлт буцалтгүй (тайлахад хэцүү) хэлбэрээр, түүнчлэн бусад олон ашигтай бүрэлдэхүүн хэсгүүд, хэрэгслүүд нь интернетийн програмуудыг хөгжүүлэхэд ихэвчлэн ашиглагддаг.

TIdAntiFreeze

Indy бүрэлдэхүүн хэсгүүдийн блок дээр суурилсан алгоритмуудын улмаас холболт ажиллаж байх үед програм гацсан байх нь элбэг. Програмыг хөлдөхөөс урьдчилан сэргийлэхийн тулд харилцаа холбоог зохион байгуулахдаа хоёрдогч процесс (утас) ашиглахыг арилгахын тулд маягт дээр заасан бүрэлдэхүүн хэсгийг байрлуулахад хангалттай.

Энэхүү бүрэлдэхүүн хэсэг нь TCP/IP протоколын стекээс хүсэлтийг задлан шинжилж, гадаад холболт хаагдсан үед саатлын үед програм руу мессеж илгээх замаар ажилладаг бөгөөд энэ нь код ажиллаж байгаа мэт хуурмаг байдлыг бий болгодог. Бүрэлдэхүүн хэсэг нь хаагдсан холболтод зөвхөн үндсэн процесст нөлөөлдөг тул програмын хоёрдогч процесст TIdAntiFreeze ашиглах шаардлагагүй. TIdAntiFreeze бүрэлдэхүүн хэсэг нь мессежийг боловсруулахын тулд үндсэн процесс үе үе тасалддаг тул холболтыг удаашруулдаг гэдгийг санаарай. Эндээс үзэхэд хөгжүүлж буй програм нь OnClick, OnPaint, OnResize гэх мэт мессежийг боловсруулахад хэт их цаг зарцуулахгүй байхыг анхаарах хэрэгтэй. Үүнийг тодорхой хэмжээгээр TIdAntiFreeze ангийн шинж чанараар удирдаж болно. Энэ бүрэлдэхүүн хэсгийг ашиглах нь заавал байх албагүй боловч програмын харааны интерфэйстэй холболтыг синхрончлох асуудлыг шийдэх боломжийг танд олгоно.

TIdDateTimeStamp

Интернет протоколууд өөр өөр огноо, цагийн форматыг ашигладагтай холбоотой огноо, цагийн математикийг гүйцэтгэх анги; Үүнээс гадна үйлчлүүлэгч болон серверүүд өөр өөр цагийн бүсэд байрлаж болно.

TIdIPWatch

Энэ нь компьютерийн IP хаягийн өөрчлөлтийг байнга хянаж байдаг таймер дээр суурилсан бүрэлдэхүүн хэсэг юм. Өөрчлөлт илэрсэн үед бүрэлдэхүүн хэсгүүдийн үйл явдлууд тохиолддог. Энэ бүрэлдэхүүн хэсэг нь ихэвчлэн компьютер интернет эсвэл бусад сүлжээнд холбогдсон эсэхийг илрүүлэхэд ашиглагддаг. Энэ тохиолдолд IP хаягийн өөрчлөлт нь шинэ сүлжээнд холбогдох үед DHCP (Динамик хостын тохиргооны протокол) серверээс өгсөн IP хаягтай холбоотой байж болно.

TIdLogDebug

Энэ бүрэлдэхүүн хэсгийн зорилго нь аливаа үйлчлүүлэгч эсвэл серверийн бүрэлдэхүүн хэсгийн үйл явдлыг таслан зогсоох, үйл явдлын бичлэгийг оруулах явдал юм заасан файл. Энэ бүрэлдэхүүн хэсэг нь Indy бүрэлдэхүүн хэсгүүдийг дибаг хийхэд маш хэрэгтэй.

TIdMessage

Бүрэлдэхүүн хэсэг нь мессежийг зөв тайлах эсвэл кодлохын тулд бусад бүрэлдэхүүн хэсгүүдтэй хослуулан ашигладаг. Эдгээр нь POP, SMTP, NNTP бүрэлдэхүүн хэсгүүд байж болно. Анги нь MIME шифрлэлт болон тайлах, олон байт тэмдэгтүүд болон ISO кодчилолыг дэмждэг.

TIdNetworkCalculator

Програмыг бүтээхэд ашиглаж болох цөөхөн Indy бүрэлдэхүүн хэсгүүдийн нэг. Сүлжээний тооцоолуурыг сүлжээний маск, дэд сүлжээ, сүлжээний анги гэх мэт IP хаягууд дээр тооцоолол хийхэд ашиглаж болно.

TIdThreadMgrDefault

Бүрэлдэхүүн хэсэг нь анхдагчаар хоёрдогч процессуудыг хянах боломжийг олгодог. Процессын удирдлагыг дэмждэг Indy бүрэлдэхүүн хэсэг нь тодорхойлогдсон TIdThreadManager ангийн жишээгүй үед үүсгэгдэнэ. Бүрэлдэхүүн хэсэг нь хоёрдогч процессыг удирдах үндсэн чадамжийг өгдөг: эрэлт хэрэгцээний дагуу тэдгээрийг үүсгэх, устгах.

TIdThreadMgrPool

TIdThreadMgrDefault-аас илүү дэвшилтэт процессын удирдлагын бүрэлдэхүүн хэсэг, учир нь энэ нь процессуудыг эрэлт хэрэгцээгээр үүсгэх эсвэл устгахын оронд нэгтгэдэг.

TIdVCard

VCard нь нэрийн хуудасны цахим эквивалент бөгөөд эзэмшигчийн хувийн мэдээлэл болон график өгөгдлийг агуулж болно.

TIdIMFDecoder

Интернет мессежийг тайлахад зориулагдсан. Энэ нь бусад кодлогчийн бүрэлдэхүүн хэсгүүдийн нэгэн адил TIdCoder ангийн удам юм. TIdCoder анги нь 1982 оны 8-р сард санал болгосон ARPA интернет текст мессежийн форматын стандарт RFS-822 болон 1987 оны 12-р сард санал болгосон USENET мессежийн RFC 1036 стандартын дагуу код тайлдаг.

Бүрэлдэхүүн хэсэг нь TIdCoder ангиллыг өргөтгөж, RFS-822 форматыг толгойн контекстээр нь илрүүлэх боломжийг олгож, хүлээн авах үед шифрлэх горим, MIME шифрлэлт болон шифрийг тайлах боломжийг олгодог. TIdIMFDecoder бүрэлдэхүүнийг TIdMessageClient ангид хүлээн авсан болон дамжуулсан мессежийг тайлахад ашигладаг.

TIdQuotedPrintableEncoder

QuotedPrintableEncoder нь заасан форматаар текстийн шифрийг тайлах боломжийг танд олгоно. Тодорхой кодчилол бүхий бие даасан бүрэлдэхүүн хэсэг болж, шинэ кодчилол агуулсан мессежийг дамжуулах боломжтой.

TIdBase64 кодлогч

Хэвлэх боломжгүй тэмдэгтүүдийг дамжуулах боломжтой өөр шифрлэлтийн алгоритмыг хэрэгжүүлдэг.

TIdUUEнкодер

Шифрлэлтийн анхны алгоритмуудын нэг болох UU кодчилолыг хэрэгжүүлдэг. Заримдаа мэдээний үйлчилгээнд нийтлэл илгээхэд ашигладаг.

TIdXXEncoder

Энэ шифрлэлтийн аргыг хэзээ ч ашиглах боломжгүй. Үндсэндээ энэ нь ижил UU кодчилол боловч өөр шифрлэлтийн хүснэгттэй.

TIdCoderMD2

Өөр өөр төрлийн MD (Message Digest) шифрлэлтийн алгоритм бүхий бүрэлдэхүүн хэсгүүд. Тэд бүгд холилдоход суурилсан, нэг чиглэлтэй бөгөөд шифрийг тайлах алгоритмгүй.

Протоколын клиент болон серверийн бүрэлдэхүүн хэсгүүдийг үндсэн програмууд (ClientSocket, ServerSocket) болон Интернет болон Fastnet палитраас бусад бүрэлдэхүүн хэсгүүдийн хамт эсвэл оронд нь сервер болон үйлчлүүлэгчийн интернет програмуудыг хөгжүүлэхэд ашиглаж болно. Indy бүрэлдэхүүн хэсгүүд нь WebBroker-ийн архитектурыг ашигладаггүй бөгөөд Интернет протокол, үйлчилгээний доод түвшний дэмжлэгийг шууд эх кодод нь хэрэгжүүлдэг ( эх кодуудхавсаргасан байна).

TIdConnectionInterceptOpenSSL болон TIdServerInterceptOpenSSL

Хоёр програмын хоорондох харилцааны нууцлал, найдвартай байдлыг хангадаг SSL протокол - Secure Sockets Layer нь хоёр давхаргатай. Олон давхаргат тээврийн протоколын доод түвшинд (TCP гэх мэт) SSL нь бичлэг хийх протокол бөгөөд янз бүрийн дээд түвшний протоколуудыг багтаахад ашигладаг. SSL-ийн давуу тал нь энэ нь бие даасан хэрэглээний протокол боловч SSL дээр дээд түвшний протоколыг ашиглаж болно.

SSL нь харилцааны аюулгүй байдлыг хангадаг бөгөөд энэ нь гурван үндсэн үүрэгтэй: нууц холболтыг хангах; ашиглан шифрлэх нийтийн түлхүүр(хүлээн авагчийн жинхэнэ эсэхийг баталгаажуулахад ашигладаг); өгөгдөл дамжуулах найдвартай байдлыг дэмжих.

  • Тэгш хэмт криптографийг өгөгдлийг шифрлэхэд ашигладаг (жишээлбэл, DES, RC4 гэх мэт).
  • Цахим гарын үсэгтэгш хэмт бус нийтийн түлхүүрийн шифрлэлт (жишээ нь, RSA, DSS гэх мэт) ашиглан хангагдсан.
  • Харилцааны найдвартай байдал, мессежийн тээвэрлэлт нь MAC тооцоолол ашиглан MAC залруулах кодууд, аюулгүй хэш функцууд (жишээ нь, SHA, MD5 гэх мэт) дамжуулан мессежийн бүрэн бүтэн байдлыг шалгах зэрэг орно.

HTTP болон серверийн нэвтрэлт танилттай хослуулан SSL нь шаардлагатай шифрлэлтийн функцуудыг хангаж, вэб серверийн таниулбарыг хөндлөн шалгах замаар цаашид тогтоосон холболтыг хадгалж байдаг. SSL нь зөвхөн өгөгдөл дамжуулах явцад харилцаа холбоог хамгаалж, бусад хамгаалалтын механизмыг орлохгүй гэдгийг ойлгох нь чухал юм.

TIdConnectionInterceptOpenSSL болон TIdServerInterceptOpenSSL бүрэлдэхүүн хэсгүүд нь SSL протоколыг ашиглан клиент болон сервер талын холболтыг хангадаг. TIdConnectionInterceptOpenSSL болон TIdServerInterceptOpenSSL бүрэлдэхүүн хэсгүүд нь зөвхөн Delphi 6 дээр байдаг ба Kylix дээр байдаггүй гэдгийг тэмдэглэх нь зүйтэй. Энэ нь Windows-ийн хэрэгжилтийн хувьд үйлдлийн системийн функц дээр суурилдаг протоколын нарийн төвөгтэй байдалтай холбоотой юм.

Indy бүрэлдэхүүн хэсгүүдийг ашиглах жишээг /Delphi6/Demos/Indy лавлахаас олж болно. Нийтдээ 8.0 хувилбар дахь Indy номын сан нь 69 бүрэлдэхүүн хэсэгтэй. 9.0 хувилбарт заасан номын сан нь 86 бүрэлдэхүүн хэсгийг агуулна гэж заасан. Бүх бүрэлдэхүүн хэсгүүд нь нэгдсэн бөгөөд Delphi 6 болон Kylix аль алинд нь багтсан бөгөөд энэ нь тэдгээрийг платформ хоорондын програмуудыг хөгжүүлэхэд ашиглах боломжийг олгодог. Бүх Indy бүрэлдэхүүн хэсгүүд нь олон урсгалыг дэмждэг.

Indy бүрэлдэхүүн хэсгүүд нь хүснэгтэд тодорхой үзүүлсэн шиг Интернет болон Fastnet бүрэлдэхүүн хэсгүүдээс олдсон бараг бүх функцийг хэрэгжүүлдэг.

Хурдан ба бүрэлдэхүүн хэсгүүд Indy бүрэлдэхүүн хэсгүүд Бүрэлдэхүүн хэсгүүдийн зорилго
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket TCP/IP протоколыг ашиглан хоёр компьютер (үйлчлүүлэгч ба сервер) хоорондын харилцан үйлчлэл
2 TNMDayTime TIdDayTime, TIdDayTimeServer Одоогийн цагийг серверээс асуу
3 TNMEcho TIdEcho, TIdEchoServer Хариу сервертэй харилцахад ашигладаг
4 TNMFinger TIdFinger, TIdFingerServer Интернэт хайлтын серверээс хэрэглэгчийн талаарх мэдээллийг авахад ашигладаг
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer FTP протоколыг ашиглан файл дамжуулалтыг хангана
6 TNMHTTP TIdHTTP, TIdHTTPSсервер Өгөгдөл солилцохын тулд HTTP протоколыг ашиглана уу
7 TNMMsgServ, TNMMsg Энгийн байдлаар дамжуулахад ашигладаг мессежүйлчлүүлэгчээс сервер рүү
8 TNMNNTP TIdNNTP, TIdNNTPSсервер Мэдээллийн сервертэй өгөгдөл солилцохыг дэмждэг
9 TNMPOP3 TIdPOP3 POP3 протоколыг ашиглан мэйл серверээс имэйл хүлээн авахад ашигладаг
10 TNMSMTP TIdSMTP -ээр имэйл илгээхэд ашигладаг шуудангийн серверИнтернет
11 TNMStrm, TNMStrmServ TCP/IP протоколыг ашиглан урсгал руу бичигдсэн хоёртын өгөгдлийг дамжуулдаг
12 TNMUDP TIdUDP, TIdUDPSсервер UDP протоколыг ашиглан өгөгдөл дамжуулах
13 TpowerSock, TNMGeneralServer Өөрийн үйлчлүүлэгч (Powersock) болон серверүүд (NMGeneralServer) бичих үндэс болсон бүрэлдэхүүн хэсгүүдийн бүрээстэй ангиуд.
14 TNMUUПроцессор TIdUUencoder, TIdUUDecoder Дахин кодчилол хийх хоёртын файлууд MIME эсвэл UUENCODE формат руу
15 TNMURL Мөрүүдийг HTML формат руу хөрвүүлж, урвуу хөрвүүлэлтийг гүйцэтгэдэг

Үл хамаарах зүйл нь TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL зэрэг хуучирсан протоколуудыг хэрэгжүүлдэг эсвэл өөр ангиудын том бүлэгт хэрэгжсэн функцтэй ангиуд юм.

Гэсэн хэдий ч өмнөх хувилбарууд болох Интернэт болон Fastnet бүрэлдэхүүн хэсгүүдээс ялгаатай нь Indy нь өгөгдлийг хөрвүүлэх, шифрлэх илүү баялаг серверийн бүрэлдэхүүн хэсгүүд, бүрдэл хэсгүүд, түүнчлэн баталгаажуулалтын дэмжлэг (Indy Misc палитр) агуулдаг. Дээрх хүснэгтээс харахад үндсэн протокол, үйлчилгээг зөвхөн үйлчлүүлэгч төдийгүй серверийн бүрэлдэхүүн хэсгүүдээр хангадаг. Эдгээр нь цагийн үйлчилгээ, хариу өгөх үйлчилгээ, хэрэглэгчийн мэдээллийг олж авах, мөн HTTP, NNTP, UDP протоколууд, тэр ч байтугай FTP-ийн хамгийн энгийн хувилбарууд юм.

Indy бүрэлдэхүүн хэсгүүдийг ашиглах зарим жишээ

Delphi-д агуулагдах Indy бүрэлдэхүүн хэсгүүдэд IP хаяг нь Host шинж чанарт тодорхойлогддог бөгөөд ихэвчлэн зөвхөн клиент програмуудад байдаг. Серверт байршуулсан бүрэлдэхүүн хэсгүүд нь харгалзах портын санал асуулгыг эхлүүлэх эсвэл зогсоох боломжтой аргуудтай байдаг - жишээлбэл, IdTCPServer бүрэлдэхүүн хэсгийн Active шинж чанарыг өөрчлөх нь харгалзах портын санал асуулгыг эхлүүлж эсвэл зогсоодог. Үйлчлүүлэгч болон серверийн хооронд холболт үүссэний дараа өгөгдөл дамжуулах ажлыг эхлүүлж болно.

Indy бүрэлдэхүүн хэсгүүд нь өгөгдөлтэй ажиллахдаа аюулгүй байдал, найдвартай байдалд ихээхэн ач холбогдол өгдөг. Жишээлбэл, IdTCPClient бүрэлдэхүүн хэсэг нь Connect болон Disconnect аргуудтай. Үйлчлүүлэгч талаас доорх код шиг програмчлалын техникийг ашиглан:

TCPClient-тэй холбогдож эхэлнэ үү; lstMain.Items.Add(ReadLn); эцэст нь салгах; Төгсгөл; Төгсгөл;

мөн сервер талаас TIdPeerThread ангийн AThread жишээнд параметр болгон дамжуулсан Холболтын шинж чанарыг ашиглан:

AThread.Connection-тэй WriteLn("Үндсэн Indy сервер серверээс мэндчилж байна."); Салгах; Төгсгөл;

та холболтын хэвийн гүйцэтгэл эсвэл алдааг зөв зохицуулсан гэдэгт найдаж болно.

Харгалзах ангиудын ReadLn болон WriteLn аргуудыг анхаарна уу - тэдгээр нь стандарт Паскал I/O хэллэгтэй төстэй. Энэ нь системийн ихэнх үйлдлүүдийг харгалзах файлуудыг уншиж бичих замаар гүйцэтгэдэг UNIX програмчлалын техникт хүндэтгэл үзүүлж байна.

Fastnet бүрэлдэхүүн хэсгүүдийн нэгэн адил Indy бүрэлдэхүүн хэсгүүдэд үйл явдлын менежментийг хангахад ашиглаж болох үйл явдлууд байдаг. Жишээлбэл, та үйлчлүүлэгчтэй холбогдох үед маягт дээр гарч ирэх мессежийг зохион байгуулж болно:

процедур TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); start lblStatus.caption:= "[ Үйлчлүүлэгч үйлчлүүлэгч ]"; Төгсгөл;

Indy нь энэ номын санд өвөрмөц байдаг клиент болон серверийн хэсгүүдтэй протоколуудыг хэрэгжүүлдэг бүрэлдэхүүн хэсгүүдээр хангадаг. TIdGopherServer болон TIdGopher бүрэлдэхүүн хэсгүүд нь үйлчлүүлэгч талын GetExtendedMenu, GetFile, GetMenu, GetTextFile аргууд болон сервер талд ReturnGopherItem, SendDirectoryEntry-ийн ачаар файлуудыг үзэхэд тусалдаг. янз бүрийн төрөл, нуугдмал гэж тэмдэглэсэн, мөн дээр байгаа лавлах зэрэг алсын компьютер(MS-DOS үйлдлийн системд dir *.* команд хэрхэн хийдэгтэй төстэй).

IdSMTP болон IdMessage бүрэлдэхүүн хэсгүүдийг ашигласнаар та SMTP протоколыг ашиглан шуудан илгээх боломжтой өөрийн вэб программыг хялбархан үүсгэж болно.

Энэ тохиолдолд IdMessage анги (Indy Misc хуудасны 23 бүрэлдэхүүн хэсгийн нэг) нь түүний нэрнээс үүдэлтэй мессежийг үүсгэх үүрэгтэй бөгөөд IdSMTP нь шуудангийн сервертэй холболтыг зохион байгуулах үүрэгтэй.

Indy-д хэрэглэгдэж буй технологи нь унших, бичих түгжих үйлдлийг ашигладаг. Indy-д ашигласан аливаа Connect үйлдэл нь холболт дуусахыг хүлээнэ. Indy үйлчлүүлэгчийн бүрэлдэхүүн хэсгүүдтэй ажиллахдаа та дараах зүйлсийг хийх хэрэгтэй:

  • сервертэй холбогдох хүсэлт гаргах;
  • серверт унших, бичих хүсэлт гаргах (серверийн төрлөөс хамааран алхам нь нэг удаа хийгддэг эсвэл олон удаа давтагддаг);
  • сервертэй холболтыг зогсоож, салга.

Indy бүрэлдэхүүн хэсгүүд нь хэт өндөр түвшний хийсвэрлэлийг хангах зорилготой юм. TCP/IP стекийн нарийн ширийн зүйлс, нарийн ширийн зүйлс нь програмистаас нуугдаж байгаа бөгөөд ингэснээр тэр ажилдаа анхаарлаа төвлөрүүлж чадна.

Дараах жижиг жишээ нь ердийн үйлчлүүлэгчийн шошны сессийг харуулж байна:

IndyClient-ийн тусламжтайгаар Host:= "zip.pbe.com"; // Дуудлага хийх хост Порт:= 6000; // Connect дээрх сервер рүү залгах порт; оролдоно уу // Таны код энд байна эцэст нь Disconnect; Төгсгөл; Төгсгөл;

Жишээн дээр сервертэй холболт тогтоогдоогүй байсан ч try-finally хэллэгийг ашигласнаар холболт эвтэйхэн тасарна.

Indy-ийн серверийн бүрэлдэхүүн хэсгүүд нь таны хэрэгцээ болон ашиглаж буй протоколоос хамааран ашиглаж болох олон төрлийн серверийн загваруудыг тодорхойлдог.

TIdTCPServer нь хамгийн түгээмэл хэрэглэгддэг серверийн бүрэлдэхүүн хэсэг бөгөөд програмын үндсэн процессоос үл хамааран хоёрдогч процесс үүсгэдэг. Үүсгэсэн процесс нь ирж буй хүсэлтийг хүлээж байна боломжит үйлчлүүлэгчид. Хүсэлтэд нь хариу өгсөн үйлчлүүлэгч бүрийн хувьд бие даасан хоёрдогч процессыг бий болгодог. Засвар үйлчилгээний явцад тохиолддог үйл явдлууд нь холбогдох үйл явцын нөхцөлтэй холбоотой байдаг.

Өөрөөр хэлбэл, үйлчлүүлэгчийн холболт бүрийн хувьд TIdTCPServer анги нь тухайн thread-ийн OnExecute үйл явдлын зохицуулагчийг дуудаж өвөрмөц хоёрдогч урсгалыг ашигладаг. OnExecute аргын албан ёсны параметр нь үүсгэсэн хэлхээнд харгалзах Athread ангийн жишээний лавлагаа юм. Энэ ангийн Connection шинж чанар нь TIdTCPConnection классын лавлагаа бөгөөд үүний жишээ нь үйлчлүүлэгчийн хүсэлтийг боловсруулахад зориулагдсан байдаг. TIdTCPConnection нь холболтоор унших, бичих, мөн харилцааны сесс үүсгэх, дуусгахыг дэмждэг.

UDP протокол нь эхлээд сервертэй холболт үүсгэхгүйгээр ажилладаг (илгээсэн пакет бүр нь бие даасан өгөгдлийн багц бөгөөд илүү том сесс эсвэл холболтын хэсэг биш). TIdTCPServer нь холболт бүрд тусдаа хэлхээ үүсгэдэг бол TIdUDPServer нь UDP протоколын бүх хүсэлтийг хариуцдаг үндсэн урсгал эсвэл нэг хоёрдогч урсгалыг ашигладаг. TIdUDPServer идэвхтэй байх үед ирж буй UDP пакетуудыг сонсох урсгал үүсдэг. Хүлээн авсан пакет бүрийн хувьд OnUDPRead үйл явдал ThreadedEvent шинж чанарын утгаас хамааран үндсэн урсгал дээр эсвэл сонсох хэлхээний контекст дээр үүсдэг. ThreadedEvent нь худал гэж үнэлэгдэх үед уг үйл явдал үндсэн урсгал дээр, эс бөгөөс сонсох хэлхээнд тохиолддог. Үйл явдлыг боловсруулж байх үед серверийн бусад үйлдлүүд хаагдсан байна. Тиймээс OnUDPRead процедурыг аль болох хурдан ажиллуулах нь чухал юм.

Хэрэв та одоо байгаа протоколыг ашиглан одоо байгаа серверт шинэ клиент програм үүсгэх шаардлагатай бол таны ажил зөвхөн клиент програмыг хөгжүүлж, дибаг хийх явдал юм. Гэсэн хэдий ч, та үйлчлүүлэгч болон аль алиныг нь хөгжүүлэх ёстой үед серверийн програмОдоо байгаа эсвэл шинэ протокол ашиглаж байгаа эсэхээс үл хамааран бид "тахиа, өндөг" гэсэн сонгодог асуудалтай тулгардаг. Програмчлалыг хаанаас эхлэх вэ - үйлчлүүлэгчээс эсвэл серверээс?

Мэдээжийн хэрэг, үйлчлүүлэгч болон сервер хоёулаа эцэст нь үүсэх ёстой. Олон программуудын хувьд, ялангуяа текстэд суурилсан протокол (HTTP гэх мэт) ашигладаг программуудын хувьд серверийг зохион бүтээх замаар програмыг үүсгэж эхлэх нь илүү хялбар байдаг. Мөн дибаг хийхэд тохиромжтой үйлчлүүлэгч аль хэдийн байдаг. Энэ нь Windows болон UNIX дээр ашиглах боломжтой Telnet консол програм юм.

Хэрэв та консолыг бичвэл telnet тушаал 127.0.0.1 80 локал компьютерийн IP хаяг, вэб серверүүд анхдагчаар ашигладаг портын дугаар 80, дараа нь програм Зураг дээр үзүүлсэн текстийн дагуу хариу өгөх болно. 6, Windows 2000 үйлдлийн систем болон IIS 5.0 тохиолдолд.

Indy бүрэлдэхүүн хэсгүүдийг ашиглан хамгийн энгийн сервер үүсгэхийн тулд танд дараах зүйлс хэрэгтэй:

Хэрэв та холболт тасарсан үед үйлчлүүлэгчдээ зөв мэдээлэхээс гадна гарсан алдааны талаар мэдээлэл өгөх сервер зохион бүтээх шаардлагатай бол try-finally гэхийн оронд try-except хэллэгийг ашиглана уу. дараах жишээнд харуулав.

процедур TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: мөр; AThread гэж эхэлнэ. Холболтыг оролдоод үзээрэй s:= ReadLn; // Энд серверийн даалгаврыг гүйцэтгэнэ // хэрэв ямар нэгэн онцгой тохиолдол гараагүй бол // серверийн хариу WriteLn(s)-ийг бичнэ үү; e-с бусад тохиолдолд: Exception do begin WriteLn(e.Message); end; //on end; //оролдохоос бусад нь эцсийн байдлаар Disconnect; end; end;

Энэхүү жижиг жишээ нь энгийн текст сервер үүсгэх алхмуудыг, түүнчлэн түүнийг хэрхэн дибаг хийхийг харуулж байна.

Дээр дурдсан сервер нь орчин үеийн тархсан тооцооллын зохион байгуулалтын ердийн жишээ юм.

Олон шатлалт програм үүсгэх онцлог

Сүүлийн үед үйлчлүүлэгчдийн хүсэлтийг хангахын тулд олон серверүүд улам бүр ашиглагдаж байна. Энэ төрлийн сервер нь үйлчлүүлэгчийн хүсэлтийг хүлээн авч, цаашид боловсруулахад хэсэгчлэн бэлтгэсний дараа өөр сервертэй холбогдож, өөрчилсөн хүсэлт эсвэл хүсэлтийг илгээдэг. Хоёрдахь түвшний сервер нь эргээд бусад серверүүдтэй харилцах боломжтой. Тиймээс бид олон түвшний серверийн архитектурын тухай ярьж болно.

Дараа нь бид өгөгдлийн сангаас өгөгдлийг буцаах зорилготой өгөгдөлд нэвтрэх серверийг бий болгоно. Гэхдээ энэ сервер өгөгдлийн сангийн файлуудыг шууд уншиж, бичихгүй. Харин үйлчлүүлэгчид шаардлагатай өгөгдлийг хайж олохын тулд өгөгдлийн сангийн сервертэй холбогддог.

Тиймээс бид гурван шатлалт архитектур бүхий програм боловсруулж эхэлнэ. Indy бүрэлдэхүүн хэсгүүдийг ашиглан мэдээллийн баазын сервер үүсгэхийн тулд танд дараах зүйлс хэрэгтэй:

  1. Шинэ төсөл үүсгэх.
  2. Indy Servers палитраас TIdTCPServer бүрэлдэхүүн хэсгийн жишээг төслийн үндсэн хэлбэрт байрлуул.
  3. TIdTCPServer1 ангийн жишээний DefaultPort шинж чанарыг 6001 болгож тохируулна уу (өөр өөр программууд дээр портын дугаарыг давхардуулахгүйн тулд том утгууд өгөхийг зөвлөж байна), Active шинж чанарыг үнэн гэж тохируулна уу.
  4. File |-г сонгон төсөлд шинэ модуль нэмнэ үү Шинэ | Мэдээллийн модуль болон бүрэлдэхүүн хэсгүүдийн палитр дээрх dbExpress табаас SQLConnection болон SQLDataSet бүрэлдэхүүн хэсгүүдийн жишээг байрлуул.
  5. SQLConnection ангийн ConnectionName шинж чанарыг IBLocal, LoginPrompt-г худал болгож тохируулна уу. Хэрэв та ажилтан.gdb мэдээллийн сан дээр IBLocal-г тохируулаагүй бол эхлээд энэ процедурыг дуусга.
  6. SQLDataSet ангийн SQLConnection шинж чанарыг SQLConnection1 болгож, CommandText-д шинж чанарыг онооно уу. SQL мэдэгдэл: CUST_NO = :cust-аас CUSTOMER, CONTACT_FIRST, CONTACT_LAST-г сонго.

Серж Досюков Майк Фам

Энэ нийтлэл нь Indy иж бүрдэл болон Delphi 7-г ашиглан бие даасан вэб үйлчилгээг хэрхэн үүсгэх, мөн Delphi 7 SOAP-д суурилсан вэб үйлчилгээг дэмжихийн тулд Indy иж бүрдлийг хэрхэн ашиглахыг харуулах болно. Ард нь нэмэлт мэдээлэлВэб үйлчилгээг бий болгох талаар мэдээлэл авахыг хүсвэл Borland нийгэмлэгийн сайт дээрх Ник Ходжесын гайхалтай нийтлэлийг үзнэ үү: Вэб дээрх Шекспир.

Эрт орой хэзээ нэгэн цагт та бие даасан HTTP сервер болох вэб үйлчилгээг дэмждэг сервер үүсгэх хэрэгтэй болж магадгүй. Жишээлбэл, та Delphi ашиглан бүтээгдсэн n түвшний програмын хувьд SOAP-д суурилсан програмын сервер үүсгэхийг хүсч болно.

Оршил

Delphi-ийн онлайн тусламж нь маш сайн үйлчилгээ үзүүлдэг дараалсан зааварВэб үйлчилгээ, MIDAS сервер (COM, DCOM загвар) хэрхэн үүсгэх талаар, гэхдээ SOAP протокол дээр суурилсан бие даасан n түвшний MIDAS програмыг бий болгох тухай мэдээлэл бараг байдаггүй.

Өмнө нь Дэйв Ноттаж хэвлүүлсэн. Энэ нийтлэлд SOAP-ийн дэмжлэгтэйгээр Delphi 6-д вэб үйлчилгээг хэрхэн бий болгох, Datamodule-ийн SOAP интерфейсийг нийтлэх боломжтой гэсэн санааг тайлбарласан, өөрөөр хэлбэл энэ нийтлэл нь танд өөрийн n-шатлалыг хэрхэн үүсгэх талаар сурах боломжийг олгосон. MIDAS системүүд.

Borland-ийн Delphi 7 болон шинэ Indy иж бүрдэл нь энэ функцийг дэмждэг.

Гэсэн хэдий ч суурилуулсан дэмжлэгийг үл харгалзан энэ функцийг баримтжуулаагүй болно.

Борландын сүлжээний бага хурал дээр саяхан нийтлэгдсэн нийтлэлүүд болон Google сервер ашиглан вэбээс хайлт хийсэн нь зохиогчдод одоо байгаа кодыг Delphi 6-аас Delphi 7 руу хөрвүүлэх аргыг боловсруулах боломжийг олгосон. Гэхдээ бүх зүйл өөрийн цаг хугацаатай байдаг.

гол утга

Энэхүү нийтлэл нь гурван ангит цувралын эхний хэсэг юм. Үүнд үндсэн заалтуудыг тусгасан болно. Хоёр, гурав дахь хэсгийг зарим асуудал, тэдгээрийг шийдвэрлэх арга замд зориулах болно. Гол санааг тайлбарлаж эхэлцгээе.

  • бие даасан HTTP сервер байх;
  • Indy-г платформ болгон ашиглах;
  • SOAP протоколоор дамжуулан нийтлэхийг дэмжих;
  • SOAP DataModules-ийг нийтлэх чадвартай байх ба энэ нь танд SOAP/HTML дээр суурилсан өөрийн n түвшний сервер үүсгэх боломжийг олгоно.

HTTP сервер ба SOAP

Олон хүмүүс Indy-г мэддэг бөгөөд өмнө нь THTTPServer бүрэлдэхүүн хэсгүүдийг ашиглаж байсан. Энэ бүрэлдэхүүн хэсгийг өргөдлийн маягт дээр байрлуулахад хялбар байдаг, гэхдээ та үүнийг хэрхэн SOAP-ыг дэмжих вэ? "C:Program FilesBorlandDelphi7SourceIndy" лавлахаас та IdHTTPWebBrokerBridge.pas файлыг олох боломжтой. Энэ бол танд яг хэрэгтэй зүйл юм.

Энэ файл нь Indy файлын нэг хэсэг биш тул та үүнийг одоогийн төсөлдөө стандарт төслийн файл болгон оруулах хэрэгтэй. (Төслийг эмхэтгэхийн тулд танд IdCompilerDefines.inc файл хэрэгтэй болно.) Эдгээр файлуудыг одоогийн төслийн лавлах руу хуулсан байх ёстой. Хурдыг нэмэгдүүлэхийн тулд кодын өөрчлөлт шаардлагатай байж болох тул эдгээр файлуудыг Indy түгээлтээс тусад нь байлгах нь дээр.

Дараах нь TIdHTTPWebBrokerBridge гэж нэрлэгддэг SOAP пакетуудыг дэмжих зорилгоор өргөтгөсөн THTTPServer-ийн орлуулах бүрэлдэхүүн хэсгийн хэрэгжилтийг тайлбарласан болно. Энэ бүтэц нь TCustomHTTPServer-ээс өвлөн авсан анги бөгөөд үндсэн хүсэлтийг холбохыг дэмждэг.

Энэ ангид палитраас хандах боломжгүй тул та өөрийн кодыг ажиллуулахдаа үүнийг ердийн объект гэж тодорхойлох шаардлагатай болно.

Энэ объектыг SOAP-тай ажиллах боломжийг олгодог нэмэлт шинж чанаруудаас бусад тохиолдолд ердийн THTTPServer-тэй яг адилхан ашиглаж болно.
Гэсэн хэдий ч эхлээд шаардлагатай кодыг бэлтгэхийг харцгаая.

WebBroker болон Indy

Өмнө нь вэб үйлчилгээг бий болгож байсан хүмүүсийн хувьд та үүнийг ашигладаг гэдгийг мэддэг WebBroker. Delphi 7 нь Delphi 6-тай адил SOAP-г дэмжихийн тулд WebBroker архитектурыг ашигладаг.

Тиймээс та модуль үүсгэх хэрэгтэй TWebModuleДараах гурван бүрэлдэхүүн хэсгийг дотор нь байрлуул: THTTPSoapDispatcher, THTTPSoapPascalInvoker болон TWSDLHTMLPublish. Тэдгээрийг бүгдийг нь бүрэлдэхүүн хэсгийн палитрын WebServices табаас авах боломжтой. SOAPDispatcher-г SOAPPascalInvoker-тэй холбосны дараа өргөдлийн маягт бэлэн болно. Эцсийн үр дүн нь дараах зурагт үзүүлсэн шиг байх ёстой.

(модуль uWebModule.pas)

Энэ маягтын захиалгат кодыг өөрчлөх, ажиллуулах шаардлагагүй тул бүгдийг байгаагаар нь үлдээх нь дээр.

WebModule болон Indy

HTTP серверийг хэрэгжүүлэхэд шаардлагатай кодын нөгөө хэсэг рүү шилжье.

Таны харж байгаагаар TIdHTTPWebBrokerBridge нь RegisterWebModuleClass аргатай бөгөөд энэ нь танд өөрийн WebModule-г бүртгүүлж, серверт ашиглах боломжтой болгох боломжийг олгодог.

Тиймээс fServer серверийн объектыг үүсгэсний дараа та fServer.RegisterWebModuleClass (TwmSOAPIndy) анги руу залгахад л хангалттай.

Анхаарна уу. TIdHTTPWebBrokerBridge-ийн ердийн хэрэгжилтийн хувьд хүсэлт хүлээн авах бүрт TwmSOAPIndy объект үүсгэгдэнэ. Энэ шаардлагагүй нь ойлгомжтой. Тиймээс байнгын бүтээлийг хангахын тулд ангиудыг өөрчилж болно энэ объектынсервер объект байгаа цагт. Дэлгэрэнгүй мэдээллийг ангийн хэрэгжилтийн баримт бичигт хандахыг зөвлөж байна.

Сервер бэлэн үү?

Индигийн танилцуулга

Индигийн танилцуулга
Чад З.Хоуэр нийтэлсэн
Нүүр хуудас: http://www.atozedsoftware.com
Орчуулга: Анатолий Подгорецкий
оршил
Би энэ нийтлэлийг хэзээ бичсэн одоогийн хувилбар Indy 8.0 байсан. Энэ нийтлэлийн ихэнх хэсэг нь Indy-ийн ирээдүйн хувилбаруудад хэрэг болохуйц бөгөөд маш хэрэгтэй. Хэрэв танд энэ нийтлэл таалагдсан бөгөөд илүү дэлгэрэнгүй нийтлэлүүдийг уншихыг хүсвэл Indy in Depth номыг үзээрэй.
Indy блоклох горимд ажиллаж байна
Indy нь блоклох залгууруудыг ашигладаг. Блоклох горим нь файл унших-бичихтэй төстэй. Өгөгдлийг унших эсвэл бичих үед үйл ажиллагаа дуусах хүртэл функц нь хяналтыг буцаадаггүй. Файлтай ажиллахаас ялгаатай нь дуудлага нь удаан үргэлжлэх болно, учир нь хүссэн өгөгдөл хараахан байхгүй байгаа тул энэ нь таны сүлжээ эсвэл модемийн ажиллах хурдаас хамаарна.
Жишээлбэл, аргыг зүгээр л дуудаж, хяналтыг дуудлагын цэг рүү буцаах хүртэл хүлээнэ. Хэрэв дуудлага амжилттай болсон бол хяналтыг аргаас буцаана, хэрэв алдаа гарвал үл хамаарах зүйл гарна.
Түгжигдэх нь үхэлд хүргэдэггүй
Блоклох горимын улмаас бид өрсөлдөгчиддөө олон удаа зодуулж байсан ч хаах горим нь чөтгөр биш юм.
Winsock-г Windows руу шилжүүлсний дараа асуудал гарч ирэв. Юникс дээр асуудлыг ихэвчлэн салаагаар шийддэг байсан (олон урсгалтай адил боловч урсгалын оронд тусдаа процессуудтай). Unix үйлчлүүлэгч болон дэмонууд ажиллах ёстой процессуудыг салгаж, блоклох горимыг ашиглах шаардлагатай болсон. Windows 3.x-ийг параллель болгох боломжгүй байсан бөгөөд тийм ч их урсгалыг дэмждэггүй байв. Блоклох интерфэйсийг ашиглах нь хэрэглэгчийн интерфэйсийг царцааж, програмыг хариу үйлдэл үзүүлэхгүй болгосон. Тиймээс WinSock-д блоклохгүй горимуудыг нэмсэн бөгөөд энэ нь хязгаарлалттай Windows 3.x-д Winsock-г програмын үндсэн ба цорын ганц урсгалыг блоклохгүйгээр ашиглах боломжийг олгосон. Энэ нь өөр өөр програмчлал шаарддаг байсан бөгөөд Microsoft болон бусад хүмүүс Windows 3.x-ийн дутагдлыг нуун дарагдуулахын тулд хаах горимуудыг доромжилж байв.
Дараа нь олон урсгалыг дэмжих боломжтой Win32 гарч ирэв. Гэвч энэ үед тэдний тархи аль хэдийн будлиантай байсан (өөрөөр хэлбэл хөгжүүлэгчид залгууруудыг хаахыг чөтгөрийн бүтээл гэж үзсэн) бөгөөд тэдний хийсэн зүйлийг өөрчлөхөд аль хэдийн хэцүү байсан. Тиймээс гацаах дэглэмийг гутаан доромжлох явдал үргэлжилсээр байна.
Бодит байдал дээр Unix нь зөвхөн блоклох залгууруудтай. Блоклох залгуурууд нь бас давуу талтай бөгөөд олон урсгалтай, аюулгүй байдал болон бусад зүйлсийн хувьд илүү сайн байдаг. Зарим өргөтгөлүүдийг Unix-д блоклохгүй залгуурт зориулж нэмсэн. Гэсэн хэдий ч тэдгээр нь Windows-ээс тэс өөр байдлаар ажилладаг. Тэд бас стандарт бус, тийм ч түгээмэл биш юм. Unix дэх блоклох залгууруудыг бараг бүх тохиолдолд ашигладаг бөгөөд цаашид ч ашиглах болно.
Блоклох горимын давуу тал·Програмчлахад хялбар - Блоклох горимыг програмчлахад хялбар. Бүх хэрэглэгчийн кодыг нэг дор байрлуулж, байгалийн, дараалсан дарааллаар гүйцэтгэх боломжтой. ·Unix руу холбоход илүү хялбар - Unix нь блоклох залгууруудыг ашигладаг тул энэ тохиолдолд зөөврийн код бичихэд хялбар байдаг. Инди энэ баримтыг нэг төрлийн код бичихдээ ашигладаг. ·Утастай ажиллах нь илүү тохиромжтой - Блоклох залгуурууд нь удамшлын дараалалтай байдаг тул утаснуудад хэрэглэхэд маш хялбар байдаг.
Блоклох горимын сул тал · Үйлчлүүлэгчид хэрэглэгчийн интерфэйс хөлддөг - Блоклох залгуур нь даалгавраа дуусгах хүртэл хяналтыг буцааж өгдөггүй. Аппликешны үндсэн утас дээр ийм дуудлага хийх үед програм нь хэрэглэгчийн мессежийг боловсруулж чадахгүй. Энэ нь хэрэглэгчийн интерфэйсийг хөлдөөх, цонхыг сэргээхгүй байх, блоклох залгуураас удирдлага буцаж ирэх хүртэл бусад мессежийг боловсруулахгүй байх шалтгаан болдог.
TIdAntiFreeze бүрэлдэхүүн хэсэг
Indy нь хэрэглэгчийн интерфэйсийг хөлдөөх асуудлыг шийддэг тусгай бүрэлдэхүүн хэсэгтэй. Зүгээр л нэг TIdAntiFreeze бүрэлдэхүүнийг програмынхаа аль ч хэсэгт нэмснээр та UI-г царцаахгүйгээр хаах дуудлага хийх боломжтой.
TIdAntiFreeze нь дуудлагын стекийн гаднах дотоод таймер дээр ажилладаг бөгөөд хугацаа дуусахад Application.ProcessMessages-г дууддаг. Indy руу хийх гадаад дуудлагууд хаагдсан хэвээр байгаа тул TIdAntiFreeze бүрэлдэхүүн хэсгийг ашиглахгүйгээр яг адилхан ажилладаг. TIdAntiFreeze-ийг ашиглах нь ямар ч сул талгүйгээр залгууруудыг хаах бүх давуу талыг олж авах боломжийг олгодог.
Кодын хэлхээс (Threading)
Блоклох залгууртай бол кодын урсгалыг бараг үргэлж ашигладаг. Блоклохгүй залгуурууд нь утас ашиглаж болно, гэхдээ энэ нь заримыг шаарддаг нэмэлт боловсруулалтмөн энэ тохиолдолд тэдгээрийн давуу тал нь залгуурыг хаахтай харьцуулахад алдагдсан.
Threads-ийн давуу тал·Тэргүүлэх чиглэлүүдийг тохируулах - Тусдаа урсгалуудын тэргүүлэх чиглэлийг тохируулах боломжтой. Энэ нь бие даасан ажлуудад CPU-ийн цагийг их эсвэл бага хуваарилах боломжийг олгодог. ·Encapsulation - Холболт бүр нь өөр холболттой интерфэйстэй төстэй зүйлийг агуулж болно. ·Security - Thread бүр өөр өөр хамгаалалтын шинж чанартай байж болно. ·Олон процессор - олон процессортой системд давуу талтай. ·Цуваа болгох шаардлагагүй - бүрэн параллель байдлыг хангана. Их урсгалгүйгээр бүх хүсэлтийг нэг хэлхээнд боловсруулах ёстой. Тиймээс ажил бүрийг хурдан гүйцэтгэхийн тулд жижиг хэсгүүдэд хуваах ёстой. Нэг блок ажиллаж байхад бусад нь дуусахыг хүлээхээс өөр аргагүй болдог. Нэг блокийн төгсгөлд дараагийнх нь гүйцэтгэгдэнэ гэх мэт. Multithreading-ийн тусламжтайгаар даалгавар бүрийг нэг нэгж болгон програмчилж болно үйлдлийн систембүх ажлын хооронд цаг хуваарилдаг.
Санал асуулгын сэдвүүд
Threads үүсгэх, устгах нь маш их нөөц шаарддаг. Энэ нь богино хугацааны холболттой серверүүдэд онцгой хэцүү ажил юм. Сервер бүр thread үүсгэж, түүнийгээ богино хугацаанд ашиглаад дараа нь устгадаг. Үүний үр дүнд хэлхээнүүд байнга үүсгэгдэж, устгагдана. Үүний нэг жишээ бол вэб сервер юм. Ганц хүсэлтийг илгээж, энгийн хариултыг буцаана. Хөтөч ашиглах үед ямар ч вэб сайтыг үзэх үед олон зуун холболтууд болон салалтууд гарч ирдэг.
Санал асуулгын хэлхээс энэ байдлыг засч залруулж чадна. Хүсэлтийн дагуу утас үүсгэж устгахын оронд ашиглагдаагүй боловч усан сангаас аль хэдийн үүсгэсэн хэлхээнүүдийн жагсаалтаас утаснууд сонгогддог. Утас хэрэггүй болсон үед түүнийг устгахын оронд усан сан руу буцаана. Цөөрөмд байгаа утаснууд нь ашиглагдаагүй гэж тэмдэглэгдсэн тул CPU-ийн цагийг зарцуулдаггүй. Илүү сайжруулахын тулд утаснууд нь системийн одоогийн хэрэгцээнд динамикаар дасан зохицож чаддаг.
Indy утас санал хураалтыг дэмждэг. Indy дахь thread-ийн санд TIdThreadMgrPool бүрэлдэхүүнээр дамжуулан хандах боломжтой.
Маш олон утаснууд
Ачаалал ихтэй серверт хэдэн зуун, бүр хэдэн мянган хэлхээ шаардлагатай байж болно. Олон зуун, мянга мянган утаснууд таны системийг устгаж чадна гэсэн нийтлэг итгэл үнэмшил байдаг. Энэ бол худал итгэл үнэмшил юм.
Ихэнх серверүүдэд урсгалууд өгөгдөл хүлээж байдаг. Блоклох дуудлага хүлээж байх үед утас идэвхгүй байна. 500 урсгалтай серверт зөвхөн 50 нь нэгэн зэрэг идэвхтэй байж болно.
Таны систем дээр ажиллаж байгаа хэлхээний тоо таныг гайхшруулж магадгүй юм. Хамгийн бага тооны ажиллаж байгаа серверүүд болон заасан ажиллаж байгаа програмуудМиний систем 333 хэлхээ үүсгэсэн, 333 урсгалтай байсан ч CPU ердөө 1% ачаалалтай байдаг. Ачаалал ихтэй IIS сервер(Microsoft Интернэт Мэдээллийн Сервер) нь хэдэн зуун, мянга мянган хэлхээ үүсгэж чаддаг.
Threads болон глобал хэсгүүд
Олон урсгалтай бол та мэдээлэлд хандахдаа мэдээллийн бүрэн бүтэн байдлыг хангах ёстой. Энэ нь thread-тэй ажиллаж байгаагүй програмистуудад хэцүү байж магадгүй юм. Гэхдээ ерөнхийдөө ихэнх серверүүд глобал өгөгдлийг ашиглах шаардлагагүй байдаг. Ихэнх серверүүд тусгаарлагдсан функцүүдийг гүйцэтгэдэг. Урсгал бүр өөрийн гэсэн тусгаарлагдсан даалгаврыг гүйцэтгэдэг. Глобал унших/бичих хэсгүүд нь олон урсгалтай програмуудын онцлог боловч серверүүдэд ердийн зүйл биш юм.
Арга зүй Инди
Indy нь таны дассан бусад Winsock бүрэлдэхүүн хэсгүүдээс ялгаатай. Хэрэв та бусад бүрэлдэхүүн хэсгүүдтэй ажиллаж байсан бол хамгийн сайн шийдэлТэд хэрхэн ажилладагийг мартах болно. Бусад олон бүрэлдэхүүн хэсгүүд нь блоклохгүй (асинхрон) дуудлагуудыг ашигладаг бөгөөд асинхроноор ажилладаг. Тэд үйл явдалд хариу үйлдэл үзүүлэх, төрийн машин үүсгэх, байнга хүлээх гогцоонуудыг гүйцэтгэх хэрэгтэй.
Жишээлбэл, бусад бүрэлдэхүүн хэсгүүдийн хувьд та холболтыг дуудахдаа холболтын үйл явдал гарахыг хүлээх эсвэл холболт үүссэнийг харуулах шинж чанарыг хүлээх хэрэгтэй. Indy-ийн тусламжтайгаар та Connect аргыг дуудаж, буцаж ирэхийг хүлээх боломжтой. Холболт амжилттай болсон эсвэл асуудал гарвал онцгой тохиолдол гарвал буцаан олголт олгоно. Тиймээс Indy-тэй ажиллах нь файлтай ажиллахтай маш төстэй юм. Indy нь бүх кодоо өөр өөр үйл явдлуудад түгээхийн оронд нэг дор байрлуулах боломжийг олгодог. Үүнээс гадна Indy нь утастай ажиллахад маш энгийн бөгөөд хамгийн тохиромжтой байдаг.
Инди юугаараа ялгаатай вэ?
Товч тойм · Блоклох дуудлагыг ашигладаг · Үйл явдалд чиглээгүй - үйл явдал байдаг, гэхдээ тэдгээр нь мэдээллийн хэрэгцээнд ашиглагддаг бөгөөд үнэхээр шаардлагагүй. ·Treads-д зориулагдсан - Indy нь thread-д зориулагдсан боловч утасгүй ашиглах боломжтой. Дараалсан програмчлал
Нарийвчилсан тойм
Indy зөвхөн хаах дуудлагуудыг (синхрон) ашигладаг төдийгүй үүнтэй адил ажилладаг. Ердийн Indy сесс дараах байдалтай байна.
IndyClient-ээс эхэлнэ үү
Холбох; Оролдоод үз
//Энд юмаа хий
эцэст нь салгах; Төгсгөл;
Төгсгөл;
Бусад бүрэлдэхүүн хэсгүүдийн хувьд энэ нь дараах байдалтай байна.
процедур TFormMain.TestOnClick(Илгээгч: TComponent);
Эхлэх
SocketComponent-ийн тусламжтайгаар эхлэх хэрэгтэй
Холбох; хичээ
Холбогдоогүй байхад эхлэх хэрэгтэй
Хэрэв IsError бол эхэлнэ
Цуцлах;
Төгсгөл;

OutData:= "Илгээх өгөгдөл";
урт(OutData) > 0 бол эхэлнэ
Application.ProcessMessages;
Төгсгөл;
эцэст нь салгах; Төгсгөл;
Төгсгөл;
Төгсгөл;
процедур TFormMain.OnConnectError;
Эхлэх
IsError:= Үнэн;
Төгсгөл;
журам TFormMain.OnRead;
var
i: бүхэл тоо;
Эхлэх
i:= SocketComponent.Send(OutData);
OutData:= Хуулах(OutData, i + 1, MaxInt);
Төгсгөл;
Олон бүрэлдэхүүн хэсэг нь программистыг стекээс тусгаарлахад тийм ч сайн ажил хийдэггүй. Олон бүрэлдэхүүн хэсэг нь хэрэглэгчийг стекийн нарийн төвөгтэй байдлаас тусгаарлахын оронд хэрэглэгчийг түүнд үлдээх эсвэл стек дээр боодол өгөхөд хангалттай.
Тусгай арга
Indy нь анхнаасаа олон урсгалтай байхаар бүтээгдсэн. Indy-д сервер болон үйлчлүүлэгчдийг бий болгох нь Unix-д сервер, үйлчлүүлэгч байгуулахтай адил юм. Unix програмууд нь ихэвчлэн хийсвэр давхарга бага эсвэл огт байхгүй стекийг шууд дууддаг.
Ер нь Unix серверүүд нь ирж буй үйлчлүүлэгчийн хүсэлтийг хянадаг нэг буюу хэд хэдэн сонсох процессуудтай байдаг. Үйлчлүүлэх шаардлагатай үйлчлүүлэгч бүрийн хувьд, a шинэ үйл явц. Энэ нь програмчлалыг хялбар болгож, процесс бүрийг зөвхөн нэг үйлчлүүлэгчид зориулдаг. Процесс бүр нь байгаа эрх, таних тэмдэг эсвэл бусад зүйл дээр тулгуурлан сонсох процесс эсвэл процессоор тохируулагдсан өөрийн аюулгүй байдлын хүрээнд ажилладаг.
Indy серверүүд ижил зарчмаар ажилладаг. Windows нь Unix-ээс ялгаатай нь процессуудыг сайн үржүүлж чадахгүй ч thread-тэй сайн ажилладаг. Indy серверүүд нь үйлчлүүлэгчийн холболт бүрт тусдаа хэлхээ үүсгэдэг.
Indy серверүүд нь програмын үндсэн кодын урсгалаас тусдаа сонсох урсгалыг хуваарилдаг. Сонсох хэлхээ нь үйлчлүүлэгчдээс ирж буй хүсэлтийг сонсдог. Хариу өгсөн үйлчлүүлэгч бүрийн хувьд үйлчлүүлэгчид үйлчлэх шинэ хэлхээ үүсгэнэ. Холбогдох үйл явдлуудыг дараа нь контекстийн дагуу үйлчилнэ энэ урсгалын.
Indy хэрэглэгчийн тойм
Indy нь маш өндөр түвшний хийсвэрлэлийг хангах зорилготой юм. TCP/IP стекийн нарийн төвөгтэй байдал, нарийн ширийнийг програмистаас нуусан байдаг.Ерөнхийдөө Indy дахь ердийн клиент сесс нь дараах байдлаар харагддаг.
IndyClient-ээс эхэлнэ үү
Хост:= "zip.pbe.com"; // Дуудлага хийх хост
Порт: = 6000; // Серверийг залгах порт
Холбох; Оролдоод үз
//Энд юмаа хий
эцэст нь салгах; Төгсгөл;
Төгсгөл;
Indy серверийн тойм
Indy серверийн бүрэлдэхүүн хэсгүүд нь үндсэн програмын кодын урсгалаас тусгаарлагдсан сонсох урсгалыг үүсгэдэг. Сонсох хэлхээ нь үйлчлүүлэгчдээс ирж буй хүсэлтийг сонсдог. Хариу өгсөн үйлчлүүлэгч бүрийн хувьд үйлчлүүлэгчид үйлчлэх шинэ хэлхээ үүсгэнэ. Дараа нь харгалзах үйл явдлуудыг тухайн хэлхээний контекстэд үйлчилнэ.

Практик жишээнүүд
Дараах жишээнүүд нь бүрэлдэхүүн хэсгүүдийг эхлүүлэхэд тусална хэрэглэхэд хялбар, гэхдээ хийсэн жишээнүүдийг харуулахын тулд энгийн програмууд. Зарим төслийг янз бүрийн нөхцөл байдлыг харуулах зорилгоор хийдэг. Эдгээр жишээг мөн zip файл хэлбэрээр татаж авах боломжтой.
Орчуулагчийн тэмдэглэл: сайт дээрх холбоос ажиллахгүй байна.
Жишээ 1 - Шуудангийн кодын баталгаажуулалт
Эхний төслийг аль болох хялбар болгосон. Зип кодоор хайхад үйлчлүүлэгч серверээс заасан зип код аль хот, мужид харьяалагддагийг асууна.
АНУ-аас гадуур амьдардаг, зип код гэж юу болохыг мэдэхгүй хүмүүсийн хувьд энэ нь хүргэлтийн байршлыг зааж өгдөг шуудангийн код юм. Шуудангийн код нь 5 оронтой тооноос бүрдэнэ.
Протокол
Сервер болон үйлчлүүлэгч байгуулах эхний алхам бол протокол боловсруулах явдал юм. Стандарт протоколуудын хувьд энэ нь холбогдох RFC-ээр тодорхойлогддог. Шуудангийн кодын хувьд протоколыг доор тайлбарлав.
Ихэнх харилцаа холбооны протоколууд ажилладаг текст горим. Солилцоо гэдэг нь тушаалыг дамжуулж, хариуд нь статус, магадгүй өгөгдөл гэсэн үг юм. Протоколууд нь зөвхөн солилцоогоор хязгаарлагдахгүй, гэхдээ энгийн текстийг ашигладаг хэвээр байна. Шуудангийн кодыг тодорхойлох протокол нь мөн текст дээр суурилдаг. Энгийн текст нь протоколуудыг дибаг хийхэд хялбар болгож, өөр өөр програмчлалын хэл, үйлдлийн системүүдтэй харилцах боломжийг олгодог.
Холбосны дараа сервер нь мэндчилгээ илгээж, дараа нь тушаалыг хүлээн авна. Энэ тушаал нь "ZipCode x" (Х нь зип код) эсвэл "Out" байж болно. ZipCode командын хариуд хариултыг эсвэл гэсэн хариулттай нэг мөр хэлбэрээр илгээдэг хоосон мөркод олдохгүй бол. Quit команд нь серверийг холболтыг хаахад хүргэдэг. Гарах командыг илгээхээс өмнө сервер хэд хэдэн тушаалыг хүлээн авч болно.
Серверийн эх код

ServerMain нэгж;

интерфейс

ашигладаг

төрөл

TformMain = анги (TForm)

IdTCPServer1: TIdTCPServer;

журам FormCreate(Илгээгч: TObject );

процедур FormDestroy(Илгээгч: TObject );

процедур IdTCPServer1Connect(AThread: TIdPeerThread) ;

хувийн

ZipCodeList: TStrings;

олон нийтийн

Төгсгөл ;

FormMain: TformMain;

хэрэгжилт

(R*.DFM)

процедур TformMain.IdTCPServer1Connect (AThread: TIdPeerThread) ;

Эхлэх

AThread.Connection .WriteLn ( "Indy Zip Code сервер бэлэн." );

Төгсгөл ;

SCommand: string ;

Эхлэх

SCommand:= ReadLn ;

Төгсгөл ;

Төгсгөл ;

Төгсгөл ;

процедур TformMain.FormCreate (Илгээгч: TObject );

Эхлэх

ZipCodeList:= TStringList.Create ;

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

Төгсгөл ;

журам TformMain.FormDestroy (Илгээгч: TObject );

Эхлэх

ZipCodeList.Free;

Төгсгөл ;

Төгсгөл.

Төслийн цорын ганц Indy-д хамаарах хэсгүүд нь IdTCPServer1 бүрэлдэхүүн хэсэг, IdTCPServer1Connect болон IdTCPServer1Execute аргууд юм.
Маягт нь TIdTCPServer төрлийн IdTCPServer1 бүрэлдэхүүн хэсгийг агуулна. Дараах шинж чанаруудыг өөрчилсөн: ·Идэвхтэй = Үнэн - Програмыг ажиллуулсны дараа сервер сонсдог. ·DefaultPort = 6000 - Энэ төслийн портын утга. Сервер нь энэ порт дээрх үйлчлүүлэгчийн хүсэлтийг сонсдог.
IdTCPServer1Execute арга нь серверийн OnExecute үйл явдалтай холбоотой. Үйлчлүүлэгчийн холболтыг хүлээн авсны дараа OnExecute үйл явдал үүснэ. OnExecute үйл явдал нь таны мэдэх бусад үйл явдлуудаас ялгаатай. OnExecute нь хэлхээний контекст дээр ажилладаг. Thread-н үйл явдлыг босгож, арга руу дамжуулсан AThread аргументыг өгнө. Олон OnExecute үйл явдлыг нэгэн зэрэг гүйцэтгэх боломжтой тул энэ нь чухал юм. Энэ нь сервер шинэ бүрэлдэхүүн хэсэг үүсгэхгүйгээр ажиллах боломжтой байхаар хийгдсэн. Өв залгамжлагчийг барихдаа үгүйсгэж болох аргууд бас байдаг.
Холболтыг хүлээн зөвшөөрч, түүнд зориулж хэлхээ үүсгэсний дараа OnConnect үйл явдал идэвхждэг. Энэ серверт үүнийг үйлчлүүлэгч рүү мэндчилгээ илгээхэд ашигладаг. Хэрэв хүсвэл OnExecute үйл явдал дээр үүнийг хийж болно.
OnExecute үйл явдлыг холболтыг салгах эсвэл таслах хүртэл олон удаа ажиллуулж болно. Энэ нь үйл явдлын доторх гогцоонд холболтыг таслах, алдах эсэхийг шалгах шаардлагагүй болно.
IdTCPServer1Execute нь ReadLn болон WriteLn гэсэн хоёр үндсэн функцийг ашигладаг. ReadLn нь холболтоос мөрийг уншиж, WriteLn нь холболт руу мөр илгээдэг.
sCommand:= ReadLn;
Дээрх код нь үйлчлүүлэгчээс стринг авч, локал sCommand string хувьсагчд байрлуулна.

Хэрэв SameText (sCommand, "QUIT" ) бол эхэлнэ

Хэрэв SameText (Хуулбар (sCommand, 1, 8 ) , "ZipCode" ) бол өөр төгсгөл

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

Төгсгөл ;


Дараа нь sCommand хүчинтэй тушаалуудыг шалгана.
Хэрэв команд нь "Out" бол холболтыг салгах болно. Салгасны дараа унших, бичихийг хориглоно. Үйл явдал дууссаны дараа сонсох утас түүнийг дуудахаа больсон, харин хэлхээг цэвэрлэж, холболтыг зогсооно.
Хэрэв тушаал нь "Зипкод" бол командын дараах параметрийг задалж, хүснэгтийг хот, муж байгаа эсэхийг сканнердах болно. Дараа нь хот болон мужийг үйлчлүүлэгч рүү дамжуулах эсвэл тохирохгүй бол хоосон мөрийг дамжуулна.
Дараа нь арга нь гарна. Сервер шинэ тушаал ирэнгүүт үйл явдлыг дахин сэргээж, үйлчлүүлэгчид олон команд илгээх боломжийг олгоно.
Үйлчлүүлэгчийн эх код

ClientMain нэгж;

интерфейс

ашигладаг

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls, IdAntiFreezeBase,

IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

төрөл

TformMain = анги (TForm)

Үйлчлүүлэгч: TIdTCPClient;

IdAntiFreeze1: TIdAntiFreeze;

Panel1: TPanel;

Panel2: TPanel;

MemoInput: TMemo;

LboxResults: TListBox;

Panel3: TPanel;

Товчлуур1: TBтовч;

Товч2: TBтовч;

Шошго1: TLabel;

журам Button2Click(Илгээгч: TObject );

журам Button1Click(Илгээгч: TObject );

хувийн

олон нийтийн

Төгсгөл ;

FormMain: TformMain;

хэрэгжилт

(R*.DFM)

процедур TformMain.Button2Click (Илгээгч: TObject );

Эхлэх

MemoInput.Clear ;

LboxResults.Clear ;

Төгсгөл ;

журам TformMain.Button1Click (Илгээгч: TObject );

I: бүхэл тоо;

S: мөр;

Эхлэх

ButnLookup.Enabled := үнэн ; хичээ

LboxResults.Clear ;

Үйлчлүүлэгчээс эхлэх хэрэгтэй

Холбох; хичээ

LboxResults.Items.Add(ReadLn);

for i:= 0 to memoInput.Lines .Count - 1 эхлэх

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

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

S:= ReadLn ;

хэрэв s = "" бол эхэлнэ үү

S:= "-- Энэ зип кодын оруулга олдсонгүй.";

Төгсгөл ;

LboxResults.Items.Add(s);

LboxResults.Items.Add("");

Төгсгөл ;

WriteLn("Гарах");

эцэст нь салгах; Төгсгөл ;

Төгсгөл ;

эцэст нь butnLookup.Enabled := үнэн ; Төгсгөл ;

Төгсгөл ;

Төгсгөл.


Үйлчлүүлэгчийн бүрэлдэхүүнд хамаарах цорын ганц хэсэг нь Button1Click арга юм.
Client бүрэлдэхүүн хэсэг нь TIdTCPClient төрлийн бөгөөд маягт дээр байрлуулсан. Дараах шинж чанарууд өөрчлөгдсөн: ·Host = 127.0.0.1 - Сервер нь клиенттэй нэг машин дээр байрладаг. ·Port = 6000 - Серверийн порт
Button1Click арга нь Button1 бүрэлдэхүүн хэсгийн OnClick үйл явдалтай холбоотой. Товчлуур дээр дарахад энэ аргыг дуудна. Энэ аргын Indy хэсгийг дараах байдлаар багасгаж болно: 1.Серверт холбогдох (Холбох;) 1.Серверээс мэндчилгээг уншина уу. 1. Хэрэглэгчийн TMemo-д оруулсан мөр бүрийн хувьд: 1. Сервер рүү хүсэлт илгээх (WriteLn("ZipCode " + memoInput.Lines[i]);) 1. Серверээс хариу унших (s:= ReadLn; ) 1. Гарах командыг илгээх (WriteLn("Quit");) 1.Таслах (Таслах;)
Туршилт хийх
Энэ жишээг туршиж үзсэн бөгөөд суулгасан TCP/IP дээр ажилладаг. Та үүнийг нэг компьютерээс нөгөө компьютерт сүлжээгээр ажиллахын тулд өөрчилж болно. Серверийг өөр компьютер дээр эхлүүлж, клиент дээрх серверийн нэр эсвэл IP-г өөрчлөх замаар.
Төсөлүүдийг туршихын тулд серверийг хөрвүүлж ажиллуулна уу. Дараа нь үйлчлүүлэгчийг эмхэтгэж ажиллуул. Санамжийн талбарт шуудангийн кодоо оруулаад хайх товчийг дарна уу.
Дибаг хийх
Текстийн протоколуудыг Telnet ашиглан шалгах боломжтой тул дибаг хийхэд маш хялбар байдаг. Үүнийг хийхийн тулд серверийн портыг мэдэхэд хангалттай. Zip Code хайлтын сервер 6000 портыг сонсдог.
Zip Code хайлтын серверийг дахин эхлүүлнэ үү. Дараа нь консолыг нээнэ үү (жишээлбэл, Dos цонх). Одоо оруулна уу:
telnet 127.0.0.1 6000
Та одоо серверт холбогдсон байна. Зарим серверүүд мөн мэндчилгээ илгээдэг. Зарим нь тэгдэггүй. Та оруулсан мөрүүдийг харахгүй. Ихэнх серверүүд урсгалыг хэмнэхийн тулд цуурайтдаггүй. Гэхдээ та "Echo On" сонголтыг тохируулснаар telnet тохиргоог өөрчилж болно. Үүнийг өөр өөр telnet үйлчлүүлэгчид өөр өөрөөр хийдэг бөгөөд заримд нь энэ функц огт байдаггүй. Одоо оруулна уу:
зип код 37642
Та серверийн хариуг харах болно:
CHURCH HILL, TN
Серверээс салгахын тулд дараахыг оруулна уу:
болих
Жишээ 2 - мэдээллийн санд хандах
Энэ жишээ нь сокет дуудлагаас бусад хаах даалгавруудыг гүйцэтгэх ёстой серверийг дуурайдаг. Олон серверүүд ийм нөхцөлд ажиллахаас өөр аргагүй болдог. Өгөгдлийн санд хандах шаардлагатай серверүүд, гадаад процедур эсвэл тооцооллыг дууддаг серверүүд эдгээр дуудлагыг тасалдуулж чаддаггүй, учир нь эдгээр нь гадаад дуудлага юмуу энэ нь нарийн төвөгтэй байдаг. Өгөгдлийн санд хандах хандалтыг жижиг хэсгүүдэд хуваах боломжгүй бөгөөд хөгжүүлэгчид мэдээллийн сантай ажиллах ажиллагааг дуусгахыг хүлээх ёстой. Энэ нь зөвхөн мэдээллийн сангийн дуудлагын онцлог төдийгүй шахалт, тооцоолол болон ижил төрлийн бусад боловсруулалт зэрэг бусад үйлдлүүдийн онцлог юм.
Үзүүлэн үзүүлэхийн тулд сервер нь өгөгдлийн сангийн дуудлага хийхэд 5 секунд зарцуулдаг гэж төсөөлье. Үүнийг хялбарчлахын тулд түр зогсолтоор хийцгээе. Үүний тулд утсаар ярихын оронд Sleep(5000) функцийг ашигла.
Энэ жишээ нь өмнөх жишээнээсээ бага дэлгэрэнгүй мэдээлэл шаарддаг, учир нь олон ойлголт хараахан ойлгогдоогүй байна.
Эх сурвалж

үндсэн нэгж;

интерфейс

ашигладаг

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

IdBaseComponent, IdComponent, IdTCPServer;

төрөл

TformMain = анги (TForm)

IdTCPServer1: TIdTCPServer;

процедур IdTCPServer1Execute(AThread: TIdPeerThread) ;

хувийн

олон нийтийн

Төгсгөл ;

FormMain: TformMain;

хэрэгжилт

(R*.DFM)

процедур TformMain.IdTCPServer1Execute (AThread: TIdPeerThread) ;

I: бүхэл тоо;

Эхлэх

AThread-тай. Холболт эхэлнэ

WriteLn("Сайн уу. DB сервер бэлэн байна.");

I:= StrToIntDef(ReadLn, 0);

// Унтах нь урт DB эсвэл өөр дуудлагаар солигдоно

Унтах (5000);

WriteLn(IntToStr(i * 7));

Төгсгөл ;

Төгсгөл ;

Төгсгөл.

Execute үйл явдал нь thread-ийн контекстэд тохиолддог тул боловсруулах код нь ямар ч урттай байж болно. Үйлчлүүлэгч бүр өөрийн гэсэн хэлхээтэй бөгөөд бусад үйлчлүүлэгчдийг блоклодоггүй.
Туршилт хийх
DB серверийг туршихын тулд хөрвүүлж ажиллуулна уу. Түүнд Telnet ашиглан 6001 порт руу холбогдоно уу. Сервер нь мэндчилгээний мессежээр хариулах болно. Дугаар оруулна уу. Сервер таны хүсэлтийг "боловсруулж" 5 секундын дотор хариу өгөх болно.

UDP протокол нь текст мессеж дамжуулахад маш сайн, өөрөөр хэлбэл та орон нутгийн чат гэх мэт зүйлсийг зохион байгуулж болно. Би Delphi дахь UDP-тэй хийсэн хамгийн энгийн ажлын жишээг өгөхөөр шийдсэн.

Алхам алхмаар зааварчилгаа:

Би жишээ хэлсэн, гэхдээ намайг уучлаарай, би мөр бүрийг бичээгүй, учир нь ... Би ямар ч төвөгтэй зүйл олж харахгүй байна, хэн ч үүнийг ойлгож чадна.

Үнэндээ ямар нэг зүйл тодорхойгүй байвал надаас асуулт асууж болно. Мөн энд бодит код байна:

ашигладаг
Windows, Мессеж, SysUtils, Хувилбарууд, Ангиуд, Графикууд, Хяналтууд, Маягтууд,
Харилцах цонх, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

төрөл
TForm1 = анги (TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Товчлуур1: TBтовч;
Шошго1: TLabel;
журам FormCreate(Илгээгч: TObject);
процедур FormClose(Илгээгч: TObject; var Action: TCloseAction);
журам Button1Click(Илгээгч: TObject);
процедур IdUDPServer1UDPRead(AThread: TIdUDPLlistenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
хувийн
(Хувийн мэдүүлэг)
олон нийтийн
(Нийтийн мэдүүлэг)
Төгсгөл;

var
Маягт1: TForm1;

($R *.dfm)
[b]//Мессеж илгээх журам
процедур TForm1.Button1Click(Илгээгч: TObject);
Эхлэх
хичээ
IdUDPClient1.Active:= Үнэн;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect;
хэрэв IdUDPClient1.Connected дараа нь
Эхлэх
IdUDPClient1.Send(TimeToStr(Time));
Label1. Caption:= "ok";
Төгсгөл;
IdUDPClient1.Active:= Худал;
Дохио, дохио, дуугарах;
бусад
MessageDlg("Алдаа гарлаа =(", mtError, , 0);
Төгсгөл;
Төгсгөл;
[b]
//Асаах, унтраах. Маягтыг эхлүүлэх, хаах үед UDP сервер
процедур TForm1.FormClose(Илгээгч: TObject; var Action: TCloseAction);
Эхлэх
IdUDPServer1.Active:= Худал;
Төгсгөл;

процедур TForm1.FormCreate(Sender: TObject);
Эхлэх
IdUDPServer1.Active:= Үнэн;
Төгсгөл;

[b]//Өгөгдөл хүлээн авах үед серверийн хариу үйлдэл хийх журам
процедур TForm1.IdUDPServer1UDPRead(AThread: TIdUDPLlistenerThread;
AData: TBytes; ABinding: TIdSocketHandle);
Var
i: Бүхэл тоо;
s: мөр;
Эхлэх
s:= "";
хичээ
i:= 0;
байхад (AData[i] 0) хийх
Эхлэх
s:= s + chr(AData[i]);
i:= i + 1;
Төгсгөл;
эцэст нь
Label1. Caption:= s;
Төгсгөл;
Төгсгөл;