Как проверить, что сокет жив (подключен) в socket.io с несколькими узлами и socket.io-redis


person John Nguyen    schedule 01.04.2015    source источник
comment
Привет, ты нашел какое-нибудь решение? У меня такой же вариант использования.   -  person Abdul Basit    schedule 25.07.2019


Ответы (4)


Как я могу проверить, что сокет активен (подключен) с помощью socketid Я попробовал namespace.connected [socketid], он работает только для текущего процесса.

Как вы сказали, отдельный процесс означает, что сокеты регистрируются только в том процессе, к которому они впервые подключились. Для подключения всех узлов вместе, и вы можете транслировать событие каждый раз, когда клиент подключается / отключается, чтобы каждый узел имел обновленный список всех клиентов в реальном времени.

person Tristan Foureur    schedule 11.04.2015
comment
Привет, я имею в виду, что хочу проверить, подключен ли сокет к socketid. это не означает, что розетка подключена или нет. Ваш подход не может решить 2 проблемы: 1. У меня есть socketid, я хочу проверить, подключен ли сокет или нет? 2. Событие подключения и отключения будет запускаться асинхронно. возможно, на самом деле он сначала подключается, а затем отключается, но на сервере по многим причинам сначала срабатывает событие отключения, а затем подключается. Так что на самом деле он отключен, но на сервере он подключен - person John Nguyen; 13.04.2015
comment
Пожалуйста, обновите свой комментарий, так как я не совсем понимаю, что вы пытаетесь сделать. Каждый узел не должен иметь все socketIds, но это нормально, если один узел запрашивает все узлы с socketId, чтобы узнать, есть ли он там. Просто добавьте уровень связи между вашими узлами, если вы действительно хотите запрашивать через socketid. - person Tristan Foureur; 15.04.2015
comment
Я пытаюсь сделать: в функции на 1 узле я хочу запросить с помощью socketid, что этот сокет подключен или отключен. Нелегко создать уровень связи между узлами путем отправки сообщения всем узлам и получения возвращаемого значения для проверки подключения или отключения сокета. вы можете ссылаться на socket.io/docs / rooms-and-namespaces / - person John Nguyen; 15.04.2015
comment
Если возможно, вы можете дать мне фрагмент кода, по идее, это легко, но на самом деле это так сложно, спасибо - person John Nguyen; 15.04.2015

Посетите здесь

как упоминалось выше, вы должны использовать socket.io-redis, чтобы он работал на нескольких узлах.

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
person vromanch    schedule 15.04.2015
comment
Я использую его (socket.io-redis), думаю, вы не поняли мой вопрос. Я пытаюсь сделать: в функции на 1 узле (на стороне сервера) я хочу запросить с помощью socketid, что этот сокет подключен или отключен - person John Nguyen; 16.04.2015
comment
все верно. socket.io по умолчанию использует сеансы, которые не используются для нескольких экземпляров приложения. Общая память сделает свое дело (redis, mongodb, любое хранилище ...). socket.io-redis - это единственный интерфейс для взаимодействия с redis. убедитесь, что вы настроили тот же префикс. попробуйте любой графический интерфейс Redis, чтобы посмотреть и протестировать его локально (также вы можете получить любую информацию по идентификатору сокета непосредственно из хранилища Redis) - person vromanch; 16.04.2015
comment
Если возможно, вы можете дать мне фрагмент кода. Пытался долго, но безуспешно - person John Nguyen; 16.04.2015

У меня была та же проблема, но решения не было для меня. Итак, я сделал журнал клиента, чтобы увидеть различные методы и переменные, которые я могу использовать. есть свойство client.conn.readystate для состояния соединения «открыто / закрыто» и функция client.onclose() для фиксации закрытия соединения.

const server = require('http').createServer(app);
const io = require('socket.io')(server);
let clients = [];
io.on('connection', (client)=>{
    clients.push(client);
    console.log(client.conn.readyState);
    client.onclose = ()=>{
        // do something
        console.log(client.conn.readyState);
        clients.splice(clients.indexOf(client),1);
    }
});
person Taur    schedule 03.11.2019

При развертывании приложения Socket.IO в многоузловом кластере, то есть на нескольких серверах SocketIO, необходимо позаботиться о двух вещах:

Использование адаптера Redis и Включение функции закрепления сеанса: когда запрос приходит от клиента SocketIO (браузера) к вашему приложению, он связывается с определенным идентификатором сеанса, эти запросы должны быть связаны с тем же процессом (Pod в Kubernetes), который создал их идентификаторы.

вы можете узнать больше об этом из этой истории Medium (исходный код доступен) https://saphidev.medium.com/socketio-redis-at-a-scalable-gke-cluster-with-github-workflows-844318f80ce

person safi eddine    schedule 29.01.2021