我不是在谈论一般聊天应用,而是专门讨论聊天室实施。
所以在node.js / socket.io中,我想到了两种方法
为每个聊天室创建一个数组,向阵列中的所有用户广播消息
向所有用户广播所有消息,在客户端的PC上确定它们是否属于聊天室,如果是,请接受消息。
1中的弱点是,当你扩展时,你将使用数组对象充斥服务器的内存,而我在托管上只使用大约80mb。
2中的弱点是,向所有人播放最终的成本很高,而且充斥客户的机器也不会让他们感到高兴。
我确信有更好的方法来实现聊天室,这就是为什么我要求你们帮助我。我首先在服务器端寻找性能,然后是客户端,它必须是可扩展的。
答案 0 :(得分:5)
Socket.IO 0.7+推出了一个房间概念。这可能就是你要找的东西。
io.sockets.on('connection', function (socket) {
socket.join('room name');
// broadcast the message to everybody in the room
socket.on('chat message', function (data) {
socket.broadcast.to('room name').emit('chat message', data);
});
socket.on('leave room', function (room) {
socket.leave(room);
});
});
所以不需要为特定房间的用户管理自己的阵列,socket.io就有这个内置。
答案 1 :(得分:1)
我在这里做了类似的事情:
http://davidgranado.com/demos/chat_shuffle/
你可以通过打开几个窗口并与自己聊天来测试它,因为每个实例都被认为是一个人(这是我的第一个节点应用程序)。
它的工作方式是每个人都与另一个人配对进行对话。实际上,每个人都在两个人的房间里。
要获取消息,我将用户注册为彼此关联,并仅将其发送给一个合作伙伴聊天。这个想法可以很容易地扩展到任何数量的人来关联聊天。这样,您就不必向所有人进行浪费的广播。
答案 2 :(得分:-2)
Now.js会让这更容易:http://nowjs.com/guide - 他们的指南已经有了如何,以及他们的github回购https://github.com/Flotype/now/tree/master/examples/multiroomchat_example