<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Борис Карзанов</title><generator>teletype.in</generator><description><![CDATA[Борис Карзанов]]></description><image><url>https://teletype.in/files/17/1779d5ae-c5fb-4809-bd70-646b718fb753.png</url><title>Борис Карзанов</title><link>https://teletype.in/@boriskarzanov</link></image><link>https://teletype.in/@boriskarzanov?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=boriskarzanov</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/boriskarzanov?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/boriskarzanov?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 15 Apr 2026 14:11:32 GMT</pubDate><lastBuildDate>Wed, 15 Apr 2026 14:11:32 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@boriskarzanov/2HTLAK9Qe</guid><link>https://teletype.in/@boriskarzanov/2HTLAK9Qe?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=boriskarzanov</link><comments>https://teletype.in/@boriskarzanov/2HTLAK9Qe?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=boriskarzanov#comments</comments><dc:creator>boriskarzanov</dc:creator><title>Простой WebSocket-сервер на Node.JS</title><pubDate>Tue, 09 Mar 2021 20:00:50 GMT</pubDate><description><![CDATA[Сейчас мы с вами напишем простой WebSocket-сервер на node.js. При подключении к этому серверу в ответ придёт приветственное сообщение. А так же будет доступна к выполнению пара не сложных команд.]]></description><content:encoded><![CDATA[
  <p>Сейчас мы с вами напишем простой WebSocket-сервер на node.js. При подключении к этому серверу в ответ придёт приветственное сообщение. А так же будет доступна к выполнению пара не сложных команд.</p>
  <p>Для этого потребуется установить <a href="https://nodejs.org/en/download/" target="_blank">Node.js</a> с менеджером пакетов npm, он идёт в комплекте</p>
  <h2>Настройка проекта</h2>
  <p>В начале, нам потребуется создать директорию будущего проекта</p>
  <pre>mkdir websocket-server-node</pre>
  <p>Переходим в директорию</p>
  <pre>cd websocket-server-node</pre>
  <p>Далее нужно инициализировать новый проект через npm</p>
  <pre>npm init</pre>
  <p>Установщик потребует ответить на несколько вопросов, их можно пропустить</p>
  <p>После инициализации проекта, необходимо добавить в проект библиотеку <a href="https://www.npmjs.com/packege/ws" target="_blank">WS</a> и настройку для работы с текстом в UTF-8</p>
  <pre>npm install ws</pre>
  <pre>npm install --save-optional utf-8-validate</pre>
  <h2>Код websocket-сервера</h2>
  <p>Теперь приступим к написанию кода. В директории проекта создадим новый файл <strong>server.js</strong>, откроем файл. Далее я последовательно опишу весь код, а вот <a href="https://github.com/bkwebeagle/websocket-server-nodejs" target="_blank">ссылка на полный код на GitHub</a>.</p>
  <h3>server.js:</h3>
  <p>В начале нужно подключить библиотеку для работы с websocket</p>
  <pre>const WebSocket = require(&#x27;ws&#x27;);</pre>
  <p>Далее, создадим константу, экземпляр класса WebSocket, с указанием порта на котором будет запущен WebSocket-сервер.</p>
  <pre>const wsServer = new WebSocket.Server({port: 9000});</pre>
  <p>В отличии от HTTP-сервера, WebSocket-сервер принимает подключение и удерживает его. HTTP-сервер принимает запросы напрямую, а WebSocket-сервер принимает запросы от подключения, такое соединение является полнодуплексное.</p>
  <p>Напишем обработчик подключения, в качестве обработчика укажем функцию <strong>onConnect</strong>.</p>
  <pre>wsServer.on(&#x27;connection&#x27;, onConnect);</pre>
  <p>В момент подключения нового клиента в onConnection передаётся объекта ws-соединения, через него сервер будет общаться с каждым конкретным клиентом.</p>
  <p>Функция onConnect принимает только один параметр, назовём его wsClient. В нашем конкретном примере мы подключим только два обработчика событий на объект wsClient: message и close.</p>
  <p><strong>message</strong> - обрабатывает событие входящего сообщения от клиента.</p>
  <p><strong>close</strong> - событие разрыва соединения с клиентом.</p>
  <p>В самом начале функции onConnect, выведем в консоль сообщение что новый пользователь в сети. И отправим клиенту приветственное сообщение</p>
  <p>Далее опишу заготовку для функции onConnect:</p>
  <pre>function onConnect(wsClient) {
  console.log(&#x27;Новый пользователь&#x27;);
  // отправка приветственного сообщения клиенту
  wsClient.send(&#x27;Привет&#x27;);
  
  wsClient.on(&#x27;message&#x27;, function(message) {
    /* обработчик сообщений от клиента */
  }
  
  wsClient.on(&#x27;close&#x27;, function() {
    // отправка уведомления в консоль
    console.log(&#x27;Пользователь отключился&#x27;);
  }
}</pre>
  <p>На событие <strong>close</strong> сервер выведет в консоль уведомление.</p>
  <p>Теперь напишем обработчик сообщений со стороны клиента. Договоримся, что команды сервер будет принимать в JSON-формате. JSON позволит отдельно указывать команду и параметры, а ответ сервера будет возвращаться в текстовом формате.</p>
  <p>Формат JSON команд от клиента:</p>
  <pre>{
  action: &#x27;ECHO&#x27; | &#x27;PING&#x27;,
  data?: string // необязательный параметр
}</pre>
  <p>Как видно из формата, сервер будет принимать две команды:</p>
  <ul>
    <li>echo-запрос, в ответ на который сервер отправит содержимое data</li>
    <li>ping, в ответ сервер отправит pong</li>
    <li>если команда не известна, сервер выведет в консоль уведомление &quot;Неизвестная команда&quot;</li>
  </ul>
  <p><strong>Содержимое обработчика сообщений от клиента:</strong></p>
  <pre>try {
  // сообщение пришло текстом, нужно конвертировать в JSON-формат
  const jsonMessage = JSON.parse(message);
  switch (jsonMessage) {
    case &#x27;ECHO&#x27;:
      wsClient.send(jsonMessage.data);
      break;
    case: &#x27;PING&#x27;:
      setTimeout(function() {
        wsClient.send(&#x27;PONG&#x27;);
      }, 2000);
      break;
    default:
      console.log(&#x27;Неизвестная команда&#x27;);
      break;
  }
} catch (error) {
  console.log(&#x27;Ошибка&#x27;, error);
}</pre>
  <p>Как вы уже видите, на команду PING сервер не сразу ответит, а подождёт 2 секунды.</p>
  <p>Добавим в конце файла server.js строку, которая выведет в консоль информацию, на каком порту запущен сервер.</p>
  <pre>console.log(&#x27;Сервер запущен на 9000 порту&#x27;);</pre>
  <h2>Запуск сервера</h2>
  <p>Для запуска сервера необходимо перейти в консоль и ввести команду:</p>
  <pre>node server.js</pre>
  <p>Сервер доступен локально по адресу <a href="ws://localhost:9000" target="_blank">ws://localhost:9000</a>. Остановить сервер можно сочетанием клавиш:</p>
  <ul>
    <li>Для Windows и Linux (Ctrl + C)</li>
    <li>Для MacOs (Cmd + C)</li>
  </ul>
  <p>Если хотите проверить работу сервера с другого устройства в рамках локальной сети, то откройте ещё одно окно консоли и запустите команду </p>
  <p>для Window:</p>
  <pre>ipconfig</pre>
  <p>для Linux и MacOS:</p>
  <pre>ifconfig</pre>
  <p>В моём случае локальный адрес <strong>192.168.0.15</strong>, значит из локальной сети сервер будет доступен по адресу <strong>ws://192.168.0.15:9000</strong>.</p>
  <h2>Проверка работы сервера</h2>
  <p>Чтобы протестировать работу сервера, откроем любую страницу в браузере и нажмём клавишу F12. Откроется DevTools, перейдём в консоль браузера и скопируем следующий код:</p>
  <pre>const myWs = new WebSocket(&#x27;ws://localhost:9000&#x27;);

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

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

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

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

]]></content:encoded></item></channel></rss>