WebSockets – работа с веб-сокетами

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Что такое WebSocket и как он работает

WebSocket — это сетевой протокол, обеспечивающий двустороннюю, постоянную связь между клиентом и сервером через одно TCP-соединение. В отличие от HTTP, WebSocket не требует повторного открытия соединения для каждой передачи данных. Он особенно эффективен для приложений в реальном времени — чатов, торговых платформ, игр, уведомлений и стриминга.


Отличия WebSocket от HTTP

Критерий HTTP WebSocket
Тип соединения Однонаправленное Двунаправленное
Состояние Без сохранения состояния Постоянное
Нагрузка Высокая (много запросов) Низкая (одно соединение)
Задержка Выше Ниже
Использование REST API, страницы Чаты, биржи, уведомления

Преимущества и недостатки WebSocket

Преимущества:

  • Мгновенная передача данных в обе стороны

  • Минимальная задержка

  • Поддержка постоянного соединения

  • Идеален для real-time приложений

Недостатки:

  • Сложнее масштабировать

  • Требует серверной поддержки

  • Нельзя кешировать, как HTTP

  • Потенциальные проблемы безопасности


Структура протокола WebSocket

  1. HTTP-запрос на апгрейд соединения (Upgrade: websocket)

  2. Сервер отвечает с подтверждением (HTTP/1.1 101 Switching Protocols)

  3. Установлено TCP-соединение с фреймами WebSocket

Форматы сообщений:

  • Текст (UTF-8)

  • Бинарные данные

  • Пинг/Понг (для проверки соединения)

  • Закрытие соединения


Установка соединения и рукопожатие

Клиент отправляет специальный HTTP-запрос:

makefile
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13

Сервер отвечает:

makefile
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Форматы передачи данных: текст и бинарные сообщения

WebSocket поддерживает два основных формата:

  • text — используется чаще всего (например, JSON-объекты)

  • binary — для передачи файлов, аудио, видео


Серверная реализация WebSocket на Python

С использованием библиотеки websockets:

python
import asyncio import websockets async def echo(websocket): async for message in websocket: await websocket.send(f"Ответ: {message}") async def main(): async with websockets.serve(echo, "localhost", 8765): await asyncio.Future() # run forever asyncio.run(main())

Реализация клиента WebSocket на Python

python
import asyncio import websockets async def hello(): uri = "ws://localhost:8765" async with websockets.connect(uri) as websocket: await websocket.send("Привет серверу") response = await websocket.recv() print(f"Ответ: {response}") asyncio.run(hello())

Реализация клиента WebSocket на JavaScript

javascript
const socket = new WebSocket("ws://localhost:8765"); socket.onopen = () => { socket.send("Привет с клиента"); }; socket.onmessage = (event) => { console.log("Ответ сервера:", event.data); };

Работа с WebSocket в браузере

Все современные браузеры поддерживают WebSocket через интерфейс WebSocket API. Методы и события:

  • send(data)

  • onopen

  • onmessage

  • onclose

  • onerror


Поддержка WebSocket в популярных фреймворках

Фреймворк Поддержка WebSocket
Flask Через Flask-SocketIO
Django Через Django Channels
FastAPI Встроено (на базе Starlette)
Sanic Встроено
Tornado Встроено
aiohttp Встроено

Использование WebSocket в API и микросервисах

Примеры:

  • Push-уведомления

  • Live-чаты

  • Онлайн-торговля

  • Мониторинг состояния (IoT)

  • Совместное редактирование (документы, доски)


Безопасность и защита WebSocket

Рекомендации:

  • Используйте wss:// вместо ws://

  • Авторизуйте соединения (по токену, JWT)

  • Ограничивайте доступ по IP

  • Используйте TLS

  • Следите за дозированием и перехватами сообщений


Работа через WSS (SSL/HTTPS)

WSS — защищённая версия WebSocket, использующая TLS:

python
websockets.serve(handler, "localhost", 443, ssl=ssl_context)

Требуется сертификат и ключ, например через Let's Encrypt.


Масштабирование WebSocket: pub/sub, Redis

Проблема: одно WebSocket-соединение = один процесс.

Решения:

  • Использование Redis Pub/Sub для передачи между процессами

  • Использование message broker (RabbitMQ, Kafka)

  • Прокси WebSocket-соединений через Nginx, Traefik


Тестирование WebSocket-соединений

Инструменты:

bash
npm install -g wscat wscat -c ws://localhost:8765

Примеры практического применения WebSocket

  • Реализация чатов

  • Онлайн-поддержка

  • Биржи криптовалют

  • Мгновенные уведомления

  • Live-обновление данных (доски задач, редакторы)

  • Совместные игры


Часто задаваемые вопросы

Что такое WebSocket?

Сетевой протокол для двусторонней связи между клиентом и сервером в реальном времени.

Поддерживают ли WebSocket все браузеры?

Да, большинство современных браузеров полностью поддерживают WebSocket.

WebSocket и HTTP — в чём разница?

HTTP — однонаправленный, WebSocket — двусторонний и постоянный.

Поддерживает ли Python WebSocket?

Да, через библиотеки websockets, aiohttp, FastAPI, Sanic.

Как обеспечить безопасность WebSocket?

Использовать wss://, токены, SSL и ограничение соединений.

Полный справочник по работе с WebSockets в Python

Основные библиотеки WebSocket для Python

Библиотека Назначение
websockets Асинхронная библиотека для работы с WebSocket-сервером/клиентом.
socket.io (python-socketio) WebSocket + fallback, поддерживает комнаты, события и namespaces.
FastAPI / Quart / Starlette Поддержка WebSocket встроена.
Django Channels Расширение Django для асинхронной поддержки WebSocket.
Autobahn / Twisted Подходит для сложных и масштабируемых приложений.

1. Библиотека websockets (низкоуровневая, asyncio)

Установка:

bash
pip install websockets

Сервер:

python
import asyncio import websockets async def echo(websocket, path): async for message in websocket: await websocket.send(f"Получено: {message}") start_server = websockets.serve(echo, "localhost", 8765) asyncio.run(start_server)

Клиент:

python
import asyncio import websockets async def hello(): async with websockets.connect("ws://localhost:8765") as websocket: await websocket.send("Привет, сервер!") response = await websocket.recv() print(response) asyncio.run(hello())

2. WebSocket в FastAPI

bash
pip install fastapi uvicorn

Пример:

python
from fastapi import FastAPI, WebSocket app = FastAPI() @app.websocket("/ws") async def websocket_endpoint(ws: WebSocket): await ws.accept() while True: data = await ws.receive_text() await ws.send_text(f"Ты написал: {data}")

Запуск:

bash
uvicorn app:app

3. WebSocket в Quart

python
from quart import Quart, websocket app = Quart(__name__) @app.websocket("/ws") async def ws(): while True: data = await websocket.receive() await websocket.send(f"Получено: {data}")

4. Django Channels

bash
pip install channels

routing.py:

python
from channels.routing import ProtocolTypeRouter, URLRouter from django.urls import path from . import consumers application = ProtocolTypeRouter({ "websocket": URLRouter([ path("ws/chat/", consumers.ChatConsumer.as_asgi()), ]) })

consumers.py:

python
from channels.generic.websocket import AsyncWebsocketConsumer class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): await self.accept() async def receive(self, text_data): await self.send(text_data=f"Ты сказал: {text_data}")

5. Socket.IO (python-socketio)

bash
pip install "python-socketio[client]"

Сервер:

python
import socketio sio = socketio.AsyncServer(async_mode='asgi') app = socketio.ASGIApp(sio) @sio.event async def connect(sid, environ): print('Клиент подключился', sid) @sio.event async def message(sid, data): await sio.send(f"Ты сказал: {data}")

Примеры событий WebSocket

Событие Назначение
onopen Клиент подключился.
onmessage Получено сообщение.
onclose Закрытие соединения.
onerror Ошибка соединения.

Когда использовать WebSockets

  • Чаты и уведомления.

  • Игры в реальном времени.

  • Обновления интерфейса без перезагрузки.

  • Отслеживание состояния объектов в реальном времени (мониторинг, геолокация, сенсоры).


Заключение: WebSocket как основа real-time приложений

WebSocket предоставляет эффективный и мощный способ реализации real-time коммуникации между клиентом и сервером. Он идеален для задач, где важна мгновенная реакция и постоянное соединение. Благодаря широкому спектру реализаций и простоте интеграции с существующими технологиями, WebSocket стал неотъемлемой частью современных веб-приложений и API-инфраструктур.