通过express.io连接客户端

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

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

在express.io的文档中 ,一旦新客户进入房间,如何“获取”连接的客户列表,没有明确的方法,即只有“广播”而不是“获取”。

有人做过这个?

任何线索都会非常有帮助。

谢谢!

编辑:

在尝试@ 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] } } ] 

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:将圆形结构转换为JSON),因为该数组有几个圆形对象,因此无法广播。

有什么想法吗?

因为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手动configuration,因为它看起来像express.io有一个非常自负的API。 它确实不是那么辛苦,因为express.io没有什么比创build一个漂亮的界面/抽象手动configuration(这实际上是伤害你在这种情况下,如果上述不起作用)。

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

那么,最后我还是采用了@Brad提出的“贴切”解决scheme。 这不是最优雅的,但如果你能帮我改进它,那真是太棒了!

这是最终的代码:

服务器端

 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 });