Компоненти Indy

Крім базових служб і протоколів Інтернет існує широкий набір додаткових сервісів, можливості яких часто використовуються Інтернет-розробниками. До того ж далеко не завжди можливість відображення інформації за допомогою браузера є прийнятним рішенням для Інтернет-додатків. У цьому випадку розумно використовувати Інтернет-інфраструктуру для обміну даними, а відображення інформації забезпечити за рахунок більш складних клієнтських додатків, розроблених, припустимо, на delphi.

Припустимо, потрібно реалізувати спеціалізовану серверну логіку, яка не закладена в
стандартні web-сервери. Для вирішення такого класу задач до складу delphi включена бібліотека internet direct (indy) компанії nevrona designs (http://www.nevrona.com/indy/). Дана бібліотека, розроблена спеціально для borland delphi, налічує вже вісім версій, остання з яких увійшла до складу нової версії delphi. Набір компонентів розділений на три групи: клієнтські (indy client), серверні (indy servers) і допоміжні (indy misc). ndy clients і indy servers

Більшість компонентів indy client і indy servers являють собою пари, відповідні
клієнтським і серверним частинам протоколів і служб (за винятком окремих, в основному
серверних, компонентів типу tunnelmaster і tunnelslave), і дозволяють використовувати такі протоколи, як tcp / ip, udp, nntp, smtp, ftp, http, а також служби echo, finger, whois і т.д.

Клієнтські компоненти indy написані з використанням сокетів. Сокет з боку клієнта потребує з'єднання із сервером. Якщо зв'язок встановлено, клієнт і сервер можуть починати обмін повідомленнями.
Ці повідомлення носять різний характер, але зазвичай обмін відбувається за певним протоколу (наприклад, НТТР)

tidtcpclient і tidtcpserver

Ці компоненти використовуються для підтримки одного з основних мережевих протоколів – ТСР
(Transmission control protocol), а також є базовими класами для компонентів tidsmtp і
tidftp. Клас tidtcpserver має властивість threadmgr, за замовчуванням рівним nil. Якщо threadmgr
одно nil, коли tidtcpserver активізований, клас tidthreadmgrdeafault буде створений неявно. У
Інакше використовується встановлений менеджер процесів.

tidudpclient і tidudpserver

Ці компоненти використовуються для підтримки мережевого протоколу udp (user datagram protocol), а
також є базовими класами для ряду інших компонентів indy.

tidchargenserver

Компонент використовується для генерації випадкових символів, зазвичай, у випробувальних цілях.

tiddaytime і tiddaytimeserver

Компоненти використовуються для забезпечення служби часу. Клієнт запитує, а сервер повідомляє поточні дату і час.

tiddnsresolver

Це клієнтський компонент, обслуговуючий запити від сервера dns (domain name service). Запити dns-сервера призначені для заміни імені комп'ютера на його ip-адрес. tiddnsresolver є спадкоємцем класу tidudpclient.

tiddictserver

Серверний компонент, що підтримує протокол dictionary server protocol (dict) – серверний
словник на базі tcp-протоколу, який дозволяє клієнту отримувати доступ до словника природної мови.

tiddiscardserver

Серверний компонент, що підтримує сервер записів. Записи можуть бути використані як
інструмент налагодження і проведення вимірювань. Служба записів просто передає будь-які дані того, хто їх готовий приймати.

ti decho і ti dechoserver

Компоненти призначені для забезпечення служби відгуку, використовуваної, як правило, для
перевірки працездатності мережі. Клієнт посилає текстове повідомлення сервера, сервер повертає повідомлення клієнту. Якщо повідомлення спотворено, мережа працює з помилками.

tidfinger і tidfingerserver

Компоненти призначені для забезпечення протоколу, що дає користувачеві можливість
запитувати дані щодо присутності в системі інших користувачів. Деякі сервери обробляють такі клієнтські запити. Використання цієї пари компонентів дозволить виконати обслуговування клієнтських запитів, що з'ясовують наявність у системі інших користувачів.

tidftp

Компонент включає повну підтримку протоколу передачі файлів – ftp (file transfer protocol).
Підтримується пасивна та активна передача даних, а також такі операції, як get і put,
видалення директорій, отримання квот, розмірів файлів і каталогів. У своїй роботі ti dftp
використовує клас tidsimpleserver. Коли виконується передача файлу по протоколу ftp, вторинне
з'єднання по протоколу tcp відкрито для передачі даних і закривається, коли дані були
передані. Таке з'єднання називається "канал передачі даних", унікальний для кожного
передаваного файлу.

tidgopher і tidgopherserver

Ці компоненти призначені для забезпечення мережевого протоколу, витісненого останнім
час з www (world wide web) протоколом http. Сервер, який реалізує цей протокол,
забезпечує ієрархічну розподілену систему підтримки документообігу. Приклад
використання цієї пари компонентів, що знаходиться в директорії demosindygopherclient і
demosindy gopherserver, демонструє, як за допомогою цього протоколу можна надавати в
локальної мережі інформацію про файли, що знаходяться на вашому комп'ютері, в тому числі і про закриті.

tidhostnameserver

Серверний компонент, призначений для передачі клієнтам локального імені сервера.

tidhttp і tidhttpserver

Компоненти використовуються для забезпечення мережевого протоколу http (підтримуються версії 1.0 та 1.1, включаючи операції get, post і head). Крім того, забезпечується підтримка утентіфікаціі та застосування proxy-серверів. Серверний компонент використовується для надання послуг іншому web-серверу, що підтримує цей протокол. tidhttpserver полегшує реалізацію таких функцій, як cookies, управління власністю та ін

tidicmpclient

Клієнтський компонент, призначений для забезпечення протоколу icmp (internet control message protocol), за допомогою якого здійснюється виконання операції ping та трасування мережі.

tidpop3

Клієнтський компонент, призначений для забезпечення протоколу pop (post office protocol),
включаючи підтримку mime-кодування і декодування, а також передачу багатобайтні символів.

tidimap4server

Серверний компонент, призначений для підтримки операцій по протоколу imap (internet
message access protocol) на сервері. Протокол дозволяє здійснювати пошук повідомлень електронної
пошти на сервері. Різниця протоколів imap і РОР полягає в тому, що протоколу РОР потрібна додаткова пам'ять для зберігання даних, а протокол imap звертається до сервера замість клієнтської машини. imap4 створювався для заміни pop3, проте до цих пір протокол pop3 залишається широко використовуваним стандартом.

tidircserver

Серверний компонент, призначений для підтримки найбільш часто використовуваних в Інтернеті сервісних операцій, зазвичай званих chat (для дружніх бесід). Компонент забезпечує базові конструктивні блоки для irc (internet relay chat) сервера.

tidmappedporttcp

Серверний компонент, призначений для створення відображуваних портів, які часто
використовуються в proxy-серверах. Методи цього компонента дозволяють відобразити один порт на інший.
Наприклад, порт 80 може бути відображений до порту 3000, і всі запити до першого порту (порт 80) будуть переадресовані на другий порт (порт 3000).

tidnntp і tidnntpserver

Ці компоненти необхідні для забезпечення мережевого протоколу nntp (network news transfer
protocol), використовуваного в службах новин. Клієнтський компонент включає підтримку
mime-кодування і декодування, а також підтримку багатобайтні символів і альтернативних кодувань. Серверний компонент дозволяє створювати сервери новин. Важливо відзначити, що tidnntpserver є не повнофункціональний сервером новин, а компонентом, що забезпечує базові можливості для такого сервера.

tidqotd і tidqotdserver

Компоненти використовуються для забезпечення служби "цитат дня" (quote of the day). За допомогою
клієнтського компонента здійснюється з'єднання з екземпляром серверного компонента для
отримання щоденної цитати. Кожен екземпляр сервера містить унікальну базу даних цитат.

tidsmtp

Клієнтський компонент, призначений для застосування в додатках протоколу smtp (simple mail transfer protocol), забезпечення підтримки аутентифікації, mime-кодування і декодування, а також для підтримки багатобайтні символів.

tidsntp

Клієнтський компонент, призначений для забезпечення протоколу sntp (simple network time
protocol) – служби часу. Може використовуватися для з'єднання з будь-якою службою часу з метою визначення поточних дати і часу.

tidsimpleserver

Серверний компонент, який забезпечує полегшений ТСР-сервер. Дозволяє організовувати
з'єднання "точка-точка". Використовується для створення серверів з єдиним користувачем, тобто може одноразово обслуговувати тільки одне підключення. На відміну від компонента tidtcpserver не породжує вторинні процеси при очікуванні запитів від клієнтів і при обробці цих запитів.
Іншими словами, якщо сервер обслуговує запит від якогось клієнта, а в цей час до нього
звертається для підключення інший клієнт, то він буде блокований до кінця обробки першого
запиту.

tidtelnet і tidtelnetserver

Клієнтський компонент використовується для організації віддалених сеансів на іншому комп'ютері,
включаючи консольні переговори і аутентифікацію. Протокол зв'язку припускає наявність людини, що здійснює інтерактивну взаємодію з сервером. Клієнтський компонент не має підтримку дисплея і емуляцією терміналу, а просто забезпечує з'єднання з серверною частиною.
Зазвичай серверний протокол tidtelnetserver використовується для організації віддалених баз даних з текстовим інтерфейсом для інтерактивної взаємодії з клієнтами.

tidtime і tidtimeserver

Клієнтський компонент є альтернативою компонента tidsntp для визначення часу. Важливо зазначити, що формати цих двох протоколів різні. tidtime заснований на форматі rfc 868
(Повертає час у внутрішньому стандарті ОС unix, виконуючи всі необхідні перетворення).
Серверний компонент подібний щодо функціонування daytime-сервера. Може використовуватися для реалізації служби часу на локальному комп'ютері. Додаткового код непотрібно,
достатньо створити екземпляр tidtimeserver, який буде повертати час внутрішнього годинника
серверного комп'ютера.

tidtrivialftp і tidtrivialftpserver

Ці компоненти необхідні для організації найпростішого протоколу передачі файлів. Клієнтський компонент цього протоколу використовується для з'єднання з примірником відповідного серверного компонента. Протокол призначений для приватних, полегшених, локальних випадків передачі файлів,
наприклад в локальних обчислювальних мережах або для завантаження (вивантаження) таблиць маршрутизації в маршрутизатори. Зважаючи на ослаблених характеристик цього протоколу його використання не рекомендується у разі застосування алгоритмів аутентифікації або будь-яких інших механізмів захисту. Основне призначення даного протоколу – передача файлів апаратного пристрою з метою його модифікації.

tidtunnelmaster і tidtunnelslave

Серверні тунельні компоненти використовуються в proxy-серверах для організації множинних логічних з'єднань поверх одного фізичного (тунелю). Ці класи можна застосовувати для різних цілей, наприклад для організації секретного з'єднання по несекретних каналах.

tidwhois і tidwhoisserver

Цей клієнтський компонент здійснює з'єднання з будь-яким стандартним whois-сервером,
дозволяє отримати інформацію про домени. Серверний компонент забезпечує базову
функціональність nic сервера.

indy misc

Сторінка палітри компонентів indy misc (indy miscellaneous components) включає кодеки base64, uue, quoted printable і інші поширені формати обміну даними через e-mail, кодери (md2, md4 і md5) для стандартів криптографії, що використовуються для зберігання паролів та електронних підписів у незворотному (важко піддається дешифруванню) вигляді, а також багато інші корисні компоненти і утиліти, часто вживані при розробці Інтернет-додатків.

tidantifreeze

Внаслідок блокової організації алгоритмів компонентів indy часто створюється враження, що додаток "зависло", в той час як з'єднання працює. Щоб виключити використання вторинних процесів (Threads) при організації комунікацій для запобігання заморожування (freeze) додатки, досить помістити на форму зазначений компонент.

Компонент працює, аналізуючи запити з стека протоколу tcp / ip і посилаючи повідомлення додатком під час затримки при виникненні блокування зовнішніх з'єднань, що створює ілюзію працюючого коду. Оскільки вплив компонента здійснюється на блоковані з'єднання лише для головного процесу, використання tidantifreeze у вторинних процесах додатки не потрібно. Необхідно пам'ятати, що компонент tidantifreeze уповільнює роботу сполук, оскільки робота головного процесу періодично переривається для обробки повідомлень. Звідси випливає, що треба дбати про те, щоб розроблювальний додаток не витрачала занадто багато часу на обробку повідомлень, включаючи onclick, onpaint, onresize та ін У якійсь мірі цим можна управляти через властивості класу tidantifreeze. Використання даного компонента не є обов'язковим, але дозволяє вирішити проблему синхронізації сполук з візуальним інтерфейсом програми.

tiddatetimestamp

Клас для виконання математичних дій з датою і часом, пов'язаних з тим, що
Інтернет-протоколи використовують різні формати дати і часу, крім того, клієнти і сервери можуть перебувати в різних годинних поясах.

tidipwatch

Це компонент, заснований на таймері, який постійно контролює зміни в ip-адресі
комп'ютера. Події компонента виникають, коли виявлено зміну. Зазначений компонент зазвичай використовують для виявлення факту появи зв'язку комп'ютера з Інтернетом або будь-який інший мережею. Зміна в ip-адресу в цій ситуації може відбутися через призначення ip-адреси dhcp-сервером (dynamic host configuration protocol) при з'єднанні з новою мережею.

tidlogdebug

Призначення даного компоненту – перехоплювати події будь-якого клієнтського або серверного
компонента і поміщати запис про подію у вказаний файл. Цей компонент дуже корисний для
налагодження компонентів indy.

tidmessage

Компонент використовується в комбінації з іншими компонентами, щоб належним чином розшифрувати або кодувати повідомлення. Це можуть бути pop-, smtp-і nntp-компоненти. Клас підтримує mime-шифрування і розшифровку, багатобайтні символи і кодування iso.

tidnetworkcalculator

Один з небагатьох компонентів indy, який можна використовувати при конструюванні додатків. Мережевий калькулятор може служити для обчислень, вироблених над ip-адресами, включаючи мережеві маски, підмережа, класи мережі і т.д.

tidthreadmgrdefault

Компонент забезпечує управління вторинними процесами за замовчуванням. Створюється у разі, якщо для будь-якого компоненту indy, що підтримує управління процесами, не визначений екземпляр класу tidthreadmanager. Компонент забезпечує лише основні можливості управління вторинними процесами: створює і знищує їх на вимогу.

tidthreadmgrpool

Більш просунутий компонент управління процесами, ніж tidthreadmgrdefault, тому що він
об'єднує процеси, а не створює або знищує їх на вимогу.

tidvcard

vСard – електронний еквівалент візитної картки, може містити персональну інформацію власника, графічні дані.

tidimfdecoder

Призначений для декодування Інтернет-повідомлень. Є спадкоємцем класу tidcoder, так само як і всі інші компоненти-кодувальники. Клас tidcoder здійснює декодування у відповідності зі стандартом формату текстових Інтернет-повідомлень arpa rfs-822, запропонованим у серпні 1982 року, і стандартом для обміну usenet-повідомленнями rfc 1036, запропонованим у грудні 1987 року.

Компонент розширює можливості класу tidcoder, дозволяючи виявляти формат rfs-822 по
контексту заголовків, забезпечуючи режим розшифровки при прийомі і mime-шифрування та
розшифровку. Компонент tidimfdecoder використовується в класі tidmessageclient для декодування отримуються і переданих повідомлень.

tidquotedprintableencoder

quotedprintableencoder дозволяє виробляти розшифровку тексту в зазначеному форматі. Може
служити в якості автономного компонента з вказаним типом кодування, що дозволяє передавати повідомлення, що містять кодування нового типу.

tidbase64encoder

Реалізує ще один алгоритм шифрування, який дає можливість передавати недруковані
символи.

tiduuencoder

Реалізує один з перших шіфроалгорітмов, uu-кодування. Іноді використовується при поштових пересиланнях статей у службі новин.

tidxxencoder

Цей метод шифрування навряд чи коли-небудь буде використовуватися. По суті, це те ж саме
uu-кодування, але з іншою таблицею шифрування.

tidcodermd2

Компоненти з різними різновидами алгоритму шифрування md (message digest). Всі вони
засновані на перемішуванні, є односторонніми і не мають алгоритмів розшифрування.

Компоненти протокольних клієнтів і серверів можуть бути використані для розробки серверних і клієнтських Інтернет-додатків, спільно або замість базових (clientsocket, serversocket) та інших компонентів зі складу палітри internet і fastnet. Компоненти indy не використовують архітектуру webbroker, реалізуючи підтримку Інтернет-протоколів і служб на нижньому рівні безпосередньо у своєму вихідному коді (вихідні коди додаються).

tidconnectioninterceptopenssl і tidserverinterceptopenssl

Протокол ssl – secure sockets layer (Таємний рівень сокетів), що забезпечує секретність і
надійність зв'язку між двома додатками, має два рівні. На низькому рівні багаторівневого транспортного протоколу (наприклад, tcp) ssl є протоколом запису і використовується для інкапсуляції різних протоколів більш високого рівня. Перевага ssl полягає в тому, що він є незалежним протоколом прикладної програми, при цьому протокол більш високого рівня може бути використаний поверх ssl.

ssl здійснює захист зв'язку, яка має три основні функції: забезпечення
конфіденційного з'єднання; шифрування з відкритим ключем (використовується для підтвердження автентичності адресата); підтримка надійності передачі даних.

Симетрична криптографія використовується для шифрування даних (наприклад, des, rc4 і т.д.).
Цифровий підпис забезпечується за допомогою асиметричного шифрування з відкритим ключем
(Наприклад, rsa, dss і т.п.).
Надійність зв'язку, транспортування повідомлення включає перевірку цілісності повідомлення
за допомогою коригуючих кодів mac, безпечних хеш-функцій (наприклад, sha, md5, і т.д.) з використанням mac-обчислень.

У поєднанні з протоколом http та аутентифікації сервера протокол ssl забезпечує необхідні функції шифрування і надалі підтримує встановлений з'єднання, перевіряючи справжність web-сервера і т.п. Важливо зрозуміти, що ssl тільки захищає зв'язок в процесі передачі даних, а не замінює інші захисні механізми.

Компоненти tidconnectioninterceptopenssl і tidserverinterceptopenssl забезпечують з'єднання як з боку клієнта, так і з боку сервера відповідно до протоколу ssl. Необхідно зазначити, що компоненти tidconnectioninterceptopenssl і tidserverinterceptopenssl є тільки в delphi 6, а в kylix відсутні. Це пов'язано зі складністю протоколу, який у разі реалізації windows заснований на функціях операційної системи.

Приклади використання компонентів indy можна знайти в каталогах / delphi6/demos/indy. Всього
бібліотека indy у версії 8.0 містить 69 компонентів. Заявлено, що у версії 9.0 зазначена
бібліотека буде містити 86 компонентів. Всі компоненти уніфіковані і включені як у delphi 6, так і в kylix, що дозволяє використовувати їх для розробки крос-платформних додатків. Всі компоненти indy підтримують багатопоточність.

У компонентах indy реалізована майже вся функціональність, наявна в компонентах internet і fastnet, що наочно показано в таблиці.

Компоненти fastn et. Компоненти indy. Призначення компонентів


  1. tserversocket, tidtcpserversocket – Взаємодія двох комп'ютерів (клієнта і сервера) за допомогою протоколу tcp / ip tclientsocket tidtcpclientsocket

  2. tnmdaytime tiddaytime – Запит сервера про поточний час tiddaytimeserver

  3. tnmecho tidecho – Використовуються для зв'язку з сервером відгуку tidechoserver

  4. tnmfinger tidfinger – Використовуються для отримання інформації про користувача з пошукового Інтернет-сервера tidfingerserver

  5. tnmftp tidftp, tidtrivialftp, tidtrivialftpserver – Забезпечують передачу файлів за допомогою протоколу ftp

  6. tnmhttp tidhttp, tidhttpserver – Чи використовують протокол http для обміну даними

  7. tnmmsgserv, – Використовуються для передачі простих текстових tnmmsg повідомлень від клієнта до сервера

  8. tnmnntp tidnntpserver – Чи підтримують обмін даними з сервером новин tidnntp

  9. tnmpop3 tidpop3 – Використовуються для отримання електронної пошти з поштового сервера за допомогою протоколу pop3

  10. tnmsmtp tidsmtp – Використовуються для відправки електронної пошти через поштовий сервер Інтернет

  11. tnmstrm, tnmstrmserv – Передають двійкові дані, записані в потік, за допомогою протоколу tcp / ip

  12. tnmudp tidudp, tidudpserver – Здійснюють пересилку даних з використанням протоколу udp

  13. tpowersock, tnmgeneralserver – Інкапсульовані у вигляді компонентів класи, які є базовими для написання власних клієнтів (powersock) і серверів (nmgeneralserver)

  14. tnmuuprocessor tiduuencoder – Здійснюють перекодування двійкових файлів у формат mime або uuencode tiduudecoder

  15. tnmurl – Перекодує рядки у формат html і здійснює зворотний перекодування


Виняток становлять такі класи, як tnmmsgserv, tnmmsg, tnmstrm, tnmstrmserv, tpowersock, tnmgeneralserver, tnmurl, які або реалізують морально застарілі протоколи, або мають функціональністю, реалізованої у великій групі альтернативних класів.

Однак на відміну від своїх попередників – компонентів internet і fastnet, в indy багатшими
представлені серверні компоненти та компоненти перекодування і шифрування даних, а також підтримка аутентифікації (палітра indy misc). Як видно з наведеної вище таблиці, основні протоколи та служби забезпечуються не тільки клієнтськими, а й серверними компонентами. Це служби часу, відгуку, отримання інформації про користувача, а також протоколи http, nntp, udp і навіть найпростіший варіант ftp.

Деякі приклади застосування компонентів indy

У компонентах indy, які містяться в delphi, ip-адреса визначається у властивості host, як
правило, тільки в клієнтських додатках. Компоненти, що розміщуються на сервері, мають методи, що дозволяють розпочати або припинити опитування відповідного порту, – наприклад зміна властивості active компонента idtcpserver починає або припиняє опитування відповідного порту. Після встановлення зв'язку між клієнтом і сервером можна починати передачу даних.

У компонентах indy велика увага приділяється безпеки і надійності при роботі з даними. Наприклад, в компоненті idtcpclient є методи connect і disconnect. Застосовуючи техніку
програмування, як у наведеному нижче коді з боку клієнта:

with tcpclient do
begin
connect;
try
lstmain.items.add(readln);
finally
disconnect;
end;
end;

і використовуючи властивість connection, передане в якості параметра примірника athread класу
tidpeerthread, з боку сервера:

with athread.connection do
begin
writeln(“hello from basic indy server server.”);
disconnect;
end;

можна розраховувати або на штатне виконання з'єднання, або на правильну обробку помилки.

Зверніть увагу на методи readln і writeln відповідних класів – вони нагадують
стандартні оператори введення-виведення pascal. Це данина техніці програмування в unix, де
більшість системних операцій виконуються завдяки читанню і запису у відповідні файли.

Так само як у компонентів fastnet, в класів компонентів indy є події, за допомогою яких можна організовувати подієве управління. Наприклад, можна організувати виведення повідомлення на форму при з'єднанні з клієнтом:

procedure tform1.idechoserver1connect(athread: tidpeerthread);
begin
lblstatus.caption := “[ serving client ]”;
end;

У indy представлені компоненти, що реалізують протоколи з клієнтськими і серверними частинами,
властиві тільки цій бібліотеці. Компоненти tidgopherserver і tidgopher, завдяки методам
getextendedmenu, getfile, getmenu, gettextfile на клієнтській стороні і returngopheritem,
senddirectoryentry – на стороні сервера, допомагають здійснити перегляд файлів різного типу, в тому числі помічених як приховані, а також директорій на віддаленому комп'ютері (подібно до того, як це робить команда dir *.* в операційній системі ms-dos).

За допомогою компонентів idsmtp і idmessage можна легко створити свій web-додаток, здатне відправляти пошту за протоколом smtp.

При цьому клас idmessage (один з 23 компонентів зі сторінки indy misc) відповідає за формування повідомлення, що випливає з його назви, а idsmtp – за організацію з'єднання з поштовим сервером.

Технологія, що застосовується в indy, використовує операції читання і запису з блокуванням. Будь-яка
операція connect, використовувана в indy, очікує завершення з'єднання. При роботі з клієнтськими компонентами indy, як правило, потрібно виконання наступних операцій:

запросити з'єднання із сервером; здійснити запити до сервера на читання та запис (в залежності від типу сервера крок виконується один раз або повторюється багато разів);
закінчити з'єднання з сервером і роз'єднатися.

Компоненти indy розроблялися так, щоб забезпечити надвисокий рівень абстракції.
Заплутаність і подробиці стека tcp / ip приховані від програміста, з тим щоб він міг зосередитися на поточних завданнях.

Наступний невеликий приклад показує типову сесію клієнтського компонента:

with indyclient do begin
host := “zip.pbe.com”; // host to call
port := 6000; // port to call the server on
connect;
try
// your code goes here
finally
disconnect;
end;
end;

У прикладі, навіть якщо з'єднання з сервером не буде встановлено, зв'язок коректно розірветься
завдяки використанню оператора try-finally.

Серверні компоненти indy описують різноманітні моделі серверів, які можна використовувати в залежності від потреб і застосовуваного протоколу.

tidtcpserver – найбільш часто використовуваний серверний компонент, який створює вторинний
процес, незалежний від основного процесу додатки. Створений процес очікує вхідні запити від потенційних клієнтів. Для кожного клієнта, на запит якого він відповідає, створюється індивідуальний вторинний процес. Події, що виникають у процесі обслуговування, співвідносяться з контекстом відповідних процесів.

Іншими словами, для кожного клієнтського підключення клас tidtcpserver використовує унікальний
вторинний потік, викликаючи обробник події onexecute цього потоку. Формальним параметром
методу onexecute є посилання на екземпляр класу athread, відповідного створеному потоку.
Властивість connection цього класу – посилання на клас tidtcpconnection, примірник якого створюється для обробки клієнтського запиту. tidtcpconnection підтримує читання і запис через з'єднання, а також встановлення і завершення сеансу зв'язку.

Протокол udp працює без попередньої установки з'єднання з сервером (кожен посланий пакет є самостійним набором даних, а не частиною великої сесії або з'єднання). У той час як tidtcpserver породжує окремі потоки для кожного з'єднання, tidudpserver використовує або головний потік, або єдиний вторинний потік, який обробляє всі запити протоколу udp. Коли tidudpserver активний, створюється потік для прослуховування входять udp-пакетів. Для кожного отриманого пакета виникає подія onudpread або в основному потоці, або в контексті прослуховуючого потоку – залежно від значення властивості threadedevent. Коли threadedevent приймає значення false, подія виникає в основному потоці, в іншому випадку – в прослуховуючої потоці. Поки відбувається обробка події, інші операції сервера блокуються. Тому важливо стежити, щоб процедури onudpread виконувалися як можна швидше.

Якщо потрібно створити клієнтську програму нового клієнта для існуючого сервера з
використанням існуючого протоколу, ваше завдання полягає виключно у розробці та
налагодженні клієнтського додатку. Однак, коли доводиться розробляти і клієнтське, і серверне програми із застосуванням існуючого або нового протоколу, ми стикаємося з класичною проблемою "яйця і курки ". З чого починати програмування – з клієнта або з сервера?

Очевидно, в підсумку повинні бути створені і клієнт, і сервер. Для багатьох додатків, особливо
використовують текстовий протокол (наприклад, http), простіше почати створення програми з
проектування сервера. А для його налагодження є зручний клієнт, який вже існує. Це – консольний додаток telnet, яке є і на windows, і на unix.

Якщо набрати консольну команду telnet 127.0.0.1 80 з ip-адресою локального комп'ютера і номером порту 80, що використовується за умовчанням web-серверами, то додаток відгукнеться текстом, представленим на рис. 6, у випадку ОС windows 2000 і iis 5.0.

Для створення найпростішого сервера з використанням компонентів indy необхідно:

Створити новий проект.
Помістити на головну форму проекту примірник компонента tidtcpserver з палітри indy servers.

Присвоїти властивості defaultport екземпляра класу tidtcpserver1 значення 6002 (рекомендується
привласнювати великі значення, щоб уникнути дублювання номерів портів у різних
додатків), а властивості active – значення true.
Додати наступний текст в метод екземпляра класу tidtcpserver1, що обробляє подію
onexecute:
procedure tform1.idtcpserver1execute(athread: tidpeerthread);
var
s: string;
i: integer;
begin
with athread.connection do
try
writeln(“type an integer and enter”);
s := readln;
try
i := strtoint(s);
writeln(s + ” squared is ” + inttostr(i*i));
except
writeln(s + ” is not an integer”);
end;
finally
disconnect;
end;
end;

Методи, подібні вищенаведеному обробнику події, обов'язково повинні включати
оператори try-finally, щоб мати можливість розірвати з'єднання з клієнтом незалежно від
того, як відбувалася обробка операторів, виконуваних при з'єднанні, а також c метою
коректної обробки непередбачених тимчасових затримок при з'єднанні.
Скомпілюйте і збережіть проект, запустіть його або як автономну програму, або з-під
delphi, попередньо обравши команду головного меню ide tools / debugger options і відключивши
опцію integrated debugging, що знаходиться в лівому нижньому кутку вікна.

Відкрийте консольне вікно і наберіть команду telnet 127.0.0.1 6002.
У вікні з'явиться текст, який створює сервер.

Рекомендується застосування англійської нотації, так як інших мов telnet не розуміє.
Ввівши, наприклад, цифру 9, можна побачити реакцію сервера у вигляді, показаному на малюнку.

Насправді для забезпечення синхронізації після натискання клавіші enter в контексті
клієнта на сервері відбувається так званий блокуючий виклик (тимчасова затримка на
кілька мікросекунд), необхідний для забезпечення роботи з іншими можливими клієнтами.
При цьому, оскільки кожен запит від клієнта обробляється незалежно і одночасно,
обслуговування з боку сервера відбувається в середньому за одне і те ж час. Якщо б ви
програмували сервер без використання компонентів indy, то операції такого типу довелося б підтримувати самостійно.
Командою exit у разі windows і "ctrl +]" у разі unix можна завершити роботу консольного
вікна.
Якщо при виконанні п. 5 використовувався варіант запуску з-під середовища програмування,
поверніть опцію integrated debugging в початковий стан.

Якщо необхідно спроектувати сервер, який буде не тільки коректно інформувати своїх клієнтів про розрив з'єднання, але й видавати для них інформацію про виниклі помилкових ситуаціях, застосовуйте оператор try-except замість try-finally – наприклад, як показано в наступному прикладі:

procedure tdatamodule1.idtcpserver1execute(athread: idpeerthread);
var
s: string;
begin
with athread.connection do
try
try
s := readln;
// perform the task of the server here
// if no exception is raised,
// write out the server”s response
writeln(s);
except
on e: exception do
begin
writeln(e.message);
end; //on
end; //try except
finally
disconnect;
end;
end;

Цей невеликий приклад демонструє етапи створення простого текстового сервера, а також способи його налагодження.

Вищеописаний сервер є типовим прикладом організації сучасного розподіленого обчислення.

Особливості створення багатоланкових додатків

Останнім часом для задоволення клієнтських запитів все частіше використовуються множинні сервери. Сервер такого типу, отримавши запит клієнта і частково підготувавши його для подальшої обробки, зв'язується з іншим сервером і передає йому трансформований запит або запити.
Сервер другої ланки може, у свою чергу, зв'язуватися з іншими серверами. Таким чином,
можна говорити про багатоланкової серверній архітектурі.

Далі ми займемося створенням сервера доступу до даних, призначення якого полягає в тому, щоб повертати дані з бази даних. Цей сервер, проте, не здійснює читання і запису у файли бази даних безпосередньо. Замість цього він зв'язується з сервером бази даних у пошуках даних, необхідних клієнтом.

Отже, ми приступаємо до розробки програми з триланкової архітектурою. Для створення сервера бази даних з використанням компонентів indy необхідно:

Створити новий проект.
Помістити на головну форму проекту примірник компонента tidtcpserver з палітри indy servers.
Присвоїти властивості defaultport екземпляра класу tidtcpserver1 значення 6001 (рекомендується
привласнювати великі значення, щоб уникнути дублювання номерів портів у різних
додатків), а властивості active – значення true.
Додати в проект новий модуль, вибравши команду file / new / data module, і помістити на нього
екземпляри компонентів sqlconnection і sqldataset із закладки dbexpress на палітрі
компонентів.
Встановити властивість connectionname класу sqlconnection в iblocal і loginprompt в false. Якщо
ви не конфігурувати iblocal на базу даних employee.gdb, спочатку виконайте цю процедуру.
Встановити властивість sqlconnection класу sqldataset в sqlconnection1 і привласнити властивості
commandtext оператор sql:
select customer, contact_first, contact_last from customer where cust_no =: cust.
Повернутися до головної формі і додати в операторі uses посилання на data module, наприклад unit2.
Вибрати на формі примірник компонента tidtcpserver і для його обробника події onexecute
ввести наступний текст:

procedure tform1.idtcpserver1execute(athread: tidpeerthread);
var
cust: integer;
datamodule: tdatamodule2;
begin
with athread.connection do
try
try
datamodule := tdatamodule2.create(nil);
try
cust := strtointdef(readln, 0);
if cust = 0 then
begin
writeln(“not found”);
exit;
end; // if cust = 0
datamodule.sqldataset1.params[0].value := cust;
datamodule.sqldataset1.open;
if datamodule.sqldataset1.isempty then
writeln(“not found.”)
else
writeln(datamodule.sqldataset1.fields[0].asstring +
” contact name is “+
datamodule.sqldataset1.fields[1].asstring + ” ” +
datamodule.sqldataset1.fields[2].asstring);
except
on e: exception do
begin
writeln(“error: ” + e.message);
end; //on
end; // try
finally
datamodule.free;
end; // try
finally
disconnect;
end; //with try
end;

Скомпілюйте і збережіть проект, запустіть його або як автономну програму, або з середовища розробки delphi, попередньо обравши команду головного меню ide tools / debugger options і відключивши опцію integrated debugging, що знаходиться в лівому нижньому кутку вікна.
Відкрийте консольне вікно і наберіть команду telnet 127.0.0.1 6001.


Після з'єднання з сервером, у випадку введення числа 1001, можна буде побачити його відгук з
інформацією з бази даних.

Якщо кількість клієнтів, що одночасно звертаються до сервера, не надто велике, не
обов'язково створювати екземпляри класів, що обробляють запити до бази (в нашому випадку
datamodule), у кожному потоці, що обробляє клієнтські запити. Але в міру збільшення навантаження на сервер подібна техніка програмування стає виправданою.

Закінчивши налагодження сервера, можна легко створити і налагодити проект з власним клієнтом. Створення клієнтів, що використовують indy, настільки ж просто, як і створення серверів. Читання і запис даних на сервер в клієнтських методах відбуваються за допомогою тих же операторів, що і в серверних методах.
Ці оператори дуже схожі на стандартні оператори введення-виведення pascal. Перед початком операцій обміну даними клієнт повинен підключитися до сервера. Читання і запис відбуваються з блокуванням, тобто клієнт буде чекати, поки сервер не закінчить обробку попереднього оператора.

Для створення сервера бази даних з використанням компонентів indy необхідно:

Створити новий проект.
Покласти на форму компоненти з палітри для забезпечення працездатності клієнта, у тому
числі tidtcpclient.

Присвоїти властивостям caption міток і кнопок, покладених на форму, необхідні значення.
Присвоїти властивості host екземпляра класу idtcpclient значення 127.0.0.1, а властивості port –
значення 6001.
Вибрати на формі примірник компонента idtcpclient і для його обробника події onclick
ввести наступний текст:

procedure tform1.bitbtn1click(sender: tobject);
begin
with idtcpclient1 do
begin
connect;
try
writeln(edit1.text);
label3.caption := readln;
finally
disconnect;
end;
end;
end;

Скомпілюйте і збережіть проект, запустіть його. При запущеному сервері клієнт буде
підтримувати функціональність, яку раніше забезпечувала утиліта telnet.

Обробка помилок клієнтського додатка схожа на обробку помилок при роботі з файлом. Так само як при роботі з файлом, коли незалежно від результату операцій введення-виведення після відкриття файлу повинна обов'язково послідувати операція закриття файлу, у клієнта після операції з'єднання з сервером повинна слідувати операція розриву з'єднання. Мінімально необхідний код зображений у наведеному вище прикладі. Якщо клієнтське додаток повинен докладно діагностувати помилкові ситуації, можливе застосування оператора try-except.

try
client.connect;
try
//perform reading/writing
finally
client.disconnect;
end;
except
on e: eidexception do
begin
showmessage(“communication exception: ” + e.message);
end // on eidexception
on e: exception do
begin
showmessage(“error: ” + e.message);
end; // on exception
end;

Клієнтські компоненти indy не підтримують події, що виникають, наприклад, при розриві
з'єднання. Якщо користувач не обробляє ці ситуації самостійно за допомогою операторів try-finally і try-except, він може дізнатися про це тільки під час наступного з'єднання з даним сервером. Спори про правильність такого вибору носять філософський характер. З точки зору розробників indy, таке технічне рішення додає надійності програмного забезпечення

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*