1

私は 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 を保存したい。したがって、そのユーザーがメッセージを受信すると、すべてのタブに表示されます。

¿ソリューション?

4

1 に答える 1

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

        });
    });
});

私はコードを実行していません。実際には、複数のソケット接続を処理する方法について考えています。あなたはいつでもそれをよりエレガントな方法で書くことができます!

于 2013-01-06T17:34:31.567 に答える