Socket.IO получить список подключенных клиентов - PullRequest
1 голос
/ 08 февраля 2012

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

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

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)

1 Ответ

2 голосов
/ 08 февраля 2012

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

На стороне сервера clients() возвращает массив Socket s , как определено этим методом :

/**
 * 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.");
  });
  ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...