2016-01-27 4 views
1

Как мне получить socket.id другого пользователя?Как получить других пользователей socket.id?

Поскольку socket.id постоянно изменяется, всякий раз, когда браузер обновляется или отключается, подключитесь снова.

Например, эта строка кода будет решить мою проблему

socket.broadcast.to(id).emit('my message', msg);

Но вопрос Как я могу получить этот идентификатор?

Пусть говорит Джек хочет послать сообщение Ионов

Джек будет использовать код выше, чтобы отправить сообщение, но как получить сокет идентификатора Ионов?

Просто для записи, я уже реализован socket.io и passport библиотеку, так что я мог бы использовать сессию в socket.io, библиотека называют passport-socket.io. Таким образом, чтобы получить идентификатор пользователя в Socket.io будет

socket.request.user._id 

ответ

0

документация предполагает, что `socket.on (обратный вызов SOME_MESSAGE в предоставляется идентификатор как кулак пары.

http://socket.io/docs/rooms-and-namespaces/#default-room

javascript io.on('connection', function(socket){ socket.on('say to someone', function(id, msg){ socket.broadcast.to(id).emit('my message', msg); }); });

+0

ID от клиента? –

+0

Я уверен, и если не все сокеты должны иметь идентификатор в соответствии с документами http://socket.io/docs/server-api/#socket#id:string – dm03514

+1

Я знаю, что все сокеты будут иметь идентификатор , но вопрос в том, как я могу получить идентификатор пользователя другого пользователя? потому что socket.id будет продолжать меняться, и его неплохо использовать –

2

Что я сделал для этого - это поддерживать модель базы данных (я использовал mongoose), содержащую userId и socketId подключенных пользователей. Вы даже можете сделать это с помощью глобального массива. С клиентской стороны в сокете подключиться, испустить канун нт вместе с USERID

socket.on('connect', function() { 
    socket.emit('connected', userName); //userName is unique 
}) 

На стороне сервера,

var Connect = require('mongoose').model('connect');; /* connect is mongoose model i used to store currently connected users info*/ 
socket.on('connected', function(user) { // add user data on connection 
    var c=new Connect({ 
     socketId : socket.id, 
     client : user 
    }) 
    c.save(function (err, data) { 
     if (err) console.log(err); 
    }); 
}) 
socket.on('disconnect', function() { //remove user data from model when a socket disconnects 
    Connect.findOne({socketId : socket.id}).remove().exec(); 
}) 

Таким образом, всегда соединили данные пользователя (в настоящее время используется socketId), хранящиеся. Всякий раз, когда вам нужно, чтобы получить пользователь тока socketId извлекать его как

Connect.findOne({client : userNameOfUserToFind}).exec(function(err,res) { 
    if(res!=null) 
     io.to(res.socketId).emit('my message', msg); 
}) 

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