Ответ
WebSocket — это протокол связи поверх TCP, обеспечивающий полнодуплексный (full-duplex) канал между клиентом (например, браузером) и сервером. После установки соединения обе стороны могут отправлять данные друг другу асинхронно и в реальном времени.
Ключевые отличия от HTTP:
| Аспект | HTTP | WebSocket |
|---|---|---|
| Модель связи | Запрос-ответ (Request-Response). Клиент всегда инициатор. | Двусторонняя (Full-Duplex). Сервер может отправлять данные без запроса. |
| Соединение | Непостоянное. Создаётся для каждого запроса и закрывается после ответа. | Постоянное. Устанавливается один раз и остаётся открытым. |
| Накладные расходы (Overhead) | Высокие. Каждый запрос/ответ содержит полные заголовки. | Низкие. После рукопожатия данные передаются в виде легких фреймов. |
| Инициация данных | Только клиентом. | Клиентом и сервером. |
Установка соединения (Handshake):
- Клиент отправляет специальный HTTP-запрос с заголовком
Upgrade: websocket. - Сервер отвечает с кодом
101 Switching Protocols, подтверждая переход на протокол WebSocket. - Далее общение идёт по протоколу WebSocket.
Пример клиентского кода на JavaScript:
// Создание WebSocket-соединения
const socket = new WebSocket('wss://api.example.com/ws');
// Обработчики событий
socket.onopen = (event) => {
console.log('Соединение установлено');
socket.send(JSON.stringify({ type: 'subscribe', channel: 'notifications' }));
};
socket.onmessage = (event) => {
const message = JSON.parse(event.data);
console.log('Получено с сервера:', message);
// Обновление UI в реальном времени
};
socket.onerror = (error) => {
console.error('Ошибка WebSocket:', error);
};
socket.onclose = (event) => {
console.log('Соединение закрыто', event.code, event.reason);
};
Сценарии использования в тестировании:
- Автоматизация проверки real-time функциональности: Чат, уведомления, биржевые тикеры, онлайн-игры.
- Тестирование стабильности соединения: Проверка повторного подключения, обработка разрывов.
- Валидация данных: Проверка формата и последовательности сообщений, отправляемых сервером.
- Нагрузочное тестирование: Моделирование тысяч одновременных WebSocket-соединений для проверки масштабируемости сервера.