You are on page 1of 27

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

СХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТ


імені ВОЛОДИМИРА ДАЛЯ

Факультет інформаційних технологій та електроніки


Кафедра комп’ютерних наук та інженерії
Освітньо-кваліфікаційний рівень бакалавр
Напрям підготовки
(шифр і назва)

Спеціальність 123 «Комп'ютерна інженерія»


(шифр і назва)

КУРСОВИЙ ПРОЕКТ (РОБОТА)


З дисципліни: Системне програмне забезпечення
(назва дисципліни)

на тему: Розроблення програмних додатків за технологією «клієнт-сервер».


Метод комунікації – сокети.
студента 3 курсу , групи КІ-17д
спеціальності 123 «Комп'ютерна інженерія»
(шифр і назва спеціальності)

Гордiйчук Ю.С.
(прізвище та ініціали) (підпис)

Керівник проекту
ст. викл. Деркач М.В.
(посада, вчене звання, науковий ступінь, прізвище та ініціали) (підпис)

Результати захисту:
Національна шкала _______
Кількість балів: __________
Оцінка: ECTS ___________

Члени комісії:
_________________________ ________
(прізвище та ініціали) (підпис)

________________________ ________
(прізвище та ініціали) (підпис)

_________________________ ________
(прізвище та ініціали) (підпис)

Дата_________

Сєвєродонецьк – 2019
2

Східноукраїнський національний університет


імені Володимира Даля

Факультет ІТЕ . Кафедра КНІ .


Спеціальність 123 Комп’ютерна інженерія
ЗАТВЕРДЖУЮ:
Зав. кафедри
КНІ________________
І.С.Скарга-Бандурова
«____________»_________________
20 р.

ЗАВДАННЯ
НА КУРСОВУ РОБОТУ
Гордiйчук Юрiй Сергiйович
(прізвище, ім'я, по батькові)
1. Тема проекту (роботи) Розроблення програмних додатків за технологією
«клієнт-сервер». Метод комунікації – сокети.
затверджена наказом по інституту від « » 2018 р. № .
2. Термін подання студентом закінченого проекту (роботи) до 22.12.2019__
3. Вихідні дані до проекту (роботи) Розробити окремі додатки: додаток-
сервер і два додатки-клієнти. Функції додатку-серверу:а) створення сокетів;
б) отримання даних від додатків-клієнтів; в) вивід на екран отриманих даних.
Функції додатку-клієнту 1: а) відкрити сокет; б)встановити зв'язок с
сервером; в) підготувати і передати серверу такі дані: розмір файла підкачки
у байтах; кількість вільних байтів у файлі підкачки. Функції додатку-клієнту
2: а) відкрити сокет; б)встановити зв'язок с сервером; в)підготувати і
передати серверу такі дані: ширина й висота іконки додатку, ширина й
висота вертикальної полоси прокрутки. За необхідності синхронізації
процесів вибраний засіб синхронізації обґрунтувати. Налаштування
проводити на локальному комп’ютері.
4. Зміст розрахунково-пояснювальної записки (перелік питань, які потрібно
розробити) структура та оформлення пояснювальної записки повинна
відповідати вимогам методичних вказівок до курсової роботи і ДСТУ.
Основна частина записки повинна вміщувати: постановку задачі; короткі
теоретичні відомості з теми курсової роботи (сутність, область застосування,
переваги и недоліки архітектури «клієнт-сервер»; огляд методу комунікації
через відображення файлу у пам'ять); розробку та опис алгоритму роботи
додатків; результати застосування додатків у вигляді копій екрану. У додатку
до записки навести роздруківку програмних додатків.
5. Перелік графічного матеріалу (з точною вказівкою обов'язкових креслень)
графічні матеріали до курсової роботи не вимагаються
6. Дата видачі завдання
3

КАЛЕНДАРНИЙ ПЛАН

№ Назва етапів курсового проектування Строк Примітка


з/п виконання
етапів
1 Підготовчий етап. Уточнення постановки 10.10.2019 –
задачі. Аналітичний огляд науково-технічної 31.10.2019
літератури
2 Проектний етап. Розроблення алгоритмів 26.10.2019 –
роботи програми. Обґрунтування необхідності і 15.11.2019
вибір засобів синхронізації.
3 Реалізаційний етап. Реалізація розроблених 10.11.2019 –
алгоритмів засобами вибраної мови 30.11.2019
програмування, остаточне налагодження
4 Оформлювальний етап. Оформлення 01.12.2019 –
пояснювальної записки відповідно до вимог 07.12.2019
методичних вказівок і ДСТУ
5 Заключний етап. Захист курсової роботи. до
22.12.2019

Студент _________ Гордiйчук Ю.С.


( підпис ) (прізвище та ініціали)

Керівник проекту (роботи) _________ ст. викл. Деркач М.В.


( підпис ) (прізвище та ініціали)
4

РЕФЕРАТ

Пояснювальна записка містить: сторінки 27, ілюстрацій 11 , таблиці 1,


додатки 3.
Мета роботи: розробка додатків за технологією «клієнт-сервер» для
дослідження взаємодії між процесами через сокети.
В роботі розроблено 3 додатка на платформі Win32 в середовищі
Microsoft Visual Studio, що використовують для взаємодії між процесами
сокети. Додаток-сервер реалізує виконання таких функцій: створення сокетів,
отримання даних від програм-клієнтів, висновок отриманих даних на екран.
Додатки-клієнти реалізують виконання таких функцій: відкриття сокета,
установка зв'язку з сервером, підготовка і передача даних відповідно до
завдання.
Додатки розроблені на основі мови С ++ і базових функцій Win32 API.
Виконано визначення області застосування, переваг і недоліків
архітектури «клієнт-сервер»; зроблено огляд системних засобів комунікації і
синхронізації процесів.
WIN32 API, сокети, ПРОЦЕСИ, ПОДІЇ, ПОРТ, СИНХРОНІЗАЦІЯ
ПРОЦЕСІВ, АЛГОРИТМ, ПРОГРАМА.
5

Зміст

ВСТУП…………………………………………………………………. 6
1. Основна частина……………………………………………………. 7
1.1 Постановка завдання………………………………………………. 7
1.2 Короткі теоретичні основи розроблюваної теми………………… 7
1.3 сокети Windows..…………………………………………………….9
1.4 Порти……………………………………………………………….. 10
1.5 Потокові сокети (stream socket)……………………………………11
1.6 Клас Socket………………………………………………………… 12
2. Розробка і опис роботи………………………………………………14
2.1 Сервер ТСР………………………………………………………… 14
2.2 Клієнт на TCP……………………………………………………… 18
Висновок……………………………………………………………….. 19
Список використаних джерел………………………………………… 20
3. Додатки……………………………………………………………… 21
3.1 Додаток А……………………………………………………………21
3.2 Додаток Б…………………………………………………………….23
6

ВСТУП
Клієнт - серверні додатки - це додатки, засновані на мережевій
архітектурі різної зв'язності, що з'єднує для виконання прикладних завдань
різні пристрої, кожне з пристроїв може виконувати роль клієнта або сервера.
Клієнт-серверні додатки активно застосовуються в бізнесі, на підприємствах
та інших організаціях для забезпечення робочого процесу, наділення
співробітників зручними робочими інструментами, і, як наслідок,
підвищення віддачі від праці.
Рано чи пізно може настати момент, коли єдиним варіантом для
подальшого розвитку автоматизованих систем управління підприємством
стане архітектура клієнт-сервер. Архітектура клієнт-сервер стає життєво
необхідною, коли число користувачів одночасно активно користуються
одними і тими ж даними перевищує 10-15 чоловік. Якщо перед
підприємством постає завдання побудови системи, в яких число місць,
одночасно активно працюють з даними, перевищує 20, практично єдиним
варіантом для нього є клієнт-сервер.
В роботі розроблено 3 додатка, додаток-сервер і 2 програми-клієнта,
реалізованих на мові С ++ з використанням базових функцій Win32 API. С ++
- це мова програмування, який був розроблений для забезпечення глибокого і
детального контролю процесу розробки. Win32 API - набір базових функцій
інтерфейсів програмування додатків операційних систем сімейств Microsoft
Windows корпорації «Майкрософт». Додатки створені в Microsoft Visual
Studio 2010 Professional. Microsoft Visual Studio - лінійка продуктів компанії
Майкрософт, що включають інтегроване середовище розробки програмного
забезпечення і ряд інших інструментальних засобів.
7

1. Основна частина
1.1 Постановка завдання
Відповідно до завдання потрібно розробити 3 окремих додатки.
Додаток-сервер має виконувати такі функції: створення сокетів, отримання
даних від програм-клієнтів, висновок на екран отриманих даних. Додаток-
клієнт 1 має виконувати такі функції: відкриття сокета, установка зв'язку з
сервером, підготовка і передача сервера таких даних: системні кольори 2-х
елементів вікна програми, код розкладки клавіатури. Додаток-клієнт 1 має
виконувати такі функції відкриття сокета, установка зв'язку з сервером,
підготовка і передача сервера таких даних: ідентифікатор поточного процесу,
дескриптор поточного процесу. Додатки повинні бать розроблені за
технологією «клієнт-сервер». Метод комунікації між процесами - сокети.
1.2 Короткі теоретичні основи розроблюваної теми
Моделі клієнт-сервер - це технологія взаємодії в інформаційній мережі.
Сервер має право керування тим чи іншим ресурсом, а клієнт - користування
ним. Поняття "клієнт" і "сервер" описують лише розподіл ролей при
виконанні конкретного завдання, але не якісь окремі види комп'ютерів або
програм. На одному і тому ж комп'ютері можуть одночасно працювати
програми, які виконують як клієнтські, так і серверні функції.
Кожен конкретний сервер визначається видом того ресурсу, яким він
володіє. Цей принцип поширюється і на взаємодію програм. Програма, що
виконує надання відповідного набору послуг, розглядається в якості сервера,
а програми, які користуються цими послугами, прийнято називати клієнтами.
Програми мають розподілений характер, тобто одна частина функцій
прикладної програми реалізується в програмі-клієнті, а інша - в програмі-
сервері, а для їх взаємодії визначається деякий протокол. Програма клієнт
взаємодіє з сервером, використовуючи певний протокол, який встановлює
правила обміну даними. Клієнт може запитувати з сервера будь-які
документи, маніпулювати даними безпосередньо на сервері, запускати на
ньому нові програми і т. П. Отримані від сервера дані клієнт може надавати
8

користувачеві або формувати на їх основі новий запит. Клієнт і сервер


можуть працювати як на одному і тому ж комп'ютері, так і на різних. У
другому випадку для обміну інформацією між ними використовується
мережеве з'єднання.
Стандартні клієнт-серверні додатки за своєю архітектурою є
дворівневими. Компоненти, що відповідають за презентаційний сервіс і
прикладну логіку, розміщуються на клієнтської машині і звертаються до
загального джерела даних по мережі. У таких додатках призначений для
користувача інтерфейс і прикладна логіка утворюють один рівень на
клієнтському комп'ютері, а сервіси даних надаються окремими додатками.
Дворівневі додатка добре працюють в масштабах підрозділу при наявності
помірної кількості користувачів (до 100) і швидкодіючої захищеної мережі.
Налагодження додатків клієнт-сервер можливо виробляти на локальному
комп'ютері.
Переваги клієнт-серверної архітектури:
 уможливлює, в більшості випадків, розподіл функцій
обчислювальної системи між декількома незалежними
комп'ютерами в мережі. Це дозволяє спростити обслуговування
обчислювальної системи. Зокрема, заміна, ремонт, модернізація
або переміщення сервера не зачіпають клієнтів;
 всі дані зберігаються на сервері, який, як правило, захищений
набагато краще за більшість клієнтів. На сервері простіше
забезпечити контроль повноважень, щоб вирішувати доступ до
даних тільки клієнтам з відповідними правами доступу;
 дозволяє об'єднати різні клієнти. Використовувати ресурси одного
сервера часто можуть клієнти з різними апаратними платформами,
операційними системами і т. П.
 Недоліки клієнт-серверної архітектури:
 непрацездатність сервера може зробити непрацездатною всю
обчислювальну мережу;
9

 підтримка роботи даної системи вимагає окремого фахівця -


системного адміністратора;
 висока вартість обладнання.
1.3 сокети Windows
Windows Sockets API (WSA), назва якого була укорочена до Winsock. Це
технічна специфікація, яка визначає, як мережеве програмне забезпечення
Windows буде отримувати доступ до мережевих сервісів, в тому числі, TCP /
IP. Він визначає стандартний інтерфейс між клієнтським додатком (таким як
FTP-клієнт або веб-браузер) і зовнішнім стеком протоколів TCP / IP. Він
ґрунтується на API моделі сокетов Берклі, що використовується в BSD для
установки з'єднання між програмами.
Є дві версії WinSock
 WinSock 1.1 - підтримка тільки TCP / IP
 WinSock 2.0 - поддерку додаткового програмного забезпечення
Специфікація WinSock розділяє функції на три типи:
 функції Берклі;
 інформаційні функції (отримання інформації про найменування
доменів, службах, протоколах Internet);
 розширення Windows для функцій Берклі;
Всі функції можуть бути блокуючі і неблокірующіх. Зазвичай блокують
це функції Берклі. Тобто при роботі такої функції не можна виконувати інші
функції WinSock.
Давайте розглянемо як здійснюється підключення до сервера. Спочатку
програма підключається до адресою IP зі створенням сокета. Програма буде
чекати підключення. Для підключення програма клієнт теж створює сокет і
намагається підключитися до сокету сервера. Тільки він побачить спробу
підключення він створить новий сокет. І цей новий сокет буде
використовуватися для взаємодії з клієнтом. А той, до якого була спроба
підключення буде чекати наступного. На цій основі проводиться взаємодія
сервера і багатьма програмами.
10

Сам сокет може бути створений на основі:


 TCP (transport control protocol) - надійне з'єднання;
 UDP (user datagram protocol) - ненадійне з'єднання.
1.4 Порти
Порт визначено, щоб вирішити завдання одночасної взаємодії з
декількома додатками. По суті з його допомогою розширюється поняття IP-
адреси. Комп'ютер, на якому в свій час виконується кілька додатків,
отримуючи пакет з мережі, може ідентифікувати цільової процес,
користуючись унікальним номером порту, певним при встановленні
з'єднання.
Сокет складається з IP-адреси машини і номера порту, що
використовується додатком TCP. Оскільки IP-адреса унікальний в Інтернеті,
а номери портів унікальні на окремій машині, номери сокетів також унікальні
в усьому Інтернеті. Ця характеристика дозволяє процесу спілкуватися через
мережу з іншим процесом виключно на підставі номера сокета.
За певними службами номера портів зарезервовані - це широко відомі
номери портів, наприклад порт 21, що використовується в FTP. Ваша
програма може користуватися будь-яким номером порту, який не був
зарезервований і поки не зайнятий. Агентство Internet Assigned Numbers
Authority (IANA) веде перелік широко відомих номерів портів.
Зазвичай додаток клієнт-сервер, що використовує сокети, складається з
двох різних додатків - клієнта, який ініціює з'єднання з метою (сервером), і
сервера, що очікує з'єднання від клієнта.
Наприклад, на стороні клієнта, додаток повинен знати адресу цілі і
номер порту. Відправляючи запит на з'єднання, клієнт намагається
встановити з'єднання з сервером:
Запит клієнта серверу

Рисунок 1.1 - Запит клієнта серверу


11

Якщо події розвиваються вдало, за умови що сервер запущений раніше,


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

Рисунок 1.2 - Взаємодія клієнта і сервера


Тепер клієнт і сервер можуть взаємодіяти між собою, зчитуючи
повідомлення кожен зі свого сокета і, відповідно, записуючи повідомлення.
1.5 Потокові сокети (stream socket)
Потоковий сокет - це сокет з встановленим з'єднанням, що складається з
потоку байтів, який може бути двонаправленим, т, е. Через цю кінцеву точку
додаток може і передавати, і отримувати дані.
Потоковий сокет гарантує виправлення помилок, обробляє доставку і
зберігає послідовність даних. На нього можна покластися в доставці
упорядкованих, сдублірованние даних. Потоковий сокет також підходить для
передачі великих обсягів даних, оскільки накладні витрати, пов'язані з
встановленням окремого з'єднання для кожного повідомлення, що
відправляється, може виявитися неприйнятним для невеликих обсягів даних.
Потокові сокети досягають цього рівня якості за рахунок використання
протоколу Transmission Control Protocol (TCP). TCP забезпечує надходження
даних на іншу сторону в потрібній послідовності і без помилок.
12

Для цього типу сокетів шлях формується до початку передачі


повідомлень. Тим самим гарантується, що обидві що у взаємодії сторони
приймають і відповідають. Якщо додаток відправляє одержувачу два
повідомлення, то гарантується, що ці повідомлення будуть отримані в тій же
послідовності.
Однак, окремі повідомлення можуть дробитися на пакети, і способу
визначити межі записів не існує. При використанні TCP цей протокол бере на
себе розбиття переданих даних на пакети відповідного розміру, відправку їх
в мережу і складання їх на іншій стороні. Додаток знає тільки, що воно
відправляє на рівень TCP певне число байтів і інша сторона отримує ці байти.
У свою чергу TCP ефективно розбиває ці дані на пакети відповідного
розміру, отримує ці пакети на іншій стороні, виділяє з них дані і об'єднує їх
разом.
Потоки базуються на явних з'єднаннях: сокет А запитує з'єднання з
сокетом В, а сокет В або погоджується із запитом на встановлення з'єднання,
або відкидає його.
Якщо дані повинні гарантовано доставлятися іншій стороні або розмір їх
великий, потокові сокети краще дейтаграмним. Отже, якщо надійність зв'язку
між двома додатками має першорядне значення, вибирайте потокові сокети.
Сервер електронної пошти являє приклад програми, яка повинна
доставляти зміст в правильному порядку, без дублювання і пропусків.
Потоковий сокет розраховує, що TCP забезпечить доставку повідомлень по їх
призначень.
1.6 Клас Socket
Клас Socket грає важливу роль в мережевому програмуванні,
забезпечуючи функціонування як клієнта, так і сервера. Головним чином,
виклики методів цього класу виконують необхідні перевірки, пов'язані з
безпекою, в тому числі перевіряють дозволу системи безпеки, після чого
вони переправляються до аналогам цих методів в Windows Sockets API.
13

Перш ніж звертатися до прикладу використання класу Socket,


розглянемо деякі важливі властивості і методи цього класу:

Властивості і методи Опис


AddressFamily Дає сімейство адрес сокета - значення з
перерахування Socket.AddressFamily.
Available Повертає обсяг доступних для читання даних.
Blocking Дає або встановлює значення, що показує, чи
знаходиться сокет в блокує режимі.
Connected Повертає значення, що інформує, з'єднаний чи
сокет з віддаленим хостом.
LocalEndPoint Дає локальну кінцеву точку.
ProtocolType Дає тип протоколу сокета.
RemoteEndPoint Дає віддалену кінцеву точку сокета.
SocketType Дає тип сокета.
Accept () Створює новий сокет для обробки вхідного запиту
на з'єднання.
Bind () Пов'язує сокет з локальною кінцевою точкою для
очікування вхідних запитів на з'єднання.
Close () Змушує сокет закритися.
Connect () Встановлює з'єднання з віддаленим хостом.
GetSocketOption () Повертає значення SocketOption.
IOControl () Встановлює для сокета низькорівневі режими
роботи. Цей метод забезпечує низькорівневий
доступ до лежачого в основі класу Socket.
Listen () поміщає сокет в режим прослуховування
(очікування). Цей метод призначений тільки для
серверних додатків.
Receive () Отримує дані від сполученого сокета.
14

Poll () Визначає статус сокета.


Select () Перевіряє статус одного або декількох сокетов.
Send () Відправляє дані з'єднаному сокету.
SetSocketOption () Встановлює опцію сокета.
Shutdown () Забороняє операції відправки та отримання даних
на сокеті.
Табл.1.1 - Властивості і методи класу Socket
15

2. Розробка і опис роботи


Побудуємо завершене додаток, що включає клієнт і сервер. Спочатку
демонструємо, як сконструювати на потокових сокетах TCP сервер, а потім
клієнтську програму для тестування нашого сервера.
Наступна програма створює сервер, який отримує запити на з'єднання
від клієнтів. Сервер побудований синхронно, отже, виконання потоку
блокується, поки сервер не дасть згоди на з'єднання з клієнтом. Ця програма
демонструє простий сервер, який відповідає клієнту. Клієнт завершує
з'єднання, відправляючи сервера повідомлення <TheEnd>.
2.1 Сервер ТСР
Створення структури сервера показано на наступній функціональної
діаграмі:

Рисунок 1.3 - структура сервера


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

підготувати для нього адресу локальної кінцевої точки. Унікальний адресу


для обслуговування TCP / IP визначається комбінацією IP-адреси хоста з
номером порту обслуговування, яка створює кінцеву точку для
обслуговування.
Клас Dns надає методи, які повертають інформацію про мережеві
адреси, підтримуваних пристроєм в локальній мережі. Якщо у пристрої
локальної мережі є більше одного мережевого адреси, клас Dns повертає
інформацію про всі мережевих адресах, і додаток повинен вибрати з масиву
відповідну адресу для обслуговування.
Створимо IPEndPoint для сервера, комбінуючи перший IP-адреса хост-
комп'ютера, отриманий від методу Dns.Resolve (), з номером порту:
IPHostEntry ipHost = Dns.GetHostEntry("localhost");

IPAddress ipAddr = ipHost.AddressList[0];

IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

Рисунок 1.4 - IPEndPoint для сервера


Тут клас IPEndPoint представляє localhost на порту 11000. Далі новим
екземпляром класу Socket створюємо потоковий сокет. Встановивши
локальну кінцеву точку для очікування з'єднань, можна створити сокет:
Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, P
rotocolType.Tcp);

Рисунок 1.5 - створюємо потоковий сокет


Перерахування AddressFamily вказує схеми адресації, які екземпляр
класу Socket може використовувати для вирішення адреси.
У параметрі SocketType розрізняються сокети TCP і UDP. У ньому
можна визначити в тому числі такі значення:
 Dgram
Підтримує дейтаграми. Значення Dgram вимагає вказати Udp для типу
протоколу і InterNetwork в параметрі сімейства адрес.
17

 Raw
Підтримує доступ до базового транспортного протоколу.
 Stream
Підтримує потокові сокети. Значення Stream вимагає вказати Tcp для
типу протоколу.
Третій і останній параметр визначає тип протоколу, необхідний для
сокета. У параметрі РrotocolType можна вказати наступні найбільш важливі
значення - Tcp, Udp, Ip, Raw.
Наступним кроком має бути призначення сокета за допомогою методу
Bind (). Коли сокет відкривається конструктором, йому не призначається ім'я,
а тільки резервується дескриптор. Для призначення імені сокету сервера
викликається метод Bind (). Щоб сокет клієнта міг ідентифікувати потоковий
сокет TCP, серверна програма повинна дати ім'я своєму сокету:
sListener.Bind(ipEndPoint);

Рисунок 1.6 - призначення імені сокету


Метод Bind () пов'язує сокет з локальною кінцевою точкою. Викликати
метод Bind () треба до будь-яких спроб звернення до методів Listen () і Accept
().
Тепер, створивши сокет і зв'язавши з ним ім'я, можна слухати вхідні
повідомлення, скориставшись методом Listen (). У стані прослуховування
сокет чекатиме входять спроби з'єднання:
sListener.Listen(10);

Рисунок 1.7 - сокет і зв'язавши з ним ім'я


У параметрі визначається заділ (backlog), який вказує максимальне
число з'єднань, які очікують обробки в черзі. У наведеному коді значення
параметра допускає накопичення в черзі до десяти з'єднань.
У стані прослуховування треба бути готовим дати згоду на з'єднання з
клієнтом, для чого використовується метод Accept (). За допомогою цього
методу виходить з'єднання клієнта і завершується встановлення зв'язку імен
18

клієнта і сервера. Метод Accept () блокує потік викликає програми до


надходження сполуки.
Метод Accept () витягує з черги чекають запитів перший запит на
з'єднання і створює для його обробки новий сокет. Хоча новий сокет
створений, початковий сокет продовжує слухати і може використовуватися з
багатопотокової обробкою для прийому декількох запитів на з'єднання від
клієнтів. Ніяке серверний додаток не повинно закривати слухає сокет. Він
повинен продовжувати працювати поряд з сокетами, створеними методом
Accept для обробки вхідних запитів клієнтів.
while (true)

Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);

// Программа приостанавливается, ожидая входящее соединение

Socket handler = sListener.Accept();

Рисунок 1.8 - створеними методом Accept


Як тільки клієнт і сервер встановили між собою з'єднання, можна
відправляти і отримувати повідомлення, використовуючи методи Send () і
Receive () класу Socket.
Метод Send () записує вихідні дані сокету, з яким встановлено з'єднання.
Метод Receive () зчитує вхідні дані в потоковий сокет. При використанні
системи, заснованої на TCP, перед виконанням методів Send () і Receive ()
між сокетами має бути встановлено з'єднання. Точний протокол між двома
взаємодіючими сутностями повинен бути визначений завчасно, щоб
клієнтське і серверне додатки не блокували один одного, не знаючи, хто
повинен відправити свої дані першим.
Коли обмін даними між сервером і клієнтом завершується, потрібно
закрити з'єднання використовуючи методи Shutdown () і Close ():
19

handler.Shutdown(SocketShutdown.Both);

handler.Close();

Рисунок 1.9 - обмін даними між сервером і клієнтом


SocketShutdown - це перерахування, що містить три значення для
зупинки: Both - зупиняє відправку та отримання даних сокетом, Receive -
зупиняє отримання даних сокетом і Send - зупиняє відправку даних сокетом.
Сокет закривається при виклику методу Close (), який також встановлює
у властивості Connected сокета значення false.
2.2 Клієнт на TCP
Функції, які використовуються для створення програми-клієнта, більш-
менш нагадують серверний додаток. Як і для сервера, використовуються ті ж
методи для визначення кінцевої точки, створення екземпляра сокета,
відправки та отримання даних та закриття сокета:

Рисунок 1.10 - отримання даних


20

Єдиний новий метод - метод Connect (), використовується для з'єднання


з віддаленим сервером. На малюнку нижче показані клієнт і сервер в дії:

Рисунок 1.11 - клієнт і сервер в дії


21

Висновок
Метою даної курсової роботи була розробка додатків архітектури
"клієнт-сервер". Розроблені програми включають: додаток, що виконує
функції сервера і два додатки, які виконують функції клієнтів.
По закінченню виконання роботи, розроблені програми були перевірені
на практиці і повністю підтвердили свою працездатність. Були проведені
необхідні дослідження і складені схеми алгоритмів до основних модулів
додатків.
Відповідно до даної технології, клієнт запитує у сервера деякі послуги,
надаючи певні вихідні дані і параметри за допомогою одного з методів
комунікації між потоками, а сервер обслуговує запит.
Можна зробити висновок, що поставлена задача була досягнута,
завдання на курсовий проект було виконано.
22

Список використаних джерел


1. Демройк М.Ю. Почала програмування. Розподілені системи, безпеку
схем програмування. - М .: ТОВ "Біном-Пресс", 2009. - 704 с. - С.143.
2. Джонсон М. Системне програмування в середовищі Win32, 2-е вид .:
Пер. з англ. - M .: Видавничий дім "Вільямс", 2001. - 464 с. - с.346.
Документація Win32 API (MSDN).
3. Пітер Блюм, LabVIEW. Стиль програмування, М: "ДМК Прес", 2008.
4. Ріхтер Дж. Windows для професіоналів: створення ефективних Win32
додатків з урахуванням специфіки 64-розрядної версії Windows, 4-е изд .:
Пер, англ - СПб: Пітер; М .: Видавничо-торговий дім "Російська Редакція",
2001. - 752 с. - С.578.
5. Страуструп Б. Мова програмування С ++. Спеціальне видання. Пер. з
англ. - М .: ТОВ "І.Д. Вільямс", 2007. - 1104 с.
6. Сурані А.Я., LabVIEW 8.20., Довідник по функціям, М: "ДМК Прес",
2007.
7. http://www.rsdn.ru/article/baseserv/mt.xml
8. http://vunivere.ru/work11218
23

3. ДОДАТКИ
3.1 Додаток А
// SocketServer.cs
1. using System;
2. using System.Text;
3. using System.Net;
4. using System.Net.Sockets;
5. namespace SocketServer
6. {
7. class Program
8. {
9. static void Main(string[] args)
10. {
11. // Устанавливаем для сокета локальную конечную точку
12. IPHostEntry ipHost = Dns.GetHostEntry("localhost");
13. IPAddress ipAddr = ipHost.AddressList[0];
14. IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
15. // Создаем сокет Tcp/Ip
16. Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
17. // Назначаем сокет локальной конечной точке и слушаем входящие
сокеты
18. try
19. {
20. sListener.Bind(ipEndPoint);
21. sListener.Listen(10);
22. // Начинаем слушать соединения
23. while (true)
24. {
25. Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);
24

26. // Программа приостанавливается, ожидая входящее соединение


27. Socket handler = sListener.Accept();
28. string data = null;
29. // Мы дождались клиента, пытающегося с нами соединиться
30. byte[] bytes = new byte[1024];
31. int bytesRec = handler.Receive(bytes);
32. data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
33. // Показываем данные на консоли
34. Console.Write("Полученный текст: " + data + "\n\n");
35. // Отправляем ответ клиенту\
36. string reply = "Спасибо за запрос в " + data.Length.ToString()
37. + " символов";
38. byte[] msg = Encoding.UTF8.GetBytes(reply);
39. handler.Send(msg);
40. if (data.IndexOf("<TheEnd>") > -1)
41. {
42. Console.WriteLine("Сервер завершил соединение с клиентом.");
43. break;
44. }
45. handler.Shutdown(SocketShutdown.Both);
46. handler.Close();
47. }
48. }
49. catch (Exception ex)
50. {
51. Console.WriteLine(ex.ToString());
52. }
53. finally
54. {
25

55. Console.ReadLine();
56. }
57. }
58. }
59. }
3.2 Додаток Б
// SocketClient.cs
1. using System;
2. using System.Text;
3. using System.Net;
4. using System.Net.Sockets;
5. namespace SocketClient
6. {
7. class Program
8. {
9. static void Main(string[] args)
10.{
11.try
12.{
13.SendMessageFromSocket(11000);
14.}
15.catch (Exception ex)
16.{
17.Console.WriteLine(ex.ToString());
18.}
19.finally
20.{
21.Console.ReadLine();
22.}
23.}
26

24.static void SendMessageFromSocket(int port)


25.{
26.// Буфер для входящих данных
27.byte[] bytes = new byte[1024];
28.// Соединяемся с удаленным устройством
29.// Устанавливаем удаленную точку для сокета
30.IPHostEntry ipHost = Dns.GetHostEntry("localhost");
31.IPAddress ipAddr = ipHost.AddressList[0];
32.IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
33.Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
34.// Соединяем сокет с удаленной точкой
35.sender.Connect(ipEndPoint);
36.Console.Write("Введите сообщение: ");
37.string message = Console.ReadLine();
38.Console.WriteLine("Сокет соединяется с {0} ",
sender.RemoteEndPoint.ToString());
39.byte[] msg = Encoding.UTF8.GetBytes(message);
40.// Отправляем данные через сокет
41.int bytesSent = sender.Send(msg);
42.// Получаем ответ от сервера
43.int bytesRec = sender.Receive(bytes);
44.Console.WriteLine("\nОтвет от сервера: {0}\n\n",
Encoding.UTF8.GetString(bytes, 0, bytesRec));
45.// Используем рекурсию для неоднократного вызова
SendMessageFromSocket()
46.if (message.IndexOf("<TheEnd>") == -1)
47.SendMessageFromSocket(port);
48.// Освобождаем сокет
49.sender.Shutdown(SocketShutdown.Both);
27

50.sender.Close();
51.}
52.}
53.}

You might also like