WebSocket библиотеки для Node.js: ws, Socket.IO и uWebSockets.js

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

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

WebSocket библиотеки для Node.js: от простого чата до высоконагруженных real-time систем

WebSocket — это протокол, обеспечивающий постоянное двустороннее соединение между клиентом и сервером. В отличие от HTTP, где запрос-ответ инициирует клиент, WebSocket позволяет серверу отправлять данные в любой момент. Для Node.js, который славится своей асинхронностью и event-driven архитектурой, WebSocket стал естественным выбором для создания чатов, онлайн-игр, торговых терминалов и потоковой передачи данных.

В этой статье мы разберём три основные библиотеки: ws (лёгкая и быстрая), Socket.IO (удобная с fallback-механизмами) и uWebSockets.js (рекордная производительность). Вы узнаете, какую выбрать под свою задачу и как написать простой чат на каждой из них.

1. Библиотека ws — минимализм и скорость

ws — самая популярная WebSocket библиотека для Node.js. Она реализует чистый протокол RFC 6455 без лишних надстроек. Основные плюсы:

  • Максимальная производительность — до 200 000+ сообщений/сек на одном ядре.
  • Нулевые зависимости — только чистый JavaScript.
  • Полный контроль над соединением: рукопожатие, фреймы, ping/pong.
  • Поддержка Node.js Buffer и Streams для бинарных данных.

Минусы: нет автоматического переподключения, нет комнат (rooms), нет fallback на HTTP long-polling. Всё нужно реализовывать вручную или через дополнительные пакеты.

Пример: простой эхо-сервер на ws

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (ws) => {
  console.log('Клиент подключился');

  ws.on('message', (message) => {
    console.log('Получено:', message.toString());
    // Отправляем обратно (эхо)
    ws.send(`Эхо: ${message}`);
  });

  ws.on('close', () => {
    console.log('Клиент отключился');
  });

  // Отправляем приветствие при подключении
  ws.send('Добро пожаловать на WebSocket сервер!');
});

console.log('Сервер запущен на ws://localhost:8080');

Когда выбирать ws? — для микросервисов, высоконагруженных игр (где каждый кадр важен), для встраивания в собственный HTTP сервер (через server.on('upgrade')).

2. Socket.IO — удобство и надёжность для продакшена

Socket.IO — это не просто WebSocket, а целая real-time платформа. Она использует WebSocket как основной транспорт, но автоматически переключается на HTTP long-polling, если WebSocket не поддерживается (прокси, фаерволы, старые браузеры).

  • Комнаты (Rooms) — группировка клиентов для широковещательных рассылок.
  • Пространства имён (Namespaces) — логическое разделение приложения (например, /chat и /game).
  • Автоматическое переподключение с экспоненциальной задержкой.
  • Поддержка событий — вы работаете с событиями, а не с сырыми сообщениями.
  • Встроенная сериализация — передача объектов JSON без ручной парсинга.

Минусы: накладные расходы на протокол (дополнительные пакеты с метаданными), больше зависимостей, чуть медленнее чистого ws.

Пример: чат с комнатами на Socket.IO (сервер)

const http = require('http');
const { Server } = require('socket.io');

const server = http.createServer();
const io = new Server(server, {
  cors: { origin: '*' } // для разработки
});

io.on('connection', (socket) => {
  console.log('Новый клиент:', socket.id);

  // Присоединение к комнате
  socket.on('join_room', (roomName) => {
    socket.join(roomName);
    socket.emit('message', `Вы присоединились к комнате ${roomName}`);
    socket.to(roomName).emit('message', `Пользователь ${socket.id} вошёл в комнату`);
  });

  // Отправка сообщения в комнату
  socket.on('send_message', (data) => {
    io.to(data.room).emit('message', data.msg);
  });

  socket.on('disconnect', () => {
    console.log('Клиент отключился:', socket.id);
  });
});

server.listen(3000, () => {
  console.log('Socket.IO сервер запущен на порту 3000');
});

Когда выбирать Socket.IO? — для типовых чатов, уведомлений, панелей администратора, где важна стабильность соединения и лёгкость разработки. Отличный выбор для стартапов и MVP.

3. uWebSockets.js — производительность на уровне

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