Програмна реалізація системи IP-телебачення на базі архітектури клієнт-сервер
СОДЕРЖАНИЕ: Переваги архітектури клієнт-сервер, порівняльна характеристика програмних засобів розробки його систем. Основні концепції функціонування системи IP-телебачення на базі архітектури клієнт-сервер. Механізм взаємодії клієнта і сервера в середі Delphi.ПРОГРАМНА РЕАЛІЗАЦІЯ СИСТЕМИ IP-ТЕЛЕБАЧЕННЯ НА БАЗІ АРХІТЕКТУРИ “КЛІЄНТ-СЕРВЕР”
Архітектура “клієнт-сервер”
Термін “клієнт-сервер” означає таку архітектуру програмного комплексу, в якій його функціональні частини взаємодіють по схемі “запит-відповідь”. Якщо розглянути дві взаємодіючі частини цього комплексу, то одна з них (клієнт) виконує активну функцію, тобто ініціює запити, а інша (сервер) пасивно на них відповідає.
Переваги архітектури “клієнт-сервер”:
швидкодія – основний фактор доцільності розробки систем для архітектури “клієнт-сервер”. Застосування засобів швидкої розробки програм RAD, таких, як Delphi компанії Borland, PowerBuilder фірми PowerSoft і Visual Basic корпорації Microsoft, дозволяє розробникам швидко і ефективно створювати прикладні системи для архітектури “клієнт-сервер”;
архітектура “клієнт-сервер” – це технологія, що надає більше самостійності користувачам. Прикладні програми і дані знаходяться на доступних системах.
привабливість графічного інтерфейсу користувача (ГІП).
Клієнт-серверна інформаційна система складається в найпростішому випадку з трьох основних компонентів:
сервер. Керівник зберіганням даних, доступом і захистом, резервним копіюванням, відстежує цілісність даних відповідно до бизнес-правил і, найголовніше, виконує запити клієнта;
клієнт. Надає інтерфейс користувача, виконує логіку прикладних програм, перевіряє допустимість даних, посилає запити до сервера і одержує відповіді від нього;
мережа і комунікаційне програмне забезпечення. Здійснює взаємодію між клієнтом і сервером за допомогою мережевих протоколів.
Програмні засоби розробки систем “клієнт-сервер”
Призначення будь-якого інструменту для розробки систем “клієнт-сервер” – прискорити і спростити процес їх створення. За допомогою засобів швидкої розробки прикладних програм можна створювати програми з вбудованими засобами звязку з будь-яким числом серверів.
На цьому швидкорослому ринку конкурують сотні інструментальних комплектів для архітектури клієнт-сервер. Ряд кращих засобів Microsoft Windows представлені пакетами Delphi Client/Server Suite компанії Borland, Enterprise Developer фірми Symantec, PowerBuilder компанії PowerSoft, SQLWindows 5 фірм Gupta і Visual Basic корпорації Microsoft.
У кожному інструментальному комплекті використовується власний підхід, але більшість з них володіє однаковим набором основних функцій: проміжне забезпечення, можливість конструювання баз даних, репозиторій (сховище), можливості обєктно-орієнтованої розробки, конструктори ГІП, мова програмування високого рівня і механізми розподілу прикладних програм. Порівняльна характеристика програмних засобів розробки систем “клієнт-сервер” наведена в таблиці 1.
Для програмної реалізації прикладних програм, що демонструють основні можливості IP-телебачення побудованих на базі архітектури “клієнт-сервер” використана обєктно-орієнтована мова програмування Delphi компанії Borland. В порівнянні з іншими засобами розробки Delphi має ряд переваг. У Delphi вдало поєднуються засоби візуального проектування і оптимізуючий компілятор, чого не можна сказати про інші системи RAD. Наявність в системі компілятора і генерування нею машинного коду ще не означає, що отримуваний код є оптимальним. Такі системи, як PowerBuilder і Visual Basic, спочатку створювалися на основі концепції генерації псевдокоду. При виконанні прикладних програм, створених за допомогою цих систем, отриманий псевдокод інтерпретувався.
Таблиця 1. Порівняльна характеристика програмних засобів розробки систем “клієнт-сервер”
Найменування | Коротка характеристика |
Delphi Client/Server | Універсальний пакет для розробки клієнт-серверних прикладних програм. Забезпечує обєктно-орієнтовану розробку з використанням візуальних засобів. Підтримує групову роботу над програмою. |
CA-OpenROAD | Повнофункціональне обєктно-орієнтоване середовище для розробки прикладних програм на основі мови четвертого покоління 4GL |
Magic 6.0 | Таблично-керований інструментарій для розробки трирівневих прикладних програм “клієнт-сервер” |
MS Visual Basic 5.0 | Універсальний пакет розробки користувальницьких прикладних програм. Забезпечує візуальну побудову форм і компіляцію програми. У повному обємі підтримуються OLE 2.0 і OLE Automation. Для роботи з даними призначений візуальний інструментарій Visual Database Tools |
PowerBuilder 4.0 | Обєктно-орієнтований засіб розробки прикладних програм “клієнт-сервер”. Має могутні візуальні засоби; підтримує стандарти OLE і ODBC |
Progress 8 | Пакет підтримує компонентну обєктно-орієнтовану розробку прикладних програм. Використовується нова технологія SmartObject і середовище компонентів програми (ACE) |
SAS System | Забезпечує інструментарій для доступу, управління, аналізу і представлення даних в прикладній програмі для величезного числа систем і компютерних платформ, включаючи мейнфрейми. Має 35 видів інтерфейсу для різних систем і мову програмування четвертого покоління. Підтримує ODBC |
Uniface Six | Незалежне середовище розробки. Підтримує управління на рівні моделі і компонентне програмування. Має могутні візуальні засоби. Допускає групову розробку. Має інтерфейс до більш ніж 30 серверам БД на різних платформах |
З виходом Delphi як компанія Microsoft, так і компанія Powersoft, спробували впровадити в свої продукти повноцінні компілятори. Проте проблема полягає в тому, що ні мова Visual Basic, ні мова PowerScript не призначалися для компіляції, тому перетворення їх в машинний код виявилося достатньо важким завданням.
Якщо порівняти вищезазначені мови з Object Pascal, що використовується в системі Delphi, то відмінність видно відразу. Object Pascal завжди був компільованою мовою, і при його розробці були дотримані всі вимоги, виконання яких обовязково при компіляції і оптимізації. Підсумок вищесказаного такий: Delphi є кращим повноцінним засобом промислової розробки систем “клієнт-сервер”, що володіє безліччю достоїнств, завдяки яким Delphi можна виділити з ряду інших засобів розробки. Серед них:
обширна бібліотека класів;
швидкий оптимізуючий компілятор, що генерує машинний код;
вбудований відладчик;
простий в освоєнні механізм доступу до баз даних ;
могутнє і зручне в роботі середовище розробки.
Інструментальні засоби компанії Borland Delphi надають широкі можливості розробки професійних прикладних програм в архітектурі клієнт-сервер, включаючи розподілені системи і додатки для Internet.
Програмна реалізація
Розроблені прикладні програми “Server” і “Client” демонструють приклад роботи класичної дволанкової архітектури “клієнт-сервер”, інтерфейсні оболонки яких представлені на рис.1 і рис. 2
Елементи, з яких конструюється видиме зображення, що створюється працюючою програмою, називаються компонентами. В якості інтерфейсного елемента і, в той же час контейнера для всіх видів компонентів виступає форма. Поєднання таких можливостей витікає з приналежності форми до класу TWinControl, що дозволяє формі бути оболонкою навколо віконного компоненту Windows, і відповідно, до класу TComponent, від якого успадковується TWinControl, завдяки чому форма може бути власником компонентів. Кожен компонент, розташований на формі, є деяким класом – спадкоємець класу TComponent, який є базовим для створення компонентів. Прямі спадкоємці цього класу не мають візуального представлення і являються, відповідно, невізуальними. До таких компонентів відносяться: IdUDPServer, ServerSocket, ClientSocket.
Рис. 1. Інтерфейсна оболонка прикладної програми “Server”
Рис. 2. Інтерфейсна оболонка прикладної програми “ Client ”
Компоненти, які мають візуальне представлення в процесі виконання програми і її проектування, успадковані від нащадка TComponent, класу TControl, і називаються візуальними. До таких компонентів відносяться: Button, SpeedButton, LabeledEdit, Edit, Label, GroupBox, FileListBox, ProgressBar, PageControl, TabSheet, Panel, MediaPlayer, Bevel.
Так само існує третій вид компонентів, які спочатку не видно користувачеві, але можуть зявлятися на екрані в окремих вікнах у разі потреби – це діалоги. Діалоги є спадкоємцями класу TComponent через спеціалізований клас TCommonDialog. Клас TCommonDialog серед інших методів додає до класу TComponent метод Execute, який є абстрактним і перевизначається конкретними компонентами-діалогами для виведення діалогового вікна на екран. Серед такого роду компонентів в програмі “Server” присутній діалог відкриття файлів OpenDialog. Призначення всіх використаних в прикладних програм “Server” і “Client” компонентів наведені в додатку А.
Кожна програма складається з файлу проекту (файл з розширенням dpr) і файлу модуля (файл з розширенням pas).
Структура проекту
Проект – це контейнер верхнього рівня, в якому зберігаються всі обєкти прикладнщї програми. Його призначення полягає в забезпеченні взаємозвязку файлів з яких складається програма.
Файл проекту є програмою, написаною на мові Object Pascal і призначеною для обробки компілятором. Ця програма автоматично створюється Delphi і містить лише декілька рядків, які приведені в лістингу Б.1 додатку Б .
У тексті кода жирним шрифтом виділяються так звані зарезервовані слова, а курсивом – коментарі. Текст програми починається зарезервованим словом program і закінчується словом end з крапкою за ним. Поєднання end з наступною за нею крапкою називається термінатором програмної одиниці: як тільки в тексті програми зустрінеться такий термінатор, компілятор припиняє аналіз програми і ігнорує частину тексту, що залишилася.
Зарезервовані слова грають важливу роль в Object Pascal, додаючи програмі в цілому властивість тексту, написаного на майже природній англійській мові. Кожне зарезервоване слово несе в собі умовне повідомлення для компілятора, який аналізує текст програми.
Коментарі, навпаки, нічого не означають для компілятора, і він їх ігнорує. Коментарі важливі для програміста, який з їх допомогою пояснює ті або інші місця програми. Наявність коментарів в тексті програми робить її зрозуміліше і дозволяє легко пригадати особливості реалізації програми, яка була написана кілька років тому. У Object Pascal коментарем вважається будь-яка послідовність символів, поміщена у фігурні дужки. Так само символи // указують компілятору, що коментар розташовується за ними і продовжується до кінця поточного рядка.
Слово Program з наступним за ним імям програми і крапкою з комою утворюють заголовок програми. За заголовком слідує розділ описів, в якому описуються використовувані в програмі ідентифікатори. Ідентифікатори позначають елементи програми, такі як типи, змінні, процедури, функції. За допомогою речення, яке починається зарезервованим словом uses, програміст повідомляє компілятор про ті фрагменти програми (модулі), які необхідно розглядати як невідємні складові частини програми і які розташовуються в інших файлах.
Рядок “Forms, MainUnit in MainUnit.pas {MainForm};” вказує, що крім файлу проекту в програмі повинні використовуватися модулі Forms і MainUnit. Модуль Forms є стандартним. Призначення цього модуля полягає у визначенні характеристик форми в додатку. Модуль MainUnit є новим, раніше невідомим, і Delphi в цьому випадку вказує також імя файлу з текстом модуля (in MainUnit.pas) і імя повязаного з модулем файлу опису форми {MainForm}.
Директива {$R *.res} – вказівка компілятору на необхідність підключення до програми так званого файлу ресурсів.
Власне тіло програми починається із слова begin і обмежується термінатором end з крапкою. Тіло складається з декількох операторів мови Object Pascal. В кожному операторі реалізується деяка дія – зміна значення змінної, аналіз результату обчислення, звернення до підпрограми і тому подібне. В тілі даної програми три виконувані оператори. Кожен з них реалізує звернення до одного з методів обєкту Application. Обєктом називається спеціальним чином оформлений фрагмент програми, що містить в собі дані і підпрограми для їх обробки. Дані називаються полями обєкту, а підпрограми – його методами. Обєкт в цілому призначений для вирішення якого-небудь конкретного завдання і сприймається в програмі як неподільне ціле. Обєкти грають надзвичайно важливу роль в сучасних мовах програмування. Вони придумані для того, щоб збільшити продуктивність праці програміста і одночасно підвищити якість програм, що розробляються ним. Дві головні властивості обєкту – функціональність і неподільність – роблять його самостійною частиною програми і дозволяють легко переносити обєкт з однієї програми в іншу. В обєкті Application зібрані дані і підпрограми, необхідні для нормального функціонування Windows-програми в цілому. Delphi автоматично створює обєкт-програму Application для кожного нового проекту.
Рядок “Application.Initialize;” означає звернення до методу Initialize обєкту Application. Прочитавши цей рядок, компілятор створить код, який змусить процесор перейти до виконання деякого фрагмента програми, написаного розробниками Delphi. Після виконання цього фрагмента управління процесором перейде до наступного рядка програми, в якій викликається метод CreateForm.
Оператор Application.CreateForm призначений для завантаження форми в память.
Викликом методу Run обєкту Application починається власне робота пркладної програми. Цей метод запускає цикл обробки повідомлення, на якому побудована робота програми, що завершується під час надходження повідомлення про закриття.
Структура модуля
Модулі – це програмні одиниці, призначені для розміщень фрагментів програм. За допомогою програмного коду, що міститься в них, реалізується вся поведінкова сторона програми. Будь-який модуль має наступну структуру: заголовок, секція інтерфейсних оголошень, секція реалізації, термінатор. Заголовок відкривається зарезервованим словом unit за яким слідує імя модуля і крапка з комою. Секція інтерфейсних оголошень відкривається зарезервованим словом Interface, а секція реалізації – словом implementation. Розділення модуля на дві секції забезпечує зручний механізм обміну алгоритмами між окремими частинами однієї програми. Термінатором модуля, як і термінатором програми, є end з крапкою. Вихідний текст програмних модулів приведений в лістингах Б.2 та Б.3 додатку Б.
У інтерфейсному розділі (interface) приводиться інформація про вміст програмного модуля, доступний для інших модулів і програм. Такою інформацією оголошені функції і процедури, визначені змінні, константи і типи.
Розділ реалізації (implementation) містить власне програмний код модуля. Всі оператори, поміщені в розділ реалізації, доступні тільки усередині даного програмного модуля. Для того, щоб дістати доступ до тих або інших елементів ззовні модуля, необхідно помістити відповідні оголошення в інтерфейсний розділ цього модуля. Типовим випадком організації програмного модуля є розміщення оголошення функції в розділі interface, а операторів цієї функції – в розділі implementation.
В операторі uses перераховуються модулі Object Pascal, які система Delphi повинна скомпоновати з даною програмою при створенні виконавчого файлу.
Зарезервоване слово type сповіщає компілятор про початок розділу опису типів. Будь-які дані, тобто константи, змінні, властивості, значення функцій або виразу, в Object Pascal характеризуються своїми типами. Тип визначає безліч допустимих значень, які може мати той або інший обєкт, а також безліч допустимих операцій, які застосовні до нього. Крім того, тип визначає також і формат внутрішнього представлення даних в памяті ПК.
Секції private і public визначають області видимості елементів опису класу. Класами в Object Pascal називаються спеціальні типи, які містять поля, методи і властивості. Секція public не накладає обмежень на область видимості перераховуваних в ній полів, методів і властивостей – їх можна викликати в будь-якому іншому модулі програми. Секція private звужує область видимості до мінімуму: закриті елементи опису доступні тільки усередині методів даного класу і підпрограмах, що знаходяться в тому ж модулі, де описаний клас. Елемент, оголошений в секції private, стає недоступним навіть найближчим нащадкам класу, якщо вони розміщуються в інших модулях.
Далі слідують автоматично створені заготовки Delphi для обробників подій.
Під ключовим словом implementation проекту знаходиться так звана директива $R. Вона повідомляє компілятор, що в проект потрібно включити ресурс Windows, вказаний в тексті директиви. Символ зірочки (*), використаний як імя файлу, означає, що імя файлу ресурсу співпадає з імям файлу проекту. Файл (.dfm) містить бінарне уявлення створеною за допомогою Form Designer форми.
Зарезервоване слово var визначає розділ оголошення змінних інтерфейсної секції.
Принцип роботи прикладних програм
При запуску програми “Server” на екрані адміністратора зявляється вікно представлене на рис.3.1. Програма-сервер (сервер) переходить в режим прослуховування. При запуску програми “Client” на екрані користувача зявляється вкладка “Interactive” вікна, що представлене на рис. 3.2. Програма-клієнт (клієнт) автоматично встановлює звязок з сервером. Для приймання списку доступних відеофайлів, клієнт посилає запит серверу, що супроводжується натисненням користувача кнопки “Send list request”. Після отримання запиту від клієнта, сервер автоматично посилає список доступних відеофайлів, який вказаний на панелі “Archive file content”. Отриманий список відображається на панелі “Available files list” клієнта. Вибраний користувачем файл поміщається в рядок вводу “Chosen file”. Для отримання вказаного файлу, клієнт посилає запит на сервер, що супроводжується натисненням користувача кнопки “Send videofile request”. Отримана назва файлу запиту від клієнта поміщається в рядок вводу “Request file” на сервері. Затвердивши запит, адміністратор натискає кнопку “Adopt”, після чого назва файлу відображається в рядку вводу “Send file”. Адміністратор може вручну вибрати файл, натиснувши кнопку “...”. Відправка файлу здійснюється після натиснення кнопки “Send”. Параметри передачі файлу відображаються на панелі угрупування компонентів “Send file parameters”. Користувач проглядає отриманий файл на відеопрогравачі, розміщеному на вкладці “Video player”, за допомогою кнопок управління “Play”,”Pause” і “Stop”.
Аналіз програмного коду
Початковий текст програмного коду прикладної програми “Server” приведений в розділі implementation, в лістингу Б.2 додатку Б. Початковий текст програмного коду програми “Client” приведений в розділі implementation, в лістингу Б.3 додатку Б.
Механізм взаємодії клієнта і сервера в Delphi заснований на використанні сокетного зєднання і подальшого обміну даними. Сокетом (socket) називається спеціальний обєкт, що створюється для відправки і отримання даних через мережу. Цей обєкт створюється усередині бібліотеки сокетів і володіє двома основними характеристиками: протоколом і адресою, до яких він привязаний. Формат адреси сокета визначається конкретним протоколом. Зокрема, для протоколів TCP і UDP адреса складається з IP-адреса мережевого інтерфейсу і номера порту.
У першій частині програми, коли між сервером і клієнтом відбувається обмін текстовими даними, комунікація реалізована через стек протоколів TCP/IP.
Перед тим, як передавати дані по протоколу TCP, необхідно встановити звязок між двома компютерами. Компютер, який ініціалізує цей звязок, називається клієнтом, а компютер, який повинен відгукнутися на ініціалізацію звязку для обміну даними, – сервером. Відповідно компоненти Delphi, які забезпечують комунікацію по протоколу TCP, розбиті на дві групи – клієнтські (ClientSocket) і серверні (ServerSocket). IP-адреса і номери портів вказані у відповідних властивостях компонентів, що приведені в додатку В.
При запуску програми “Server” відбувається виконання процедури: “procedure TMainForm.FormCreate(Sender: TObject);”. Рядок “ServerSocket1.Active:=true;” свідчить про активізацію серверного сокета 1 (ServerSocket1), який переходить в режим прослуховування, точніше – очікування запиту від клієнта. Не маючи методів ініціалізації звязку, сервер постійно опитує відповідний порт на предмет появи запиту від клієнта. Зміна властивості Active компоненту ServerSocket стартує або припиняє опит порту, зазаченого в його властивості Port.
Активізація клієнтського сокета 1 (ClientSocket1) відбувається по натисненню користувачем прграми “Client” кнопки “Send list request”. Компонент ClientSocket1 зєднується з сервером, адреса якого вказана у властивості Address, і через порт, вказаний у властивості Port. Після успішного встановлення звязку з сервером можна почати обмін даними між клієнтом і сервером. У клієнтській прикладній програмі буде викликано подію OnConnect. Обробником даної події є процедура: “procedure TMainForm. ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);”. Тіло процедури складається з рядка “Socket.SendText(s);”, виконання якої приводить до відправки змінної s рядкового типу методом SendText. Змінна s є запитом для отримання від сервера списку доступних відеофайлів.
На приймальній стороні, по прийняттю даних від клієнта, виконується подія OnClientRead серверного сокета 1, обробником якої є процедура: “procedure TMainForm.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);”. Тіло процедури починається аналізом команди, що прийшла, від клієнта. Якщо це буква s, означає клієнт просить прислати йому файл. Але перш ніж посилати дані, файл потрібно відкрити і завантажити. Для цього використовується обєкт файлового потоку (змінна fs типу TFileStream). Спочатку ця змінна ініціалізується: “fs:=TFileStream.Create(output.txt, fmOpenRead);”. Як параметри конструктора передається імя файлу і режим, в якому буде підключений файл. Текстовий файл з імям “output.txt” містить список доступних клієнтові відеофайлів. Прапор fmOpenRead визначає режим читання файлу. Після відкриття поточна позиція у файлі встановлюється в початок: “fs.Position:=0;”.
Для коректного прийому файлу на клієнтській стороні, в першу чергу відправляється розмір файлу за допомогою методу SendText: “Socket.SendText (Size:+IntToStr(fs.Size) + #0);”. На початку даних, що відправляються, стоїть слово “size:”, по якому клієнт дізнається, що висланий розмір файлу. Після цього йде сам розмір, перетворений в рядок. В самому кінці рядку додається нульовий символ #0, по якому клієнт зможе відокремити цю інформацію від даних самого файлу. Далі відправляється вибраний файл за допомогою методу Sendstream компонента Socket: “ Socket.SendStream(fs);”.
Обробником події OnRead компонента “ClientSocket1”, є процедура прийняття клієнтом висланого сервером файла: “procedure TMainForm.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);”. Умовно процедура розділена на дві частини. На самому початку зберігається прийнятий текст в змінній s: “s:= Socket.ReceiveText;”. Наступний шматок коду виконуватиметься, якщо змінна Reciving рівна true. Далі необхідно проаналізувати другу частину процедури.
Тут відбувається перевірка: якщо перші пять символів тексту, що прийшов, рівні слову “size:”, означає, що отриманий розмір файлу і повинен початися його прийом. Спочатку вирізається розмір і зберігається в текстовій змінній. Для цього копіюються з тексту, що прийшов, всі символи від шостого (після слова “size:”) і до символу #0: “sl:= copy( s, 6, Pos(#0, s ) - 6 ) ;”. Наступним рядком відбувається перетворення текстового представлення розміру в число і збереження його в змінній DataSize. Далі з тексту, що прийшов, видаляються всі символи до першого нульового символу #0, тобто видаляються інформація про розмір передаваного файлу. Змінна Reciving встановлюється рівною true. Ця змінна говорить про те, що почалася передача файлу. Дані приймаються пакетами розміром приблизно по 8 Кбайт. Щоб зберегти їх у файл, створюється файловий потік: “fs:=TFileStream.Create(output.txt,fmCreate);”. Як імя указується “output.txt”. Як прапор при відкритті файлу вказаний fmCreate, що примушує створити новий файл. Якщо такий файл вже існує, то він буде перезаписаний. Тепер необхідно повернутися до першої частини процедури.
Початок відбувається з перевірки: якщо змінна Reciving рівна true, значить, відбувається прийом даних, і отриманий черговий пакет файлу. Він зберігається тим же способом. Після цього відбувається порівняння: якщо розмір потоку рівний отриманому розміру файлу, то файл прийнятий повністю, і можна його закривати, вимикати змінну Reciving і виводити повідомлення про вдалий прийом. Отримані дані відображаються на панелі “Available files list ”: “FileListBox1.Items.LoadFromFile(Output.txt);”. Властивості використаних в програмі “Client” компонентів наведені в додатку Г.
Назва вибраного користувачем файлу поміщається в рядок введення “Chosen file” і відправляється на сервер натисненням кнопки “Send videofile request” (рис. 3). Обробником події для натиснення даної кнопки є процедура: “procedure TMainForm.Button3Click(Sender: TObject);”. У тілі процедури використаний метод SendText для відправки запиту клієнтським сокетом 2 (ClientSocket2), який активізувався при запуску програми “Client” процедурою: “procedure TMainForm.FormCreate(Sender: TObject);”.
Активізований при запуску програми серверний сокет 2 (ServerSocket2), приймає запит і поміщає дані в рядок вводу “Request file”. Це відбувається по виконанню обробника події OnClientRead компоненту ServerSocket2: “procedure TMainForm. ServerSocket2ClientRead(Sender: TObject; Socket: TCustomWinSocket);”. Властивості використаних в програмі “Server” компонентів наведені в додатку Д.
Рис. 3. Формування запиту клієнтом
Затвердивши запит, адміністратор натискає кнопку “Adopt”, після чого назва файлу відображається в рядку вводу “Send file”. Перед відправленням файл відкривається і завантажується у файловий потік ініціалізацією змінної fs типу TfileStream: “procedure TMainForm.Button1Click(Sender: TObject);”.
Унаслідок того, що протокол IP не підтримує широкомовну розсилку при використанні TCP, подальший процес передачі і прийому відеофайлу здійснюється за допомогою протоколу UDP. Програмно даний процес реалізований за допомогою Internet Direct (Indy) компонентів, що підтримують низькорівневу роботу як з сокетами, так і з найбільш загальними протоколами Інтернету. За основу узятий компонент IdUDPServer, який використовуються для підтримки мережевого протоколу UDP.
Активізований при запуску програми “Server” компонент IdUDPServer починає процес передачі відеофайлу при натисненні адміністратором кнопки “Send” (рис. 4).
Рис.4. Процес відправлення відеофайлу
Обробником події на натиснення кнопки є процедура: “procedure TMainForm.SendBtnClick(Sender: TObject);”, яка перевіряє існування вказаного файлу. У разі позитивного результату перевірки, файл відкривається і завантажується в потік. Подальше управління передачею файлу указується процедурі: “procedure SendProcedure(FStream: TFileStream; UDPServer: TIdUDPServer; StatusLabel :Tlabel; ProgressBar :TProgressBar);”. Компонент IdUDPServer в першу чергу посилає значення кількості пакетів файлу, що відправляються, за допомогою методу Send. Далі запускається цикл передачі файлу UDP пакетами розміром приблизно по 40 Кбайт за допомогою методу Send Buffer компоненту IdUDPServer.
Кожен пакет, відправлений за допомогою UDP, складає одну дейтаграму. Отримані дейтаграми складаються в буфер приймаючого сокета і можуть бути отримані тільки роздільно: за одну операцію читання з буфера програма, що використовує сокет, може отримати тільки одну дейтаграму. Якщо в буфері лежить декілька дейтаграм, буде потрібно декілька операцій читання, щоб прочитати все. Крім того, одну дейтаграму не можна отримати з буфера по частинах: вона повинна бути прочитана цілком за одну операцію. Прийом UDP пакетів на користувальницькій стороні забезпечує клієнтський компонент IdUDPServer.
При активації, клієнтський IdUDPServer створює слухаючий потік для вхідних пакетів UDP. Для кожного прийнятого пакету UDP IdUDPServer збуджує подію OnUDPRead в головному кодовому потоці. Обробником даної події є процедура: “procedure TMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);”. Після прийому значення розміру передаваного файлу, створюється файловий потік. UDP пакети приймаються, потік звільняється.
Прийнятий відеофайл відтворюється відеопрогравачем, розташованому на вкладці “Video player” клієнтської прикладної програми (рис. 5). Дане завдання виконується за допомогою динамічної бібліотеки Microsoft Multimedia Extensions для Windows (MMSYSTEM.DLL), методи якої інкапсульовані в компоненті TMediaPlayer. Блок-схема сумісного функціонування обох програм наведена в додатку Е.
Рис.5. Процес відтворення відеофайлу
Висновки
В результаті проведення порівняльного аналізу програмних засобів розробки систем “клієнт-сервер”, для практичної реалізації прикладних програм, вибрана мова обєктно-орієнтованого програмування Delphi. Розроблені програми демонструють основні концепції функціонування системи IP-телебачення на базі архітектури “клієнт-сервер”. Клієнтська прикладна програма “Client” виконує функції ініціалізатора звязку і відправника запитів. Програма “Server” виконує функції прослуховування та передачі необхідних даних відповідно до запиту на клієнтську сторону. Процеси комутації забезпечують інструментальні засоби Delphi за допомогою Internet і Internet Direct компонентів, що підтримують низькорівневу роботу як з сокетами, так і з найбільш загальними протоколами Інтернету.