【问题标题】:Connected clients in express.ioexpress.io 中的连接客户端
【发布时间】:2014-03-08 03:49:49
【问题描述】:

我正在使用 node.js 和 express.io 开发一个简单的聊天应用程序

我想一直显示已连接客户端(或在线聊天)的列表。

express.io's doc 中,没有明确的方法说明如何在新客户端进入房间后“获取”已连接客户端的列表,即只有“广播”而不是“获取”。

以前有人做过吗?

任何线索都会很有帮助。

谢谢!

编辑:

在尝试@jibsales 的回答之后。我想我们快到了。客户返回给我的不是实际的客户数组,而是这个:

[ { id: 'OWix3sqoFZAa20NLk304',
namespace: 
 { manager: [Object],
   name: '',
   sockets: [Object],
   auth: false,
   flags: [Object],
   _events: [Object] },
manager: 
 { server: [Object],
   namespaces: [Object],
   sockets: [Object],
   _events: [Object],
   settings: [Object],
   handshaken: [Object],
   connected: [Object],
   open: [Object],
   closed: [Object],
   rooms: [Object],
   roomClients: [Object],
   oldListeners: [Object],
   sequenceNumber: 496205112,
   router: [Object],
   middleware: [],
   route: [Function],
   use: [Function],
   broadcast: [Function],
   room: [Function],
   gc: [Object] },
disconnected: false,
ackPackets: 0,
acks: {},
flags: { endpoint: '', room: '' },
readable: true,
store: { store: [Object], id: 'OWix3sqoFZAa20NLk304', data: {} },
_events: 
 { error: [Function],
   ready: [Function],
   connection: [Function],
   NewChatPrivateLine: [Function],
   NewIdea: [Function],
   NewChatLine: [Function],
   NewPost: [Function] } } ]

功能有:

var app = require('express.io')();
app.io.route('connection', function(req) {
  req.io.join(req.data.room);
  var clients = app.io.sockets.clients(req.data.room);
  console.log(clients)
  app.io.room(req.data.room).broadcast('announce', {
    user: req.data.user,
    clients: clients
  }) 
});

这实际上返回了一个错误(data = JSON.stringify(ev); TypeError: Converting circular structure to JSON),因为数组有多个循环对象,因此无法广播。

有什么想法吗?

【问题讨论】:

  • 您总是可以在它们连接时跟踪它们吗?
  • 我正在尝试类似的方法,但结果非常复杂,因为我认为可以通过更简单和优雅的方式解决。你有一个想法来跟踪代码吗?

标签: node.js express chat express.io


【解决方案1】:

好吧,最后我采用了@Brad 提出的“定位”解决方案。它不是最优雅的,但如果你能帮助我改进它,那就太棒了!!

这是最终代码:

服务器端

var app = require('express.io')();

//To broadcast the users online in room sent by the client
var clients = [];
app.io.route('connect', function (req) {
  req.io.leave(req.data.room).on('disconnect', function() {
    //To remove client from list when disconnected
    var index = clients.indexOf(req.data.user);
    if (index > -1) {
      clients.splice(index, 1);
    }
    app.io.room(req.data.room).broadcast('announce', {
      user: req.data.user,
      clients: clients
    }) 
  });
  req.io.join(req.data.room);
  //To avoid repeating the same client with several opened windows/tabs
  var index = clients.indexOf(req.data.user);
  if (index === -1) {
    clients.push(req.data.user); 
  }
  app.io.room(req.data.room).broadcast('announce', {
    user: req.data.user,
    clients: clients
  }) 
});

客户端

// Emit ready event with person name and predefined room for who's online
io.emit('connect', {
  room: room,
  user: user
});

//Get the signal from server and create your list
io.on('announce', function (data){
 //Do awesome stuff with data 
}); 

【讨论】:

    【解决方案2】:

    因为express.io 只是将expresssocket.io 粘合在一起,所以不要忘记查看socket.io 的文档。话虽如此,从socket.io v0.7 开始,我们现在有了一个 API 方法来获取这些信息:

    var clients = io.sockets.clients('room'); // all users from room `room`
    

    不幸的是express.io 是用coffeescript (UGGGH !!!) 编写的,所以我很难阅读源代码,但看起来当您需要express.io 模块时,socket.io 实例被提升了还有:

    var express = require('express.io');
    var clients = express.io.sockets.clients('room'); // all users from room `room`
    

    如果这不起作用,我会放弃 express.io 使用 express 和 socket.io 进行手动配置,因为看起来 express.io 有一个非常自以为是的 API。它真的一点也不难,因为express.io 只是为手动配置创建了一个漂亮的界面/抽象(如果上述方法不起作用,这实际上会伤害你)。

    由于缺乏社区支持,我(和许多其他 websocket 消费者)放弃了 socket.io 转而使用 SockJS,因此我也会检查 SockJS。更不用说,当回退到 xhr-polling 时,IE9 中存在严重的内存泄漏。

    【讨论】:

    • 嗨@jibsales,谢谢。我已经尝试过了,但它显示以下内容: var clients = req.io.sockets.clients(req.data.room); ^ TypeError: Cannot call method 'clients' of undefined 我尝试了其他组合,例如:req.io.room(req.data.room).clients() 没有成功。有什么想法或网站可以让我进一步阅读吗?
    • 更新了问题,有什么想法吗?我现在真的迷路了!
    • 当它转储该阵列时,您连接了多少个客户端?
    • 只有一个(我)在应用程序被错误杀死之前。我尝试颠倒 req.io.join(req.data.room); 的顺序。并且错误出现在第二个连接的客户端中。第一个返回一个空数组。
    • 虽然 var clients = app.io.sockets.clients(req.data.room).length 返回正确数量的连接客户端。
    猜你喜欢
    • 2015-10-12
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多