WebSocket библиотеки для Node.js: ws, Socket.IO и µWebSockets
WebSocket — это протокол, обеспечивающий постоянное двустороннее соединение между клиентом и сервером. В экосистеме Node.js существует несколько популярных библиотек, реализующих этот протокол. В этой статье мы рассмотрим три основные: ws, Socket.IO и µWebSockets (uWS). Вы узнаете, как их установить, написать простой чат-сервер и выбрать подходящий инструмент под свою задачу.
1. Библиотека ws — лёгкая и высокопроизводительная
ws — самая популярная и быстрая WebSocket-библиотека для Node.js. Она реализует чистый протокол WebSocket без дополнительных надстроек, что даёт минимальный overhead и максимальную скорость.
Установка
npm install 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}`);
ws.send(`Эхо: ${message}`);
});
ws.on('close', () => {
console.log('Клиент отключился');
});
});
console.log('WebSocket сервер запущен на ws://localhost:8080');
Клиентская часть (браузер)
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
console.log('Соединение установлено');
socket.send('Привет, сервер!');
};
socket.onmessage = (event) => {
console.log('Ответ от сервера:', event.data);
};
socket.onerror = (error) => {
console.error('Ошибка WebSocket:', error);
};
Особенности ws:
- Производительность: до 2-3 раз быстрее Socket.IO в тестах на throughput.
- Минимализм: нет встроенных механизмов переподключения, комнат или fallback-транспортов.
- Поддержка: полная совместимость с RFC 6455.
- Использование: идеально для real-time приложений, где критична скорость (биржевые данные, игры, чаты высокой нагрузки).
2. Socket.IO — удобство и надёжность для продакшена
Socket.IO — это не просто WebSocket-библиотека, а целый фреймворк для real-time приложений. Он добавляет поверх WebSocket: автоматическое переподключение, комнаты, пространства имён, fallback на long-polling (если WebSocket не поддерживается) и удобный API.
Установка
npm install 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('chat message', (msg) => {
console.log(`Сообщение: ${msg}`);
io.emit('chat message', msg); // рассылаем всем
});
socket.on('disconnect', () => {
console.log(`Пользователь отключился: ${socket.id}`);
});
});
server.listen(3000, () => {
console.log('Socket.IO сервер на http://localhost:3000');
});
Клиентская часть (браузер)
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io('http://localhost:3000');
socket.on('connect', () => {
console.log('Подключено к серверу');
socket.emit('chat message', 'Привет всем!');
});
socket.on('chat message', (msg) => {
const item = document.createElement('li');
item.textContent = msg;
document.getElementById('messages').appendChild(item);
});
</script>
Особенности Socket.IO:
- Автоматическое переподключение: при разрыве соединения клиент сам пытается восстановить связь.
- Комнаты (Rooms): можно создавать логические группы для рассылки.
- Пространства имён (Namespaces): изоляция логики на одном порту.
- Fallback-транспорты: если WebSocket не работает, используется HTTP long-polling.
- Подходит: для чатов, уведомлений, коллаборативных редакторов, где важна устойчивость соединения.
3. µWebSockets (uWS) — экстремальная производительность
µWebSockets (uWS) — это библиотека, написанная на