讨论:使用node.js / socket.io实现聊天室的最佳方式?

我不是在谈论一般的聊天应用程序,而是专门讨论聊天室的实现。

所以在node.js / socket.io中,我想到了两种方法

  1. 为每个聊天室创build一个数组,向数组中的所有用户广播消息

  2. 将所有消息广播给所有用户,在客户的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