another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как разрывать соединение с вебсокетом (Socket.IO + Redis + Laravel 5)?

Имеется сокет-сервер: socketio + ioredis.
При загрузке страницы создается соединение с сервером:
socket = io(socketURL);
socket.on('connect', function (user) {
    socket.emit('join');
});

В этом случае все работает как следует.

Проблема: при "переключении" чата инициализация сокета выполняется заново, то есть отрабатывает следующий код:
if (typeof socket != 'undefined') {
        console.log('We must drop the connection (disconnect) :<');
        socket.close();
    }
    socket = io(socketURL);

    socket.on('connect', function (user) {
        socket.emit('join');
    });

И теперь события начинают дублироваться. Количество переключений чатов увеличивает кратность событий, то есть сначала они дублируются, потом x4, x8 и так далее. Не могу понять что сделать нужно. Разорвать соединение?
При socket.close() с клиента на сервере исполняется:
socket.on('disconnect', function () {
     socket.close();
     return;
});

но это не разрывает соединение и эвенты продолжают дублироваться.
Количество повторений = количество соединений WS(скриншот). Как их правильно разорвать?

Спасибо.
  • Вопрос задан
  • 1045 просмотров
Решения вопроса 1
another_dream
@another_dream Автор вопроса
Backend-разработчик, Laravel/ZF2/Yii2
Решение.

На redis вешалось pmessage для отлавливания эвентов по паттерну. В вашем случае может быть просто message'
Выглядело так:
redis.on('pmessage', function (pattern, channel, message) {
    // some code
});

В моем случае помогло следующее:
// вешаем событие не через .on, а через .addListener
// onPmessage - коллбэк, который вынесен в функцию, в этом же пространстве имен
redis.addListener('pmessage', onPmessage);

Cобытие disconnect:
socket.on('disconnect', function () {
    redis.removeListener('pmessage', onPmessage);
});


Проблема исчерпана.

stackoverflow.com/questions/11617811/how-to-remove...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы