Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Двоспрямованість WebSocket». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Тому що і клієнт, і сервер можуть ініціювати передачу даних у будь-який момент часу через одне постійне TCP-з'єднання - без повторних запитів, без очікування і без закриття з'єднання. **Ключове:** на відміну від HTTP, де обмін завжди однонаправлений (запит клієнта → відповідь сервера, і з'єднання закривається), у WebSocket обидві сторони можуть асинхронно надсилати фрейми одна одній, поки з'єднання не закриє одна зі сторін.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Коротко **WebSocket - двоспрямований (bidirectional) протокол**, тому що **і клієнт, і сервер можуть ініціювати передачу даних у будь-який момент часу** - **без повторних запитів, без очікування, і без закриття з'єднання.** ## 1. Як це виглядає в порівнянні з HTTP | Властивість | HTTP | WebSocket | |---|---|---| | Хто ініціює обмін | Лише клієнт | Клієнт і сервер | | Скільки живе з'єднання | До завершення запиту | Поки не закрито вручну | | Передача даних | Односпрямована (request → response) | Двоспрямована (обидва можуть слати повідомлення) | | Використовується TCP | Так | Так | | Підходить для real-time | Ні | Так | ### Приклад: - HTTP: Клієнт → запит → сервер відповідає → з'єднання закривається. - WebSocket: Клієнт ↔ сервер: обидва можуть **безперервно слати повідомлення** одне одному в будь-який час. ## 2. Чому це можливо технічно WebSocket будується поверх **одного TCP-з'єднання**, яке: - встановлюється **один раз** (через HTTP "upgrade"); - залишається відкритим; - дозволяє обом сторонам **асинхронно** надсилати повідомлення (фрейми). Повідомлення передаються у вигляді фреймів (frames) - маленьких бінарних блоків: - клієнт може надіслати `Text` чи `Binary` фрейм; - сервер може відповісти своїми фреймами; - обидві сторони можуть надсилати їх **у будь-який момент**, навіть одночасно. ## 3. Приклад "живого" обміну Після встановлення з'єднання: ```javascript Клієнт → "Hello, сервере!" Сервер → "Привіт, клієнте!" Клієнт → "Надсилаю координати {x:10,y:20}" Сервер → "Координати отримано" Сервер → "Усім: гравець перемістився" ``` Жодних нових HTTP-запитів - просто **двосторонній потік повідомлень**. Це робить WebSocket ідеальним для **чатів, ігор, торгових платформ, сповіщень і дашбордів**. ## 4. Що відбувається "під капотом" 1. Клієнт робить звичайний HTTP-запит із заголовками: ```javascript Upgrade: websocket Connection: Upgrade ``` 2. Сервер відповідає: ```javascript HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade ``` 3. З'єднання "перемикається" з HTTP на WebSocket. Тепер це вже не запит-відповідь, а постійний двоспрямований **TCP-канал**. ## 5. Візуально ```javascript HTTP: Client ----request----> Server Client <----response--- Server (з'єднання закрито) WebSocket: Client <===============> Server (одне з'єднання, обидва можуть писати й читати) ``` ## 6. Чому це важливо Без двоспрямованості було б неможливо реалізувати: - сповіщення в реальному часі; - чати й месенджери; - стрімінг даних (наприклад, ціни на біржі); - онлайн-ігри; - оновлення стану без перезапиту сторінки. ## 7. Підсумовуємо > **WebSocket вважається двоспрямованим**, > тому що **сервер і клієнт можуть незалежно один від одного ініціювати надсилання даних** > через одне постійне з'єднання, > лишаючись підключеними, доки одна зі сторін його не закриє.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.