← Назад к вопросам

Какие знаешь события Web Socket?

1.0 Junior🔥 132 комментариев
#Soft Skills и рабочие процессы

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

События WebSocket API

WebSocket API предоставляет ряд стандартных событий, которые позволяют реагировать на различные этапы жизненного цикла соединения и передачу данных. Вот основные события, которые разработчики Frontend должны знать и обрабатывать:

Основные события объекта WebSocket

1. open

Срабатывает при успешном установлении соединения с сервером.

const socket = new WebSocket('wss://api.example.com');

socket.addEventListener('open', (event) => {
    console.log('Соединение установлено');
    socket.send(JSON.stringify({ type: 'hello' }));
});

2. message

Наиболее важное событие, возникающее при получении данных от сервера.

socket.addEventListener('message', (event) => {
    // Данные могут быть в разных форматах
    if (typeof event.data === 'string') {
        const data = JSON.parse(event.data);
        console.log('Получены данные:', data);
    } else if (event.data instanceof Blob) {
        // Обработка бинарных данных
        console.log('Получен Blob');
    }
});

3. error

Происходит при возникновении ошибки в соединении.

socket.addEventListener('error', (error) => {
    console.error('WebSocket ошибка:', error);
    // Соединение автоматически закрывается при ошибке
});

4. close

Срабатывает при закрытии соединения, как запланированном, так и при ошибке.

socket.addEventListener('close', (event) => {
    console.log(`Соединение закрыто. Код: ${event.code}, Причина: ${event.reason}`);
    
    // event содержит важные свойства:
    // - code: числовой код закрытия
    // - reason: строка с объяснением
    // - wasClean: булево значение, указывающее было ли закрытие "чистым"
    
    if (!event.wasClean) {
        console.warn('Соединение разорвано неожиданно');
        // Можно реализовать переподключение
    }
});

Коды закрытия соединения (CloseEvent.code)

В событии close важную роль играют стандартные коды:

  • 1000 - Нормальное закрытие
  • 1001 - Уход со стороны сервера
  • 1002 - Протокольная ошибка
  • 1003 - Неподдерживаемый тип данных
  • 1005 - Без кода статуса (браузерный)
  • 1006 - Ненормальное закрытие
  • 1007 - Несогласованные данные
  • 1008 - Нарушение политики
  • 1009 - Слишком большое сообщение
  • 1011 - Непредвиденная ошибка сервера

Практические аспекты обработки событий

Обработка бинарных данных

socket.binaryType = 'arraybuffer'; // или 'blob'

socket.addEventListener('message', (event) => {
    if (event.data instanceof ArrayBuffer) {
        const buffer = new Uint8Array(event.data);
        // Обработка бинарных данных
    }
});

Управление состоянием соединения

class WebSocketManager {
    constructor(url) {
        this.socket = null;
        this.url = url;
        this.reconnectAttempts = 0;
        this.maxReconnectAttempts = 5;
        
        this.init();
    }
    
    init() {
        this.socket = new WebSocket(this.url);
        
        this.socket.onopen = () => {
            console.log('Connected');
            this.reconnectAttempts = 0;
        };
        
        this.socket.onclose = (event) => {
            console.log('Disconnected');
            this.handleReconnection();
        };
        
        this.socket.onerror = (error) => {
            console.error('WebSocket error:', error);
        };
    }
    
    handleReconnection() {
        if (this.reconnectAttempts < this.maxReconnectAttempts) {
            this.reconnectAttempts++;
            setTimeout(() => this.init(), 1000 * this.reconnectAttempts);
        }
    }
}

Рекомендации по использованию

  1. Всегда обрабатывайте все события - даже если кажется, что некоторые из них не нужны
  2. Используйте addEventListener вместо свойств on*** - это позволяет добавлять несколько обработчиков
  3. Проверяйте состояние соединения перед отправкой данных:
    if (socket.readyState === WebSocket.OPEN) {
        socket.send(data);
    }
    
  4. Реализуйте механизм переподключения для обработки разрывов соединения
  5. Обрабатывайте бинарные и текстовые данные отдельно
  6. Всегда закрывайте соединение корректно:
    socket.close(1000, 'Пользователь покинул страницу');
    

Состояния соединения (readyState)

Хотя это не события, но тесно связаны:

  • CONNECTING (0) - Соединение еще не открыто
  • OPEN (1) - Соединение открыто и готово к обмену
  • CLOSING (2) - Соединение в процессе закрытия
  • CLOSED (3) - Соединение закрыто или не может быть открыто

Понимание и правильная обработка этих событий WebSocket критически важна для создания надежных real-time приложений, обеспечивая стабильную связь между клиентом и сервером даже в условиях нестабильного сетевого соединения.

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

События WebSocket в веб-разработке

При работе с WebSocket API в браузере используется объект WebSocket, который предоставляет ряд стандартных событий, позволяющих реагировать на различные этапы жизненного цикла соединения и передачи данных. Эти события обрабатываются через механизм event listeners, аналогично другим DOM-событиям. Вот основные события, с которыми приходится работать:

Ключевые события объекта WebSocket

1. open (Событие открытия соединения)

Срабатывает, когда соединение по протоколу WebSocket успешно установлено. На этом этапе готовность к обмену данными (readyState) переходит в состояние OPEN (значение 1).

const socket = new WebSocket('wss://api.example.com/ws');

socket.addEventListener('open', (event) => {
    console.log('Соединение установлено');
    // Теперь можно отправлять данные
    socket.send(JSON.stringify({ type: 'greeting', message: 'Hello Server' }));
});

2. message (Событие получения сообщения)

Наиболее часто используемое событие. Срабатывает при получении данных от сервера. Данные доступны в свойстве event.data. В зависимости от формата, это может быть строка, Blob или ArrayBuffer.

socket.addEventListener('message', (event) => {
    // Предполагаем, что сервер отправляет JSON
    try {
        const data = JSON.parse(event.data);
        console.log('Получено от сервера:', data);
        // Обработка данных: обновление UI, логика приложения и т.д.
    } catch (error) {
        console.log('Получен текст:', event.data);
    }
});

3. error (Событие ошибки)

Срабатывает при возникновении любой ошибки, связанной с соединением WebSocket (например, проблемы с сетью, неверный URL, сбои на сервере). Это критическое событие, после которого соединение обычно закрывается.

socket.addEventListener('error', (event) => {
    console.error('Произошла ошибка WebSocket:', event);
    // Можно попытаться переподключиться или показать сообщение пользователю
});

4. close (Событие закрытия соединения)

Срабатывает, когда соединение закрывается. Это может происходить как по инициативе клиента или сервера, так и из-за ошибок. Важно анализировать код закрытия (event.code) и причину (event.reason) для корректной обработки.

socket.addEventListener('close', (event) => {
    console.log(`Соединение закрыто. Код: ${event.code}, Причина: ${event.reason || 'не указана'}`);
    
    // Пример логики в зависимости от кода
    if (event.code === 1006) {
        console.log('Аномальное закрытие. Возможно, проблемы с сетью.');
        // Реализация повторного подключения
    }
});

Дополнительные аспекты и best practices

Коды закрытия (event.code)

При обработке события close особенно важны стандартные коды:

  • 1000 – нормальное закрытие.
  • 1001 – удаленная сторона "уходит" (например, сервер завершает работу).
  • 1006 – аномальное закрытие (часто из-за потери соединения).
  • 1011 – внутренняя ошибка сервера.

Практические шаблоны использования

  • Обертка для управления состоянием: Часто создают класс или модуль-менеджер для WebSocket, который инкапсулирует обработку событий, управляет переподключением и состоянием приложения.
  • Heartbeat (пульсация): Для поддержания активного соединения и обнаружения "висящих" каналов используют периодическую отправку ping-сообщений.
// Пример простого heartbeat
let pingInterval;

socket.addEventListener('open', () => {
    pingInterval = setInterval(() => {
        if (socket.readyState === WebSocket.OPEN) {
            socket.send(JSON.stringify({ type: 'ping' }));
        }
    }, 30000);
});

socket.addEventListener('close', () => {
    clearInterval(pingInterval);
});
  • Буферизация сообщений: При отправке данных до наступления события open, сообщения можно буферизировать.
class BufferedWebSocket {
    constructor(url) {
        this.url = url;
        this.buffer = [];
        this.connect();
    }
    
    connect() {
        this.socket = new WebSocket(this.url);
        this.socket.addEventListener('open', () => {
            this.buffer.forEach(msg => this.socket.send(msg));
            this.buffer = [];
        });
        // ... обработка других событий
    }
    
    send(data) {
        if (this.socket.readyState === WebSocket.OPEN) {
            this.socket.send(data);
        } else {
            this.buffer.push(data);
        }
    }
}

Особенности реализации в разных средах

Стоит отметить, что в Node.js (при использовании библиотек типа ws) события могут иметь схожие названия, но работать с ними нужно через методы .on(). Также, при использовании фреймворков (например, Socket.IO), поверхностный API событий может отличаться, но базовые принципы (connect, message, disconnect) остаются.

Понимание и грамотная обработка этих событий — основа создания стабильных, отзывчивых реальных (real-time) приложений, будь то чаты, биржевые тикеры, онлайн-игры или collaborative tools. Ключ к надежности — предвидение сетевых проблем через обработку error и close, и реализация стратегий reconnection с экспоненциальной задержкой (exponential backoff).

Какие знаешь события Web Socket? | PrepBro