WebSocket в Node.js: библиотека ws для реального времени

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

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

Начать курс

Библиотека ws: WebSocket для Node.js

Библиотека ws — это простая, быстрая и полностью протестированная реализация протокола WebSocket для Node.js. Она является де-факто стандартом для создания приложений реального времени (чаты, онлайн-игры, уведомления, совместное редактирование) на серверной стороне JavaScript. В отличие от встроенного http модуля, ws предоставляет полноценную двустороннюю связь между клиентом и сервером без постоянных HTTP-запросов.

Основные возможности

  • Полная поддержка протокола RFC 6455 — работает со всеми современными браузерами.
  • Высокая производительность — минимальное потребление памяти и низкая задержка.
  • Простой API — создание сервера и клиента в несколько строк кода.
  • Поддержка расширений — сжатие данных (permessage-deflate).
  • Интеграция с HTTP-сервером — можно разделять порт с Express или другим фреймворком.
  • Автоматическое переподключение — встроенные механизмы для клиента.

Установка

Установка через npm:

npm install ws

После установки библиотека готова к использованию.

Создание WebSocket-сервера

Создадим простой сервер, который принимает соединения и отправляет приветственное сообщение:

const WebSocket = require('ws');

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

wss.on('connection', function connection(ws) {
  console.log('Новый клиент подключился');

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

  // Обрабатываем входящие сообщения
  ws.on('message', function incoming(message) {
    console.log('Получено: %s', message);
    // Отправляем обратно (эхо)
    ws.send('Эхо: ' + message);
  });

  // Обрабатываем закрытие соединения
  ws.on('close', function() {
    console.log('Клиент отключился');
  });
});

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

Создание WebSocket-клиента

Клиент подключается к серверу, отправляет сообщение и получает ответ:

const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', function open() {
  console.log('Подключение установлено');
  ws.send('Привет, сервер!');
});

ws.on('message', function incoming(data) {
  console.log('Ответ от сервера: %s', data);
  ws.close();
});

ws.on('close', function() {
  console.log('Соединение закрыто');
});

ws.on('error', function error(err) {
  console.error('Ошибка:', err.message);
});

Работа с JSON и несколькими клиентами

Реальный пример — чат-сервер, который рассылает сообщения всем подключенным клиентам (broadcast):

const WebSocket = require('ws');

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

wss.on('connection', function connection(ws, req) {
  console.log('Клиент подключился. Всего клиентов:', wss.clients.size);

  ws.on('message', function incoming(message) {
    // Парсим JSON
    let data;
    try {
      data = JSON.parse(message);
    } catch (e) {
      ws.send(JSON.stringify({ error: 'Некорректный JSON' }));
      return;
    }

    // Рассылаем всем, кроме отправителя
    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify({
          username: data.username,
          text: data.text,
          timestamp: Date.now()
        }));
      }
    });
  });

  ws.send(JSON.stringify({ system: 'Добро пожаловать в чат!' }));
});

Клиент может отправлять JSON:

ws.send(JSON.stringify({ username: 'Алиса', text: 'Всем привет!' }));

Интеграция с HTTP-сервером (Express)

Часто WebSocket и HTTP работают на одном порту. Пример с Express:

const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });

app.get('/', (req, res) => {
  res.send('HTTP сервер работает');
});

wss.on('connection', (ws) => {
  ws.send('WebSocket подключен');
});

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

Обработка ошибок и закрытие соединения

Важно корректно обрабатывать ошибки и закрывать соединения:

// На сервере
wss.on('connection', (                    

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