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

Posted

技术标签:

【中文标题】讨论:使用 node.js / socket.io 实现聊天室的最佳方式?【英文标题】:Discussion: Best way to implement a chatroom with node.js / socket.io? 【发布时间】:2011-11-20 18:49:48 【问题描述】:

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

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

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

    向所有用户广播所有消息,在客户的 PC 上确定他们是否属于聊天室,如果是,则接受该消息。

1 中的弱点是,最终当您扩大规模时,您将用数组对象淹没服务器的内存,而我在主机上只使用了大约 80mb。

2 中的弱点在于,向所有人广播最终代价高昂,并且淹没客户的机器不会让他们开心。

我确信在如何实现聊天室方面有更好的方法,所以这就是我请求你们帮助我的原因。我首先在服务器端寻找性能,然后是客户端,它必须是可扩展的。

【问题讨论】:

使用 80MB,您可以创建很多聊天室。您的数组只需要保存用户的 ID。您是否运行过任何内存消耗测试? 我们创建了一个正常运行的multi-room chatroom。它是开源的,请随意查看。 @Raynos,我查看了您的实现,每个房间仍然存储在服务器的内存中,对吧?这实际上与将用户粘在内存中的数组中没有什么不同。 @Derek 没有每个房间都存储在数据库中。但是使用 socket.io 我有一组我广播到每个房间的套接字,所以我使用方法 1。我没有在内存中存储额外的对象,我只是存储一个指向打开套接字的指针列表。 @Raynos 如果每个房间都存储在数据库中,并且每次广播都需要查询数据库以查看房间中的人,那么数据库的瓶颈不是很大而且不是很适合扩大规模? 【参考方案1】:

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 已内置此功能。

【讨论】:

不知道,然后我会研究他们如何实现 socket.join() 函数。但首先,socket.io 文档在哪里? 自述文件:github.com/learnboost/socket.iogithub.com/learnboost/socket.io-client 网站socket.io 以及在wiki 中github.com/learnboost/socket.io/wiki 我使用 Socket.IO 的房间准备了一个simple demo of a multiroom chat。它带有一个基准,可让您检查它的速度。【参考方案2】:

我在这里做了类似的事情:

http://davidgranado.com/demos/chat_shuffle/

您可以通过打开几个窗口并与自己聊天来测试它,因为每个实例都被视为一个人(这是我的第一个节点应用程序)。

它的工作方式是每个人都与另一个人配对进行对话。实际上,每个人都在两个人的房间里。

为了传递消息,我将用户注册为彼此关联,并仅将其发送给一个合作伙伴聊天。这个想法可以很容易地扩展到任意数量的人来关联聊天。这样一来,您就不必向所有人进行浪费的广播。

【讨论】:

所以说你有 person1、person2、person3,服务器如何知道向他们发送消息/知道他们在聊天室中而不声明一个数组来将他们分组在我的聊天室中方法1? 我觉得我此时的大脑并没有我想的那么敏锐。基本上是一样的。目前,我本身不使用数组,因为它只有两个。但是为了扩展这个想法,一个数组对于聊天室来说是完美的,可以知道向谁广播。【参考方案3】:

Now.js 将使这一切变得更容易:http://nowjs.com/guide - 他们的指南已经有了操作方法,以及他们的 github 存储库https://github.com/Flotype/now/tree/master/examples/multiroomchat_example

【讨论】:

以上是关于讨论:使用 node.js / socket.io 实现聊天室的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Node.js 的 Socket.io

在重新连接、socket.io、node.js 时重用套接字 id

Node js socket io chat 发送消息通知

Node JS、Express、MSSQL、Socket IO

如何使用 Node JS 服务器在 Socket.io 中进行一对一聊天?

node.js socket.io 如何发射到特定的客户端?