PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • Подписка
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • PurpleFlow
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюсPurpleMax
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • Подписка
    • AI для кодаНовое
    • Сообщество
    Главная
    Сообщество
    WebSocket: что это и как работает в реальных проектах

    WebSocket: что это и как работает в реальных проектах

    Аватар автора WebSocket: что это и как работает в реальных проектах

    Антон Ларичев

    Иконка календаря24 июня 2026
    websocketjavascriptnodejsreal-timebackendпротоколыjuniorИконка уровня junior
    Картинка поста WebSocket: что это и как работает в реальных проектах

    Введение

    Когда пользователь открывает чат или смотрит на обновляющийся в реальном времени дашборд, за этим стоит особый протокол — WebSocket. В отличие от стандартного HTTP, он позволяет серверу и клиенту обмениваться данными без постоянных запросов. В этой статье разберём, что такое WebSocket, как устроено соединение изнутри, и напишем простой пример на Node.js.

    Что такое WebSocket

    WebSocket — это протокол двусторонней связи поверх TCP, стандартизированный в RFC 6455. Он решает фундаментальную проблему HTTP: клиент всегда должен инициировать запрос, а сервер не может сам «отправить» данные.

    С WebSocket соединение устанавливается один раз и остаётся открытым. Обе стороны могут отправлять сообщения в любой момент — это называется full-duplex (полнодуплексная) связь.

    Типичные сценарии применения:

    • чаты и мессенджеры
    • онлайн-игры
    • торговые терминалы с котировками в реальном времени
    • совместное редактирование документов
    • push-уведомления и live-обновления

    Как работает WebSocket

    Handshake — установка соединения

    WebSocket начинается с обычного HTTP-запроса. Клиент отправляет заголовки с просьбой «обновить» соединение:

    GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Sec-WebSocket-Version: 13

    Сервер отвечает кодом 101 Switching Protocols:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

    После этого HTTP-соединение «превращается» в WebSocket. Никакого нового TCP-соединения не создаётся — используется то же самое.

    Обмен данными — фреймы

    Данные передаются в виде фреймов (frames). Каждый фрейм содержит:

    • тип данных (текст, бинарные данные, ping/pong, закрытие соединения)
    • длину полезной нагрузки
    • маску (клиент обязан маскировать данные, сервер — нет)

    Для прикладной разработки детали фреймирования скрыты библиотеками, но понимать их полезно при отладке трафика в DevTools.

    Реализация на Node.js

    Для работы с WebSocket в Node.js чаще всего используют библиотеку ws.

    npm install ws

    Серверная часть

    const { WebSocketServer } = require('ws');
    
    // Создаём WebSocket-сервер на порту 8080
    const wss = new WebSocketServer({ port: 8080 });
    
    wss.on('connection', (socket) => {
      console.log('Клиент подключился');
    
      // Обрабатываем входящие сообщения
      socket.on('message', (data) => {
        const message = data.toString();
        console.log('Получено:', message);
    
        // Рассылаем сообщение всем подключённым клиентам
        wss.clients.forEach((client) => {
          if (client.readyState === client.OPEN) {
            client.send(`Эхо: ${message}`);
          }
        });
      });
    
      socket.on('close', () => {
        console.log('Клиент отключился');
      });
    
      // Отправляем приветствие сразу при подключении
      socket.send('Добро пожаловать в чат!');
    });

    Клиентская часть

    В браузере WebSocket поддерживается нативно через встроенный API — никаких библиотек не нужно:

    // Подключаемся к серверу
    const socket = new WebSocket('ws://localhost:8080');
    
    // Соединение успешно установлено
    socket.addEventListener('open', () => {
      console.log('Соединение установлено');
      socket.send('Привет, сервер!');
    });
    
    // Получаем сообщения от сервера
    socket.addEventListener('message', (event) => {
      console.log('Сообщение от сервера:', event.data);
    });
    
    // Соединение закрыто
    socket.addEventListener('close', (event) => {
      console.log('Соединение закрыто, код:', event.code);
    });
    
    // Ошибки соединения
    socket.addEventListener('error', (error) => {
      console.error('Ошибка WebSocket:', error);
    });

    Сравнение с HTTP

    ХарактеристикаHTTPWebSocket
    Инициатор запросаТолько клиентКлиент и сервер
    СоединениеНовое на каждый запросОдно постоянное
    Накладные расходыЗаголовки на каждый запросМинимальные фреймы
    КэшированиеПоддерживаетсяНе применимо
    Подходит дляREST API, загрузка страницReal-time данные

    Для сценариев, где сервер отправляет обновления, а клиент только слушает, стоит также рассмотреть Server-Sent Events (SSE) — более простой протокол поверх обычного HTTP.

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

    Нет обработчика события error. Без него приложение упадёт с необработанным исключением при сетевом сбое. Всегда добавляйте socket.on('error', handler) на сервере.

    Не закрывать «мёртвые» соединения. Если клиент закрывает вкладку без явного закрытия соединения, оно остаётся в wss.clients до таймаута. Используйте механизм ping/pong:

    // Проверяем живость клиентов каждые 30 секунд
    const interval = setInterval(() => {
      wss.clients.forEach((client) => {
        if (client.isAlive === false) {
          return client.terminate(); // Закрываем зависшее соединение
        }
        client.isAlive = false;
        client.ping();
      });
    }, 30000);
    
    wss.on('connection', (socket) => {
      socket.isAlive = true;
      // Клиент ответил на ping — он жив
      socket.on('pong', () => {
        socket.isAlive = true;
      });
    });

    Отправка без проверки состояния. Вызов socket.send() на закрытом соединении выбрасывает ошибку. Перед отправкой всегда проверяйте socket.readyState === WebSocket.OPEN.

    Игнорирование масштабирования. При горизонтальном масштабировании клиент на сервере A не получит сообщение, отправленное сервером B. Для решения используют брокеры сообщений — Redis Pub/Sub или RabbitMQ.

    Заключение

    WebSocket решает задачу двусторонней коммуникации в реальном времени, которую HTTP решить не может. Одно постоянное соединение вместо сотен запросов даёт низкую задержку и высокую эффективность. Библиотека ws делает реализацию в Node.js простой: несколько строк кода — и у вас работающий сервер. Главное — помнить об обработке ошибок, ping/pong для обнаружения разорванных соединений и про архитектурные ограничения при масштабировании на несколько инстансов.

    Иконка глаза776

    Комментарии

    0
    Бесплатный курс

    Учитесь программировать с AI-агентом — бесплатно

    Курс «AI в обучении: OpenCode и skills»: поставите агента и разберёте с ним любую тему — как эту статью.

    opencode

    >объясни этот код и дай задачу

    ◆Читаю src/server.ts…

    ✓Разбор готов: 4 шага

    ✓Задача → practice/01.md

    • Установка и настройка OpenCode
    • Агент и skills на практике
    • 13 уроков, 3 модуля
    Начать бесплатно

    0 ₽ · доступ сразу после регистрации

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    TypeScript с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    React и Redux Toolkit

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Neovim

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Как установить OpenCode на Windows
    Иконка аватараАнтон
    Иконка календаря06 ноября 2026
    AI-инструментыapiразработкаjuniorИконка уровня junior

    Как установить OpenCode на Windows

    Как установить OpenCode на Windows через npm, Chocolatey, Scoop или WSL, задать ключ в PowerShell, подключить модель из России и исправить частые ошибки.

    Иконка чипа0
    Иконка глаза35
    Иконка комментариев0
    Картинка поста Claude не работает или не открывается: причины и решения
    Иконка аватараАнтон
    Иконка календаря05 ноября 2026
    AnthropicAI-инструментыClaude CodejuniorИконка уровня junior

    Claude не работает или не открывается: причины и решения

    Почему Claude не работает или не открывается: сбой Anthropic, регион, сеть, аккаунт или лимит. Как найти причину по симптому и что делать из России.

    Иконка чипа0
    Иконка глаза368
    Иконка комментариев0
    Картинка поста Как установить Claude на компьютер в России
    Иконка аватараАнтон
    Иконка календаря04 ноября 2026
    AnthropicAI-инструментыClaude CodejuniorИконка уровня junior

    Как установить Claude на компьютер в России

    Как установить Claude Desktop и Claude Code на Windows, macOS и Linux из России: где скачать, почему приложение не работает и как подключиться без VPN.

    Иконка чипа0
    Иконка глаза511
    Иконка комментариев0
    Иконка чипа0