Socket.IO,导航器选项卡的问题

我正在使用Socket.IO,我发现一个很大的问题。 我试图做一个实时聊天:用户login,select另一个用户连接和交谈,所以(…)

var http = require('http'), fs = require('fs'), path = require('path'), io, server; var PORT = 3000, HOST = '127.0.0.1'; server = http.createServer( function ( request, response ) { var filePath = '.' + request.url, extName, contentType; if (filePath == './') { filePath = './index.html'; } extName = path.extname(filePath); contentType = 'text/html'; switch ( extName ) { case '.js': contentType = 'text/javascript'; break; case '.css': contentType = 'text/css'; break; } fs.exists( filePath, function ( exists ) { if ( exists ) { fs.readFile( filePath, function ( error, content ) { if ( error ) { response.writeHead( 500 ); response.end(); } else { response.writeHead( 200, { 'Content-Type': contentType }); response.end( content, 'utf-8' ); } }); } else { response.writeHead( 404 ); response.end(); } }); }).listen( PORT, HOST ); io = require('socket.io').listen( server ); var Users = [ ]; // List of users io.sockets.on('connection', function ( socket ) { var user = { }; // The user socket.on('newUser', function ( data ) { user.userName = data.name, // Selected name user.userId = socket.id; // The socket id Users.push( user ); socket.emit('me', user); // Emit the user object socket.emit('userList', { users : Users }); // Emit the user list }); socket.on('disconnect', function () { Users.remove( user ); // Delete from the user list socket.emit('userList', { users : Users }); // emit again the user list for refresh }); socket.on('clientMessage', function ( data ) { io.sockets.socket(data.to).emit('newMessage', { // data.to is the socket ID that a message is sent "from" : data.from, "message" : data.message, "date" : new Date() }); }); }); 

这是问题所在。 一些用户连接,服务器分配一个id(socket.id),但是如果同一个用户在同一个导航器中打开更多的标签,那么socket.id将会改变,这样用户将不会在其他标签中收到这个消息。

我想为所有logging用户打开的标签存储相同的socket.id; 所以,如果该用户收到任何消息,将显示在所有选项卡中。

¿解决scheme?

唯一的办法是做一个数组,每个用户的所有socketID,并发送给所有他们,如果有一个特定的消息给该用户…我有一个类似的问题,这就是我的解决scheme用过的

 socket.on('newUser', function ( data ) { user.userName = data.name, // Selected name if ( !user.userId ) user.userId = {}; user.userId.push(socket.id); Users.push( user ); socket.emit('me', user); // Emit the user object socket.emit('userList', { users : Users }); // Emit the user list }); socket.on('disconnect', function () { Users.userId.remove( socket.id ); if ( Users.userId.length === 0 ) Users.remove(user); socket.emit('userList', { users : Users }); // emit again the user list for refresh }); socket.on('clientMessage', function ( data ) { io.sockets.socket(data.to).emit('newMessage', { // data.to is the socket ID that a message is sent "from" : data.from, "message" : data.message, "date" : new Date() }); }); }); 

我没有运行代码。 这实际上是一个想法如何处理多个套接字连接。 你总是可以用更优雅的方式写出来!