@KBsts

Почему происходит переподсоединение к веб-сокету Ratchet?

С помощью веб-сокетов хочу поддерживать статус юзеров - онлайн. Когда юзер закрывает сайт, то он - оффлайн.

При авторизации или обновлении страницы выводится вот что в Консоли браузера:
Socket is closed. Reconnect will be attempted in 3 seconds. wss.js:40:9
open connection wss.js:12:9
Socket is closed. Reconnect will be attempted in 3 seconds. wss.js:40:9
reconnect wss.js:43:13
open connection


При этом изначально PHP срабатывает нормально, выставляя в MySQL соответствующее значение поля `online` = '1', но через мгновение сбрасывает на 0. С логикой кода всё в порядке. А вот что-то мешает правильно сработать всему механизму.

Что это может быть? В каком направлении копать? Как лучше сделать дебаг? Что вывести в консоль дополнительного?

Сам <script src="/assets/js/ws/wss.js"> лучше вставлять в meta, в самом начале body или в самом конце всего кода?

Прошу сильно не пинать, я в сокетах, жс - новичок

//var ghost = window.location.hostname;
const WS_URL = 'wss://mywebsite.com/wss2/';
var checker = null;
var socket = null;
const RECONNECT_TIME = 3000;

function connect() {

    socket = new WebSocket(WS_URL);

    socket.onopen = function () {
        console.info('open connection');
    };

    socket.onmessage = function (e) {
        var response = $.parseJSON(e.data);
        if (response.counters) {
            if (response.counters.notification == '0') {
                response.counters.notification = '';
            }
            if (response.counters.message == '0') {
                response.counters.message = '';
            }

            if (response.counters.err == 'true') {
                window.location = '/my/exit/';
                return false;
            }

            $("span#countNotifications").html(response.counters.notification);
            $("span#countMessages").html(response.counters.message);
        }

        setTimeout(function () {
            counters(userHash);
        }, 1500);
    };

    socket.onclose = function (e) {
        console.info('Socket is closed. Reconnect will be attempted in ' + RECONNECT_TIME / 1000 + ' seconds.', e.reason);

        setTimeout(function () {
            console.info('reconnect');
            connect();
        }, RECONNECT_TIME);

        clearTimeout(checker);
    };

    socket.onerror = function (err) {
        console.error('Socket encountered error: ', err.message ? err.message : 'undefined. ', 'Closing socket if open');
        if (socket.readyState !== socket.CLOSED) socket.close()
    };
}

connect();

function counters(userhash) {

    userHash = userhash;

    if (socket.readyState === socket.OPEN) {
        socket.send(JSON.stringify({function_ws: 'notificationCount', userToken: userhash}));
        //console.log('T: '+userhash);
    }else{
        setTimeout(function () {
            counters(userhash);
        }, 1000);
    }

}
  • Вопрос задан
  • 284 просмотра
Пригласить эксперта
Ответы на вопрос 1
@LemonFox
stateless mind
Посмотрите на параметр enableKeepAlive у ws-сервера ratchet (без него не будут посылаться ping/pong сообщения для поддержания связи, см. спецификацию ws).
Плюс вы должны понимать что ws-соединение будет устанавливаться для каждой вкладки отдельно и по-хорошему вам нужно учесть этот момент тоже.

upd,
Плюс смотрите что приходит при onClose
socket.onclose = function(event) {
  if (event.wasClean) {
    alert('Соединение закрыто чисто');
  } else {
    alert('Обрыв соединения'); // например, "убит" процесс сервера
  }
  alert('Код: ' + event.code + ' причина: ' + event.reason);
};

https://learn.javascript.ru/websockets

Плюс выводить в консоль/пишите в log события сервера onClose/onError - поможет в отладке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы