2012-02-08 3 views
1

У меня есть червь времени на поиск документации по io.sockets.clients(), поэтому я могу получить идентификаторы подключенных клиентов, имя пользователя и т. Д. Когда я alert(io.sockets.clients().length.toString());, он дает мне правильный номер, но мне нужно найдите структуру массива. Есть ли способ узнать массив без знания структуры? Много как php's print_r()?Socket.IO подключился к списку клиентов

код до сих пор:

socket.on('switchRoom', function(newroom){ 
    var clients = io.sockets.clients(); 
    socket.emit('users', clients); 
}); 

socket.on('users', function(usernames) { 
    for(var client in usernames) { 
     console.log(usernames[client].id + ' disconnected: ' +  usernames[client].disconnected) 
    } 
}); 

Я получаю эту ошибку после того, как «switchRoom» обжигают

/home/ed/socket/chat/node_modules/socket.io/lib/parser.js:81 
data = JSON.stringify(ev); 
      ^
TypeError: Converting circular structure to JSON 
at Object.stringify (native) 
at Object.encodePacket (/home/ed/socket/chat/node_modules/socket.io/lib/parser.js:81:19) 
at Socket.packet (/home/ed/socket/chat/node_modules/socket.io/lib/socket.js:202:21) 
at Socket.emit (/home/ed/socket/chat/node_modules/socket.io/lib/socket.js:351:15) 
at Socket.<anonymous> (/home/ed/socket/chat/app.js:58:10) 
at Socket.$emit (events.js:64:17) 
at SocketNamespace.handlePacket (/home/ed/socket/chat/node_modules/socket.io/lib/namespace.js:331:20) 
at Manager.onClientMessage (/home/ed/socket/chat/node_modules/socket.io/lib/manager.js:436:38) 
at WebSocket.onMessage (/home/ed/socket/chat/node_modules/socket.io/lib/transport.js:387:20) 
at Parser.<anonymous> (/home/ed/socket/chat/node_modules/socket.io/lib/transports/websocket/hybi-07-12.js:38:10) 

ответ

2

Вы делаете это на стороне клиента (в браузере) или на стороне сервера ? Вы упоминаете использование alert, но мне не известно о методе clients() на стороне клиента, который делает то, что вы хотите.

На стороне сервера, clients() возвращает массив Socket с as defined by this method:

/** 
* Retrieves all clients as Socket instances as an array. 
* 
* @api public 
*/ 

SocketNamespace.prototype.clients = function (room) { 
    var room = this.name + (room !== undefined ? 
    '/' + room : ''); 

    if (!this.manager.rooms[room]) { 
    return []; 
    } 

    return this.manager.rooms[room].map(function (id) { 
    return this.socket(id); 
    }, this); 
}; 

Консоль Node.js и браузеры с Дев инструментами обеспечивают console объект, который позволяет отладку; в общем, вы можете позвонить console.log(something) где something почти ничего; в случае объекта детали объекта будут перечислены так или иначе.

[Редактировать]

Поскольку вы уже используете socket.set хранить имя пользователя, возможно, вы можете попробовать что-то вроде этого:

// server 

socket.on('connection', function(socket) { 
    ... 
    socket.on('disconnect', function() { 
    socket.get('username', function (err, name) { 
     socket.broadcast.emit('disconnected', name); 
    }); 
    }); 
    ... 
}); 

// client 

socket.on('connect', function() { 
    ... 
    socket.on('disconnected', function(name) { 
    console.log(name + " disconnected."); 
    }); 
    ... 
}); 
+0

я добавил мой текущий код, чтобы показать более подробно о том, что это происходит. Это делается на сервере (app.js), и ничего не пускается в консоль. –

+0

Предполагаю, что первая часть находится на сервере, а вторая - на клиенте? 'io.sockets.clients()' возвращает массив объектов 'Socket'; вы не можете отправить их через Интернет клиенту. Вам нужно будет получить данные из имени пользователя и отправить, скажем, массив строк или что-то в этом роде. Вы используете 'socket.set' для установки имени пользователя? Если нет, как вы отслеживаете их? –

+0

Я использую 'socket.set ('username', 'MyName')' и 'socket.set ('id', socket.id)' есть способ захватить множество vars, а затем, возможно, '.emit' в клиент? –

Смежные вопросы