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

时间:2011-09-20 05:22:59

标签: node.js chat websocket socket.io chatroom

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

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

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

  2. 向所有用户广播所有消息,在客户端的PC上确定它们是否属于聊天室,如果是,请接受消息。

  3. 1中的弱点是,当你扩展时,你将使用数组对象充斥服务器的内存,而我在托管上只使用大约80mb。

    2中的弱点是,向所有人播放最终的成本很高,而且充斥客户的机器也不会让他们感到高兴。

    我确信有更好的方法来实现聊天室,这就是为什么我要求你们帮助我。我首先在服务器端寻找性能,然后是客户端,它必须是可扩展的。

3 个答案:

答案 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