Эхо-сервер на Node.js (ws)

Пишем простейший WebSocket-сервер на Node.js, который возвращает каждое сообщение обратно.

Эхо-сервер — учебный сервер, который на любое полученное сообщение отвечает тем же сообщением; идеален для проверки канала.

Зачем эхо

Прежде чем строить чат, нужно убедиться, что канал работает в обе стороны. Эхо-сервер — минимальная проверка: отправили «привет» — получили «привет» обратно. Если эхо ходит, значит рукопожатие, приём и отправка исправны.

Библиотека ws

В Node.js самая популярная библиотека — ws. Сервер на ней умещается в несколько строк. Код серверный, в браузере не исполняется — он для чтения:

// server.js — запускается под Node.js: node server.js
const { WebSocketServer } = require("ws");

const wss = new WebSocketServer({ port: 8080 });

wss.on("connection", (socket) => {
  console.log("Клиент подключился");

  socket.on("message", (data) => {
    const text = data.toString();
    console.log("Получено:", text);
    socket.send("эхо: " + text);   // шлём обратно
  });

  socket.on("close", () => {
    console.log("Клиент отключился");
  });
});

console.log("Сервер слушает ws://localhost:8080");

Что здесь происходит

  • WebSocketServer({ port: 8080 }) — поднимает сервер на порту 8080.
  • Событие connection — новый клиент; в колбэк приходит его socket.
  • socket.on("message") — пришли данные; шлём их обратно через socket.send.
  • socket.on("close") — клиент ушёл.

Как проверить

Из браузерной консоли любой страницы:

const s = new WebSocket("ws://localhost:8080");
s.onmessage = (e) => console.log(e.data);
s.onopen = () => s.send("привет");
// в консоли появится: эхо: привет

Как работает под капотом

Библиотека ws сама перехватывает HTTP-запрос с заголовком Upgrade, считает Sec-WebSocket-Accept, отвечает 101 и дальше разбирает фреймы, отдавая вам готовые сообщения в событии message. Каждое подключение — отдельный объект socket; их у сервера может быть тысячи одновременно, и все они независимы.

Частые ошибки

  • Работать с data как со строкой напрямую. В ws приходит буфер; для текста зовите data.toString().
  • Не обрабатывать close. Без этого вы не узнаете об ушедших клиентах и не очистите ресурсы.
  • Открывать ws:// со страницы по HTTPS. Для прода нужен wss:// за TLS-прокси.

Итоги

  • Эхо-сервер — минимальная проверка двустороннего канала.
  • На Node.js его пишут на библиотеке ws в несколько строк.
  • События сервера: connection, message, close.
  • Каждое подключение — отдельный независимый socket.
Проверьте себя
1. Что делает эхо-сервер?
AРассылает сообщение всем клиентам
BОтвечает отправителю тем же сообщением
CСохраняет сообщения в базу
DШифрует трафик
2. Какое событие в библиотеке ws сигнализирует о новом клиенте?
Aopen
Bconnection
Cjoin
Dready