Задать вопрос

Возможно ли сделать такое соединение (socket.io)?

Перед соединением через socket.io происходит авторизация. На этом этапе можно либо подтвердить соединение, либо отменить.

Я хочу сделать проверку по ip пользователя и в случае уже имеющегося соединения на этом ip, передать уже имеющийся объект на новое соединение, а старое закрыть.

Пример: пользователь на вкладке A заходит на веб-сайт, открывается ws-соединение и по нему идет информация. Затем пользователь во вкладке B заходит на тот же сайт. Вместо создания нового ws-соединения информация с вкладки A начинает поступать на вкладку B, при этом А закрывается.

Возможно так?

Думаю, если возможно, то это нужно сделать в этой функции:

io.set('authorization', function (handshakeData, callback) {
      // проверка по ip и настройка соединения
  });


я как не пробовал, у меня не получилось
  • Вопрос задан
  • 3336 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
А что сложного? Храните IP юзера и идентификатор сокета или ключ, что у вас там для идентификации сокетных соединений используется.

Если клиент отвалился - выбрасываем его из этого массива, если подцепился - старый хеш ключ заменяем новым (новая вкладка).

При соединении должна быть вызвана какая то функция авторизации, которая будет говорить "ок/нет". Ну и надо просто в каждый обработчик вставить проверку текущего идентификатора соединения на присутствие в массиве активных - если нет его, вызываем клиентский метод, в обработчике которого закрываем сокетное соединение с сервером и все.
Ответ написан
likerRr
@likerRr
front-end developer
Вам категорично надо, чтобы пользователя дисконектило, если он открывает новую вкладку?
В принципе вы все верно делаете. Но я бы рекомендовал sessions сделать не объектом, а массивом, где будут храниться объекты сессий. Исходя из этого получится что-то вроде этого:

Подключите в начале файла модуль underscore (библиотека underscore.js)
var _ = require('underscore');

Далее пишете в io.sockets.on('connection')
// массив сессий
var sessions = [],
      ip = ?; // ваша реализация

// проверяем, имеется ли уже активная сессия
var found = (_.find(sessions, function(session) {
     return session.ip === ip;
}));

// обновляем (не удаляем!) сессию, если нашли, сказав предыдущей вкладке "пока-пока"
if (found) {
      found.socket.emit('bye_bye', 'You are disconnected from server');
      found.socket.disconnect();
      found.socket = socket;
      found.ip = ip;
}
else {
      // добавляем сессию
      sessions.push({
             socket: socket,
             ip: ip
      });
}


Все это пишется в connection, т.к. в autzorizathion вы еще не подключены к сокету.

P.S. Код лишь не оптимизированный и не протестированный прототип
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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