<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Борис Карзанов</title><author><name>Борис Карзанов</name></author><id>https://teletype.in/atom/boriskarzanov</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/boriskarzanov?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@boriskarzanov?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=boriskarzanov"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/boriskarzanov?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-15T14:20:47.808Z</updated><entry><id>boriskarzanov:2HTLAK9Qe</id><link rel="alternate" type="text/html" href="https://teletype.in/@boriskarzanov/2HTLAK9Qe?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=boriskarzanov"></link><title>Простой WebSocket-сервер на Node.JS</title><published>2021-03-09T20:00:50.337Z</published><updated>2021-03-09T20:03:43.633Z</updated><summary type="html">Сейчас мы с вами напишем простой WebSocket-сервер на node.js. При подключении к этому серверу в ответ придёт приветственное сообщение. А так же будет доступна к выполнению пара не сложных команд.</summary><content type="html">
  &lt;p&gt;Сейчас мы с вами напишем простой WebSocket-сервер на node.js. При подключении к этому серверу в ответ придёт приветственное сообщение. А так же будет доступна к выполнению пара не сложных команд.&lt;/p&gt;
  &lt;p&gt;Для этого потребуется установить &lt;a href=&quot;https://nodejs.org/en/download/&quot; target=&quot;_blank&quot;&gt;Node.js&lt;/a&gt; с менеджером пакетов npm, он идёт в комплекте&lt;/p&gt;
  &lt;h2&gt;Настройка проекта&lt;/h2&gt;
  &lt;p&gt;В начале, нам потребуется создать директорию будущего проекта&lt;/p&gt;
  &lt;pre&gt;mkdir websocket-server-node&lt;/pre&gt;
  &lt;p&gt;Переходим в директорию&lt;/p&gt;
  &lt;pre&gt;cd websocket-server-node&lt;/pre&gt;
  &lt;p&gt;Далее нужно инициализировать новый проект через npm&lt;/p&gt;
  &lt;pre&gt;npm init&lt;/pre&gt;
  &lt;p&gt;Установщик потребует ответить на несколько вопросов, их можно пропустить&lt;/p&gt;
  &lt;p&gt;После инициализации проекта, необходимо добавить в проект библиотеку &lt;a href=&quot;https://www.npmjs.com/packege/ws&quot; target=&quot;_blank&quot;&gt;WS&lt;/a&gt; и настройку для работы с текстом в UTF-8&lt;/p&gt;
  &lt;pre&gt;npm install ws&lt;/pre&gt;
  &lt;pre&gt;npm install --save-optional utf-8-validate&lt;/pre&gt;
  &lt;h2&gt;Код websocket-сервера&lt;/h2&gt;
  &lt;p&gt;Теперь приступим к написанию кода. В директории проекта создадим новый файл &lt;strong&gt;server.js&lt;/strong&gt;, откроем файл. Далее я последовательно опишу весь код, а вот &lt;a href=&quot;https://github.com/bkwebeagle/websocket-server-nodejs&quot; target=&quot;_blank&quot;&gt;ссылка на полный код на GitHub&lt;/a&gt;.&lt;/p&gt;
  &lt;h3&gt;server.js:&lt;/h3&gt;
  &lt;p&gt;В начале нужно подключить библиотеку для работы с websocket&lt;/p&gt;
  &lt;pre&gt;const WebSocket = require(&amp;#x27;ws&amp;#x27;);&lt;/pre&gt;
  &lt;p&gt;Далее, создадим константу, экземпляр класса WebSocket, с указанием порта на котором будет запущен WebSocket-сервер.&lt;/p&gt;
  &lt;pre&gt;const wsServer = new WebSocket.Server({port: 9000});&lt;/pre&gt;
  &lt;p&gt;В отличии от HTTP-сервера, WebSocket-сервер принимает подключение и удерживает его. HTTP-сервер принимает запросы напрямую, а WebSocket-сервер принимает запросы от подключения, такое соединение является полнодуплексное.&lt;/p&gt;
  &lt;p&gt;Напишем обработчик подключения, в качестве обработчика укажем функцию &lt;strong&gt;onConnect&lt;/strong&gt;.&lt;/p&gt;
  &lt;pre&gt;wsServer.on(&amp;#x27;connection&amp;#x27;, onConnect);&lt;/pre&gt;
  &lt;p&gt;В момент подключения нового клиента в onConnection передаётся объекта ws-соединения, через него сервер будет общаться с каждым конкретным клиентом.&lt;/p&gt;
  &lt;p&gt;Функция onConnect принимает только один параметр, назовём его wsClient. В нашем конкретном примере мы подключим только два обработчика событий на объект wsClient: message и close.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;message&lt;/strong&gt; - обрабатывает событие входящего сообщения от клиента.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;close&lt;/strong&gt; - событие разрыва соединения с клиентом.&lt;/p&gt;
  &lt;p&gt;В самом начале функции onConnect, выведем в консоль сообщение что новый пользователь в сети. И отправим клиенту приветственное сообщение&lt;/p&gt;
  &lt;p&gt;Далее опишу заготовку для функции onConnect:&lt;/p&gt;
  &lt;pre&gt;function onConnect(wsClient) {
  console.log(&amp;#x27;Новый пользователь&amp;#x27;);
  // отправка приветственного сообщения клиенту
  wsClient.send(&amp;#x27;Привет&amp;#x27;);
  
  wsClient.on(&amp;#x27;message&amp;#x27;, function(message) {
    /* обработчик сообщений от клиента */
  }
  
  wsClient.on(&amp;#x27;close&amp;#x27;, function() {
    // отправка уведомления в консоль
    console.log(&amp;#x27;Пользователь отключился&amp;#x27;);
  }
}&lt;/pre&gt;
  &lt;p&gt;На событие &lt;strong&gt;close&lt;/strong&gt; сервер выведет в консоль уведомление.&lt;/p&gt;
  &lt;p&gt;Теперь напишем обработчик сообщений со стороны клиента. Договоримся, что команды сервер будет принимать в JSON-формате. JSON позволит отдельно указывать команду и параметры, а ответ сервера будет возвращаться в текстовом формате.&lt;/p&gt;
  &lt;p&gt;Формат JSON команд от клиента:&lt;/p&gt;
  &lt;pre&gt;{
  action: &amp;#x27;ECHO&amp;#x27; | &amp;#x27;PING&amp;#x27;,
  data?: string // необязательный параметр
}&lt;/pre&gt;
  &lt;p&gt;Как видно из формата, сервер будет принимать две команды:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;echo-запрос, в ответ на который сервер отправит содержимое data&lt;/li&gt;
    &lt;li&gt;ping, в ответ сервер отправит pong&lt;/li&gt;
    &lt;li&gt;если команда не известна, сервер выведет в консоль уведомление &amp;quot;Неизвестная команда&amp;quot;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;strong&gt;Содержимое обработчика сообщений от клиента:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre&gt;try {
  // сообщение пришло текстом, нужно конвертировать в JSON-формат
  const jsonMessage = JSON.parse(message);
  switch (jsonMessage) {
    case &amp;#x27;ECHO&amp;#x27;:
      wsClient.send(jsonMessage.data);
      break;
    case: &amp;#x27;PING&amp;#x27;:
      setTimeout(function() {
        wsClient.send(&amp;#x27;PONG&amp;#x27;);
      }, 2000);
      break;
    default:
      console.log(&amp;#x27;Неизвестная команда&amp;#x27;);
      break;
  }
} catch (error) {
  console.log(&amp;#x27;Ошибка&amp;#x27;, error);
}&lt;/pre&gt;
  &lt;p&gt;Как вы уже видите, на команду PING сервер не сразу ответит, а подождёт 2 секунды.&lt;/p&gt;
  &lt;p&gt;Добавим в конце файла server.js строку, которая выведет в консоль информацию, на каком порту запущен сервер.&lt;/p&gt;
  &lt;pre&gt;console.log(&amp;#x27;Сервер запущен на 9000 порту&amp;#x27;);&lt;/pre&gt;
  &lt;h2&gt;Запуск сервера&lt;/h2&gt;
  &lt;p&gt;Для запуска сервера необходимо перейти в консоль и ввести команду:&lt;/p&gt;
  &lt;pre&gt;node server.js&lt;/pre&gt;
  &lt;p&gt;Сервер доступен локально по адресу &lt;a href=&quot;ws://localhost:9000&quot; target=&quot;_blank&quot;&gt;ws://localhost:9000&lt;/a&gt;. Остановить сервер можно сочетанием клавиш:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Для Windows и Linux (Ctrl + C)&lt;/li&gt;
    &lt;li&gt;Для MacOs (Cmd + C)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Если хотите проверить работу сервера с другого устройства в рамках локальной сети, то откройте ещё одно окно консоли и запустите команду &lt;/p&gt;
  &lt;p&gt;для Window:&lt;/p&gt;
  &lt;pre&gt;ipconfig&lt;/pre&gt;
  &lt;p&gt;для Linux и MacOS:&lt;/p&gt;
  &lt;pre&gt;ifconfig&lt;/pre&gt;
  &lt;p&gt;В моём случае локальный адрес &lt;strong&gt;192.168.0.15&lt;/strong&gt;, значит из локальной сети сервер будет доступен по адресу &lt;strong&gt;ws://192.168.0.15:9000&lt;/strong&gt;.&lt;/p&gt;
  &lt;h2&gt;Проверка работы сервера&lt;/h2&gt;
  &lt;p&gt;Чтобы протестировать работу сервера, откроем любую страницу в браузере и нажмём клавишу F12. Откроется DevTools, перейдём в консоль браузера и скопируем следующий код:&lt;/p&gt;
  &lt;pre&gt;const myWs = new WebSocket(&amp;#x27;ws://localhost:9000&amp;#x27;);

// обработчик проинформирует в консоль когда соединение установится
myWs.onopen = function () {
  console.log(&amp;#x27;подключился&amp;#x27;);
};

// обработчик сообщений от сервера
myWs.onmessage = function (message) {
  console.log(&amp;#x27;Message: %s&amp;#x27;, message.data);
};

// функция для отправки echo-сообщений на сервер
function wsSendEcho(value) {
  myWs.send(JSON.stringify({action: &amp;#x27;ECHO&amp;#x27;, data: value.toString()}));
}

// функция для отправки команды ping на сервер
function wsSendPing() {
  myWs.send(JSON.stringify({action: &amp;#x27;PING&amp;#x27;}));
}&lt;/pre&gt;
  &lt;p&gt;Запустите этот код. Далее в консоли браузера вызовите функцию wsSendPing:&lt;/p&gt;
  &lt;pre&gt;wsSendPing()&lt;/pre&gt;
  &lt;p&gt;Через 2 секунды сервер пришлёт ответ, и в консоли выведется:&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Message: PONG&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Вызовите функцию wsSendEcho, к примеру, с содержимым &amp;quot;Test!&amp;quot;, и в консоли будет выведено:&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Message: Test!&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Вот и всё! Кому понравилось, ставьте Like, подписывайтесь. Всем Добра!&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://github.com/bkwebeagle/websocket-server-nodejs&quot; target=&quot;_blank&quot;&gt;Ссылка на полный код GitHub&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>