← Назад к вопросам

Зачем нужен WebSocket?

2.0 Middle🔥 171 комментариев
#API и сетевые протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение WebSocket

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

Проблема, которую решает WebSocket

HTTP limitations:

// Классический HTTP подход
setInterval(async () => {
  const data = await fetch('/api/messages');
  // Запрашиваем каждые 100ms
  // Даже если нет новых сообщений - сетевой трафик
}, 100);

// Проблемы:
// 1. Лишний трафик (пустые ответы)
// 2. Задержка (новое сообщение появится только на следующей проверке)
// 3. Нагрузка на сервер (1000 клиентов = 10K запросов в секунду)

WebSocket решение:

// На клиенте
const ws = new WebSocket('ws://api.example.com');

ws.onmessage = (event) => {
  console.log('Новое сообщение:', event.data);
  // Сервер отправляет сообщение как только оно появляется
};

ws.send('Hello, Server!');

// На сервере (Node.js с ws)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    console.log('Получено:', message);
    // Отправить всем клиентам
    wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send('Broadcast: ' + message);
      }
    });
  });
});

Ключевые преимущества

Real-time коммуникация — сервер может отправить данные клиенту в любой момент.

Низкая задержка — одно соединение, сразу получишь ответ.

Экономия трафика — не нужны заголовки HTTP для каждого запроса.

Двусторонняя коммуникация — не только request-response, но полноценный диалог.

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

Чаты и мессенджеры:

// Пользователь отправляет сообщение
ws.send(JSON.stringify({
  type: 'message',
  text: 'Hello!',
  room: 'general'
}));

// Все в комнате получают сообщение в реальном времени
ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  updateChatUI(msg);
};

Совместное редактирование (Google Docs):

// Когда один пользователь печатает, остальные видят символы в реальном времени
ws.on('message', (data) => {
  if (data.type === 'edit') {
    broadcastToAll({ type: 'character-inserted', char: data.char });
  }
});

Live notifications:

// Пользователь отправляет пост, все подписчики получают уведомление мгновенно
ws.send({ type: 'notification', text: 'John posted a new article' });

Игры и interactive приложения:

// Позиция игрока обновляется в реальном времени
ws.send(JSON.stringify({
  type: 'move',
  x: 100,
  y: 200,
  userId: 'player-1'
}));

Live данные (финансовые котировки, спортивные результаты):

ws.onmessage = (event) => {
  const stockPrice = JSON.parse(event.data);
  updateStockChart(stockPrice);
};

Когда НЕ использовать WebSocket

Простые REST операции — получить список пользователей, создать пост. HTTP вполне достаточно.

Файловые загрузки — используй HTTP с Content-Length.

Состояния без обновлений — если данные не меняются, нет смысла в real-time.

Сравнение с альтернативами

Polling:

// Клиент постоянно спрашивает: есть ли новые данные?
setInterval(() => fetch('/api/data'), 5000);
// Неэффективно, задержка до 5 секунд

Server-Sent Events (SSE):

const sse = new EventSource('/api/stream');
sse.onmessage = (event) => console.log(event.data);
// Только сервер -> клиент, не двусторонняя коммуникация

WebSocket:

  • Двусторонняя коммуникация
  • Низкая задержка
  • Эффективен для real-time

Практический пример с обработкой ошибок

const ws = new WebSocket('ws://api.example.com');
const reconnectInterval = 5000;
let reconnectAttempts = 0;

ws.onopen = () => {
  console.log('Connected');
  reconnectAttempts = 0;
};

ws.onerror = (error) => {
  console.error('WebSocket error:', error);
};

ws.onclose = () => {
  // Переподключение
  setTimeout(() => {
    reconnectAttempts++;
    if (reconnectAttempts < 10) {
      const newWs = new WebSocket('ws://api.example.com');
    }
  }, reconnectInterval * Math.pow(2, reconnectAttempts));
};

WebSocket — это незаменимый инструмент для real-time приложений, но требует правильной обработки соединения и переподключения.

Зачем нужен WebSocket? | PrepBro