我正在用node.js和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] } } ]这些职能是:
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),因为数组有几个循环对象,因此不能广播。
有什么想法吗?
发布于 2014-02-11 10:31:19
最后,我采用了@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
}); 发布于 2014-02-10 17:33:54
由于express.io只是将express和socket.io粘合在一起,所以不要忘记查看socket.io的文档。
var clients = io.sockets.clients('room'); // all users from room `room`不幸的是,express.io是用coffeescript编写的(!)因此,我很难阅读源代码,但是当您需要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所做的仅仅是为手动配置创建一个漂亮的接口/抽象(在这个用例中,如果上面的配置不起作用,这实际上会对您造成伤害)。
我还会签出SockJS,因为我(和许多其他websocket使用者)由于缺乏社区支持而放弃了socket.io而改用SockJS。更不用说,当返回到xhr轮询时,IE9中存在严重的内存泄漏。
https://stackoverflow.com/questions/21683565
复制相似问题