Socket.IO,导航器标签出了问题

时间:2013-01-06 16:54:40

标签: javascript node.js session tabs socket.io

我正在使用Socket.IO,我发现了一个大问题。我正在尝试进行实时聊天:用户登录,选择另一个连接的用户并通话,所以(...)

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将会改变,这样用户就不会在其他选项卡中收到该消息。

我想为一些登录用户打开的所有选项卡存储相同的socket.id;因此,如果该用户收到任何消息,将显示在所有选项卡中。

¿解?

1 个答案:

答案 0 :(得分:1)

你能做到这一点的唯一方法是创建每个用户的所有套接字ID的数组,如果有一个特定的消息发送给所有用户......我遇到了类似的问题,那就是解决方案我用过

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() 

        });
    });
});

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