Socket.IO: что он добавляет поверх WebSocket
Знакомимся с библиотекой, которая берёт рутину реалтайма на себя.
Socket.IO — популярная библиотека (сервер на Node + клиент в браузере), которая надстраивается над WebSocket и добавляет реконнект, комнаты, именованные события и запасные транспорты.
Зачем не «голый» WebSocket
Чистый WebSocket даёт канал, но многое приходится писать руками: переподключение при обрыве, комнаты, разбор типов сообщений, heartbeat. Socket.IO предоставляет всё это из коробки, поэтому его часто берут для продакшена. Важно: Socket.IO — не сам WebSocket, а библиотека поверх него со своим протоколом; клиент и сервер должны быть оба на Socket.IO.
Что добавляет Socket.IO
| Возможность | В голом WebSocket | В Socket.IO |
| Авто-реконнект | пишешь сам | из коробки |
| Комнаты | пишешь сам | встроены |
| Именованные события | через поле type | emit/on по имени |
| Fallback при отсутствии WS | нет | long-polling |
| Heartbeat (ping/pong) | пишешь сам | встроен |
Именованные события вместо type
Вместо ручного switch (msg.type) в Socket.IO события вызывают по имени. Концептуально (серверный код, для чтения):
// сервер на Socket.IO
io.on("connection", (socket) => {
socket.join("general"); // комната одной строкой
socket.on("chat", (msg) => { // событие по имени
io.to("general").emit("chat", msg); // в комнату
});
});// клиент на Socket.IO
const socket = io("wss://example.com");
socket.on("chat", (msg) => render(msg));
socket.emit("chat", { text: "привет" });Как работает под капотом
При старте Socket.IO пробует установить WebSocket. Если сеть или прокси его не пропускают, он откатывается на long-polling — приложение продолжит работать, просто чуть медленнее. Авто-реконнект делает повторные попытки с возрастающей паузой. Под капотом это всё тот же поток событий, но обёрнутый в удобный API emit/on и собственный служебный протокол (нумерация пакетов, пинги).
Частые ошибки
- Подключать клиент Socket.IO к «голому» WebSocket-серверу (и наоборот). Протоколы несовместимы — нужны обе стороны на Socket.IO.
- Считать, что Socket.IO всегда использует WebSocket. Он может уйти в long-polling; учитывайте это при отладке.
- Тащить Socket.IO туда, где хватит SSE или чистого WS. Лишняя зависимость и оверхед, если реконнект и комнаты не нужны.
Итоги
- Socket.IO — библиотека поверх WebSocket с реконнектом, комнатами, событиями по имени и fallback.
- События вызывают по имени через
emit/onвместо ручногоtype. - Клиент и сервер должны быть оба на Socket.IO — это не совместимо с голым WS.
- Берите его, когда нужны его удобства; иначе хватит чистого WebSocket или SSE.