JavaScript WebSocket — постійне з'єднання із сервером


WebSocketпостійне двобічне з'єднання із сервером: сервер може надіслати дані сам, не чекаючи запиту від браузера.

автор: NagarD

Загальний опис

Звичайний HTTP влаштований як допит: браузер питає — сервер відповідає. Щоб дізнатись про нове повідомлення в чаті, доводилось питати сервер щосекунди («а зараз? а зараз?») — це називали polling, і воно марно палило трафік і батарею.

Вебсокет перевертає модель: з'єднання відкривається один раз і лишається живим. Далі обидві сторони шлють повідомлення тоді, коли їм є що сказати.

Звідси й сфера: чати, сповіщення, спільне редагування, біржові котирування, онлайн-ігри.

Адреса починається з ws:// або (на HTTPS-сайті обов'язково) wss://.

автор: NagarD

Нотатка

З'єднання рветься — мережа зникла, сервер перезапустився. Робочий код завжди має обробник onclose із перепідключенням, інакше застосунок тихо «замерзне».

автор: NagarD

Синтаксис

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

методи

Метод Опис
send Надсилає повідомлення.
close Закриває з'єднання.

властивості

Властивість Опис
readyState Стан: 0 з'єднується, 1 відкрито, 2 закривається, 3 закрито.
url Адреса з'єднання.
bufferedAmount Байтів у черзі на відправлення.
binaryType Формат двійкових повідомлень: blob чи arraybuffer.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
WebSocket 16+ 11+ 7+ 12.1+ 12+ 10+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
WebSocket 4.4+ yes yes 6+

Приклади

+ запропонувати свій приклад у пісочниці

З'єднання з перепідключенням — так, як це має бути в житті.

function connect() {
    const socket = new WebSocket('wss://example.com/chat');

    socket.onopen = () => console.log('З\'єднано');

    socket.onmessage = event => {
        const message = JSON.parse(event.data);
        console.log(message.author + ':', message.text);
    };

    // з'єднання ЗАВЖДИ колись обірветься
    socket.onclose = () => {
        console.log('Розрив, пробуємо за 3 секунди');
        setTimeout(connect, 3000);
    };

    socket.onerror = error => console.error(error);

    return socket;
}

const socket = connect();

// надіслати можна будь-коли, доки з'єднання відкрите
if (socket.readyState === WebSocket.OPEN) {
    socket.send(JSON.stringify({ text: 'Привіт' }));
}
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід