Назад к вопросам
Junior
76
questionbank

Что такое веб-сокеты?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Веб-сокеты (Websockets) - это протокол двунаправленной связи по одному TCP-соединению, позволяющий обмениваться данными между браузером и сервером в реальном времени.

Ключевые отличия от традиционных HTTP-запросов:

  • Двунаправленная связь: Сервер может отправлять данные клиенту без предварительного запроса от клиента.
  • Одно соединение: Устанавливается одно долгоживущее соединение, устраняя накладные расходы на установку нового соединения для каждого обмена данными (как в HTTP).
  • Снижение задержки: Меньше времени тратится на установление соединения, обмен заголовками и обработку коротких запросов/ответов.

Принцип работы:

  1. Handshake: Браузер отправляет специальный HTTP-запрос на сервер (с заголовками Upgrade: websocket и Connection: Upgrade).
  2. Установление соединения: Если сервер поддерживает веб-сокеты, он отвечает с кодом 101 Switching Protocols, после чего соединение переходит в протокол веб-сокетов.
  3. Передача данных: После установления соединения обе стороны могут свободно обмениваться сообщениями в обе стороны в любое время.

Примеры использования:

  • Онлайн-игры
  • Чаты и мессенджеры
  • Реально-временные обновления данных (котировки, новости)
  • Коллаборативные инструменты

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

  • Низкая задержка
  • Эффективное использование ресурсов (меньше overhead)
  • Двунаправленная связь в реальном времени

Недостатки:

  • Требуется поддержка как на стороне клиента (браузера), так и на стороне сервера.
  • Более сложная реализация по сравнению с простыми HTTP-запросами.

Пример клиентского кода на JavaScript:

// создание веб-сокета
const socket = new WebSocket('wss://example.com/websocket');

// обработчик открытия соединения
socket.onopen = function(event) {
  console.log('Соединение установлено');
  socket.send('Привет, сервер!'); // отправка сообщения серверу
};

// обработчик получения сообщения
socket.onmessage = function(event) {
  console.log('Получено сообщение от сервера: ' + event.data);
};

// обработчик закрытия соединения
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Соединение закрыто чисто, код=${event.code} причина=${event.reason}`);
  } else {
    console.log('Соединение прервано'); // например, из-за сбоя сети
  }
};

// обработчик ошибки
socket.onerror = function(error) {
  console.error(`Ошибка веб-сокета: ${error}`);
};

// закрытие соединения (при необходимости)
// socket.close();