Нотатки программістера http в java


Нотатки программістера http в java
Сучасні фреймворки досить добре абстраговані від низькорівневих деталей власної реалізації. З одного боку це добре - спрощує нам життя, але з іншого боку не дає нам зайвого приводу дізнатися фундаментальні речі. Це справедливо для величезної кількості питань і областей інформаційних технологій, але в цьому циклі статей йтиметься про протокол http (часто приховують за JSP, JSF і ін.) І способах його використання в Java.

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

Перше, що треба зрозуміти - це способи взаємодії клієнта і сервера. Як вони один одного знаходять, і як обмінюються даними. Для цього давайте згадаємо молодші курси університету та освіжимо свої знання про мережевих протоколах. Якщо абревіатури OSI і TCP / IP не вводять вас в глухий кут, сміливо гортайте далі. Для тих же, хто намагається не захаращувати голову деталями, справедливо покладаючись на їх доступність в Інтернеті, нагадую:

Модель OSI була запропонована Міжнародною організацією стандартів ISO (International Standards Organization) в 1984 році. Всі мережеві функції в моделі розділені на 7 рівнів:

Розподіл протоколів за рівнями моделі OSI


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

На сьогоднішній день основним стеком протоколів є TCP / IP. Цей стек протоколів з'явився до OSI і встиг завоювати популярність.

Розподіл протоколів за рівнями моделі TCP / IP

прикладний
«7 рівень»

напр. TCP. UDP. SCTP. DCCP
(Протоколи маршрутизації, подібні OSPF. Що працюють поверх IP. Є частиною мережного рівня)

Для TCP / IP це IP (IP)
(Допоміжні протоколи, на кшталт ICMP і IGMP. Працюють поверх IP, але теж відносяться до мережевого рівня; протокол ARP є самостійним допоміжним протоколом, що працює поверх фізичного рівня)

напр. фізичне середовище і принципи кодування інформації, T1. E1


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

Сервер при запуску повідомляє операційній системі, що хотів би «зайняти» певний порт (або кілька портів). Після цього всі пакети, що приходять на комп'ютер до цього порту, ОС буде передавати цього сервера. Кажуть, що сервер «слухає» цей порт.

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

Щож, прийшла пора спробувати скористатися знаннями і перейти від слів до Джаві =)

Ключовими класами для реалізації взаємодії програм по TCP є java.net.Socket і java.net.ServerSocket.

Нижче наведені коди найпростіших TCP сервера і клієнта. Сервер транслює на консоль все, що йому приходить від клієнта.


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

На мій погляд, розуміння TCP є мінімальною базою для розуміння HTTP. У наступній частині я постараюся дати мінімальне уявлення безпосередньо про протокол Http і стандартному API в Java для його реалізації.