我正在使用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;因此,如果该用户收到任何消息,将显示在所有选项卡中。
¿解?
答案 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()
});
});
});
我没有运行代码。实际上,这是一个如何处理多个套接字连接的想法。你总能以更优雅的方式写出来!