我如何获得其他用户socket.id?

我如何获得其他用户的socket.id?

由于socket.id不断更新,每当浏览器刷新或断开,然后再次连接。

例如这行代码将解决我的问题

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

但问题是我如何得到该ID?

比方说,杰克想要给约拿发信息

杰克将使用上面的代码发送消息,但如何获得约拿的套接字ID?

为了logging,我已经实现了socket.iopassport库,以便我可以在socket.io使用session,库调用passport-socket.io 。 所以得到socket.io中的用户ID将是

 socket.request.user._id 

我所做的是维护一个数据库模型(我使用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); }) 

我在这里使用mongoose,但你甚至可以在这里使用一个数组,并使用filter从数组中获取用户的socketId。

文档build议`socket.on(SOME_MESSAGE的callback提供了一个id作为拳头参数。

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); }); });