Что такое протокол WebSocket и для чего он используется?

Ответ

Протокол WebSocket обеспечивает полнодуплексный (двусторонний) обмен данными между клиентом и сервером по одному постоянному TCP-соединению. В отличие от HTTP, где соединение обычно закрывается после каждого запроса, WebSocket поддерживает его открытым, позволяя обеим сторонам отправлять данные в любое время.

Почему это важно?

WebSocket идеально подходит для приложений, требующих обмена данными в реальном времени, поскольку он значительно снижает накладные расходы по сравнению с многократными HTTP-запросами (например, при использовании Long Polling). Это обеспечивает низкие задержки и более эффективное использование сетевых ресурсов.

Ключевые особенности:

  • Постоянное соединение: Устанавливается один раз и поддерживается на протяжении всей сессии.
  • Полнодуплексность: Клиент и сервер могут отправлять данные одновременно и независимо друг от друга.
  • Низкие задержки: Устраняет накладные расходы на установку нового соединения для каждого обмена данными.
  • Событийная модель: Сервер может инициировать отправку данных клиенту без предварительного запроса.

Применение:

  • Онлайн-чаты и мессенджеры
  • Многопользовательские онлайн-игры
  • Биржевые тикеры и системы мониторинга в реальном времени
  • Уведомления и push-сервисы

Пример (Python с библиотекой websockets):

import asyncio
import websockets

# Серверная часть
async def echo_server(websocket, path):
    print(f"Клиент подключен: {websocket.remote_address}")
    try:
        async for message in websocket:
            print(f"Получено от клиента: {message}")
            await websocket.send(f"Эхо: {message}") # Отправляем ответ клиенту
    except websockets.exceptions.ConnectionClosedOK:
        print(f"Клиент отключен: {websocket.remote_address}")

async def main():
    # Запуск WebSocket сервера на localhost:8765
    async with websockets.serve(echo_server, "localhost", 8765):
        print("WebSocket сервер запущен на ws://localhost:8765")
        await asyncio.Future()  # Запускаем сервер навсегда

if __name__ == "__main__":
    asyncio.run(main())

Для подключения к этому серверу с клиента (например, из браузера или с помощью JavaScript) можно использовать new WebSocket('ws://localhost:8765');.