Смекни!
smekni.com

Програмна реалізація системи IP-телебачення на базі архітектури "клієнт-сервер" (стр. 3 из 3)

Активізація клієнтського сокета 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 компонентів, що підтримують низькорівневу роботу як з сокетами, так і з найбільш загальними протоколами Інтернету.