讨论:使用node.js / socket.io实现聊天室的最佳方式?
我不是在谈论一般的聊天应用程序,而是专门讨论聊天室的实现。
所以在node.js / socket.io中,我想到了两种方法
-
为每个聊天室创build一个数组,向数组中的所有用户广播消息
-
将所有消息广播给所有用户,在客户的PC上确定它们是否属于聊天室,如果是,则接受消息。
1中的弱点是,当你扩大规模时,你会用数组对象淹没服务器的内存,而在我的主机上只使用大约80mb。
2中的弱点是,最终广播给每个人都是昂贵的,而客户机器的泛滥也不会使他们感到高兴。
我相信在如何实现聊天室方面有更好的方法,所以这就是为什么我要求你们帮助我。 我在服务器端首先在客户端寻找性能,而且它必须是可伸缩的。
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); }); });
所以没有必要pipe理自己的arrays与特定房间的用户,socket.io有这个内置。
我在这里做了类似的事情:
http://davidgranado.com/demos/chat_shuffle/
你可以通过打开几个窗口和自己聊天来testing它,因为每个实例都被认为是一个人(这是我的第一个节点应用程序)。
它的工作方式是每个人都与另外一个人进行对话。 实际上,每个人都在一个双人房间里。
为了传递信息,我将用户注册为相互关联,只发送给一个合作伙伴的聊天。 这个想法可以很容易地扩展到任何人的关联聊天人。 这样一来,你不必为每个人做一个浪费的广播。
Now.js将使这更容易: http ://nowjs.com/guide – 他们的指南已经有一个如何,以及他们的github回购https://github.com/Flotype/now/tree/master/examples / multiroomchat_example