2015-04-01 5 views
11

Я использую socket.io с несколькими узлами, socket.io-redis и nginx. Я следовать этому руководству: http://socket.io/docs/using-multiple-nodes/Как проверить, что сокет жив (подключен) в socket.io с несколькими узлами и socket.io-redis

я пытаюсь сделать: На функции (сайт сервера), я хочу, чтобы запросить по socketid, что этот разъем подключен или отключить

Я попытался io.of('namespace').connected[socketid], это работает только для тока (это означает, что он может проверять только текущий процесс).

Кто-нибудь может мне помочь? Благодарим за продвижение.

ответ

5

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

Как вы сказали, отдельный процесс означает, что сокеты зарегистрированы только в процессе, с которым они впервые подключились. Вам нужно использовать socket.io-redis для , соединяя все ваши узлы, и что вы можете сделать, это транслировать событие каждый раз, когда клиент подключается/отключается, так что каждый узел имеет обновленный список всех клиентов в режиме реального времени.

+0

Привет, я имею в виду, что я хочу проверить разъем подключен или нет с socketid. это не означает, что контрольный разъем подключен или нет. ваш подход не может решить проблему 2: 1. У меня есть socketid, я хочу проверить, есть ли сокет подключен или нет? 2. Событие connect and disconnect будет асинхронно срабатывать. возможно, на самом деле. Сначала он подключается и отключается, но на сервере по многим причинам сначала отключается событие отключения и подключается позже. Так что на самом деле это отключается, но на сервере он подключен –

+0

Пожалуйста, обновите свой комментарий, поскольку я не совсем понимаю, что вы пытаетесь сделать. Каждый узел ** не должен ** иметь все сокеты, но это нормально, если ** один узел ** запрашивает все узлы с идентификатором socketId, чтобы узнать, есть ли он там. Просто добавьте слой связи между вашими узлами, если вы действительно хотите запросить сокет. –

+0

Я пытаюсь сделать: При использовании функции на одном узле я хочу запросить сокетайд, чтобы этот сокет был подключен или отключен. Нелегко сделать слой связи между узлами, отправив сообщение всем узлам и получить возвращаемое значение, чтобы проверить, что сокет подключен или отключен. вы можете ссылаться на http://socket.io/docs/rooms-and-namespaces/#sending-messages-from-the-outside-world –

2

Заканчивать here

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

var io = require('socket.io')(3000); 
var redis = require('socket.io-redis'); 
io.adapter(redis({ host: 'localhost', port: 6379 })); 
+0

Я использую его (socket.io-redis), я думаю, вы не понимаете мой вопрос. Я пытаюсь сделать: При функции на 1 узле (на стороне сервера), я хочу запросить сокетки, что этот сокет подключен или отключен –

+0

все правильно. socket.io использует сеансы по умолчанию, которые не разделяются несколькими экземплярами приложения. Общая память сделает трюк (redis, mongodb, любое хранилище ...). socket.io-redis - это только интерфейс для взаимодействия с redis. убедитесь, что вы настроили один и тот же префикс. попробуйте любой графический интерфейс redis, чтобы смотреть и тестировать его локально (также вы можете получить любую информацию по идентификатору сокета непосредственно из redis storage) –

+0

Если возможно, вы можете дать мне код фрагмента. Пробовал долгое время, но не успел –