Пользователь + socket.io, как подключить этого же пользователя в разных вкладках браузера?

Здравствуйте!

При открытии новой вкладки в браузере, создается новое соединение с серной частью чата на socket.io. Возник такой вопрос. Если каждый раз, при открытии нового окна браузера, устанавливается новое соединение с уникальным идентификатором сокета - socket.id, то как реализовать, чтобы после авторизации, если пользователь открыл несколько вкладок, показывался его же никнейм?

Т.е. пользователь подключился в одной вкладке. На сервере сохранился в массив его логин. Пользователь открывает вторую вкладку, куки уже поставлены в предыдущей. Но, получается, что одному пользователю соответствует несколько socket.id или это нормально?

1 - подключение --- Vasa - socket.id = fgkjdfhsjg
2 - подключение --- Vasa - socket.id = safjdlksad

Или же, можно как-то по-другому реализовать подключение одного клиента, чтобы не рвать соединение в предыдущей вкладке?
  • Вопрос задан
  • 5003 просмотра
Решения вопроса 1
@globalmac
Socket.io действительно генерирует каждому подключению свой уникальный handshake и это правильно и в порядке вещей.
Если интересует вывод пользователей онлайн в списке на сайте, например, то решить проблему можно при помощи callback() функции.
Мы будем передавать на сигналер-сервер user_id, например через PHP и затем проверять, есть ли этот user_id в массиве подключенных пользователей.
Пример server.js:
userlist = {}; // Массив юзеров
io.sockets.on('connection', function(socket) {
	socket.on('connect', function(data, callback) {
		socket.user_id = data.user_id; // в user_id передаём идентификатор пользователя
		if(socket.user_id in userlist) {
		    callback(false); // Ага, этот юзер уже открыл вкладку, значит ничего не делаем
		} else {
		    callback(true); // А вот тут он новенький
		    userlist[socket.user_id] = data; // Фигачим его в массив
		    UpdateUserList(); // Обновляем список онлайн юзеров
		} 
	});
        // При дисконнекте
        socket.on('disconnect', function() {
             delete userlist[socket.user_id];
             // Тут немного магии, чтобы юзеры в списке онлайн на клиенте не моргали, когда например они ходят по ссылкам сайта
             setTimeout(function () {
                 UpdateUserList();
             }, 1000);
        });
    
        function UpdateUserList() {
		io.sockets.emit('updateusers', userlist);
	}
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Burgul
Но, получается, что одному пользователю соответствует несколько socket.id или это нормально?


Это нормально. socket.io в любом случае надо каждое подключение назвать уникально, чтобы можно было с ним работать отдельно не зависимо от того, есть ли такой логин в Вашем массиве или нет.
Ответ написан
Ваш ответ на вопрос

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

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