Библиотека 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', (