Socket.IO: что он добавляет поверх WebSocket

Знакомимся с библиотекой, которая берёт рутину реалтайма на себя.

Socket.IO — популярная библиотека (сервер на Node + клиент в браузере), которая надстраивается над WebSocket и добавляет реконнект, комнаты, именованные события и запасные транспорты.

Зачем не «голый» WebSocket

Чистый WebSocket даёт канал, но многое приходится писать руками: переподключение при обрыве, комнаты, разбор типов сообщений, heartbeat. Socket.IO предоставляет всё это из коробки, поэтому его часто берут для продакшена. Важно: Socket.IO — не сам WebSocket, а библиотека поверх него со своим протоколом; клиент и сервер должны быть оба на Socket.IO.

Что добавляет Socket.IO

ВозможностьВ голом WebSocketВ Socket.IO
Авто-реконнектпишешь самиз коробки
Комнатыпишешь самвстроены
Именованные событиячерез поле typeemit/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.
Проверьте себя
1. Что из перечисленного Socket.IO даёт «из коробки», а в голом WebSocket пишется руками?
AШифрование TLS
BАвто-реконнект, комнаты и fallback на long-polling
CПоддержку кириллицы
DСжатие изображений
2. Можно ли подключить клиент Socket.IO к серверу на «голом» ws?
AДа, протоколы совместимы
BНет, у Socket.IO собственный протокол поверх WebSocket
CДа, но только через wss
DТолько в Chrome