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

     2023-03-07     192

关键词:

【中文标题】讨论:使用 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进行重构【英文标题】:Node.jsrestifywithsocket.io【发布时间】:2012-10-1713:51:40【问题描述】:是否可以像express和socket.io一样在同一个端口上运行socket.io和restify?我就是这样做的,但是没有用#server.coffeerestify=requi... 查看详情

Node js socket io chat 发送消息通知

...天应用关闭时使用nodejssocketio为ios发送消息通知?【问题讨论】:需要集成推送通知。您能详细说明一下吗?【参考方案1】:事实上,当发送一个简单的消息时,你会用socket.io捕获它,然后你会使用它通过p 查看详情

Socket.io 使用 node.js,根本没有 express?

】Socket.io使用node.js,根本没有express?【英文标题】:Socket.iousingnode.jswithnoexpressatall?【发布时间】:2017-05-0118:07:29【问题描述】:所以我想使用socket.io创建一个node.js服务器,但我更像是一个初学者,并且发现express包在语法上相... 查看详情

Node JS、Express、MSSQL、Socket IO

...发送到我的服务器。我正在使用npmMSSQL和Socket.io。【问题讨论】:【参考方案1】:通过NPM安装mssql包npminstallmssql这是指向其docs的链 查看详情

HTTP 状态代码 200 但页面未加载 Node.js Socket.io -- 使用 Socket.io 的 Node.js 教程,Daniel Nill,fs.readFile(),socket

】HTTP状态代码200但页面未加载Node.jsSocket.io--使用Socket.io的Node.js教程,DanielNill,fs.readFile(),socket.html【英文标题】:HTTPStatusCode200butpagedoesnotloadNode.jsSocket.io--Node.jsTutorialWithSocket.io,DanielNill,fs.readFile(),socket.html【 查看详情

node.js + socket.io:拍卖网站开发

...【发布时间】:2016-05-0119:00:48【问题描述】:我目前正在使用node.js和socket.io编写拍卖脚本。但是该网站是使用PHP和MySQL开发的。在这里,我仅将node.js+socket.io用于拍卖投标过程。该网站将有500-1000名登录用户在拍卖期间查看单个... 查看详情

使用 Node.js 在 Heroku 上使用 Socket.io 和 Redis

】使用Node.js在Heroku上使用Socket.io和Redis【英文标题】:UsingSocket.ioandRedisonHerokuwithNode.js【发布时间】:2012-06-1908:37:00【问题描述】:我正在尝试使用Node.js和带有Redis的Socket.io将应用程序部署到Heroku。我已经将Socket.io设置为使用XHR... 查看详情

使用 Socket.IO 将 Node.JS 服务器连接到另一个 Node.JS 服务器?

】使用Socket.IO将Node.JS服务器连接到另一个Node.JS服务器?【英文标题】:ConnectaNode.JSservertoanotherNode.JSserverwithSocket.IO?【发布时间】:2018-12-1514:14:21【问题描述】:我正在尝试使用Socket.IO在两个Node.JS服务器之间发送数据。我通常只... 查看详情

在没有 node.js 的情况下独立使用 socket.io

】在没有node.js的情况下独立使用socket.io【英文标题】:Usingsocket.iostandalonewithoutnode.js【发布时间】:2011-11-1812:45:53【问题描述】:(JavaScript新手)我正在尝试构建一个基于JavaScript的客户端应用程序,该应用程序通过套接字与服... 查看详情

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用

】如何将AsteriskARI与socket.io和Node.js一起使用【英文标题】:HowtouseAsteriskARIwithsocket.io&Node.js【发布时间】:2016-01-0207:27:24【问题描述】:最近开始接触星号、Linux、node.js和最近的socket.io,以便我最终可以为星号制作实时Web应用... 查看详情

Node.js 如何在快速路由中使用 socket.io

】Node.js如何在快速路由中使用socket.io【英文标题】:Node.jshowtousesocket.ioinexpressroute【发布时间】:2019-10-1716:43:27【问题描述】:在我的一个node.js脚本中,我尝试在快速路由中使用socket.io。我发现了许多类似的问题,并尝试按照... 查看详情

Node.js、多线程和 Socket.io

...3【问题描述】:我希望Socket.io在Node.jsv.0.6.0及更高版本中使用nativeloadbalancing(“集群”)进行多线程工作。据我了解,Socket.io使用Redis来存储其内部数据。我的理解是:我们不想为每个工作人员生成一个新的Red 查看详情

使用 socket.io/node.js 在网页上显示流式 Twitter

】使用socket.io/node.js在网页上显示流式Twitter【英文标题】:Displayingstreamingtwitteronwebpagewithsocket.io/node.js【发布时间】:2013-05-0121:05:07【问题描述】:我正在尝试使用node.jssocket.io和twit构建Twitter流式Web应用程序。varexpress=require(\'expr... 查看详情

使用 node.JS 和 Socket.IO 的路径和其他问题

】使用node.JS和Socket.IO的路径和其他问题【英文标题】:path-andotherproblemsusingnode.JSandSocket.IO【发布时间】:2011-03-2705:13:38【问题描述】:我在由Windows托管的TurnkeyLinux上的VirtualBox中使用node.JS。我按照here的说明进行操作。node.JS位于... 查看详情

如何在 node.js 中以角度使用 socket.io?

】如何在node.js中以角度使用socket.io?【英文标题】:Howtousesocket.ioinangularwithnode.js?【发布时间】:2019-03-0502:44:39【问题描述】:客户端我使用Angular6,服务器端我使用node.js。在Angular6控制台中,它打印消息并socket.ioid(message:"He... 查看详情

在 Heroku 上使用集群和 socket.io-redis 扩展 node.js socket.io@1.*.*

】在Heroku上使用集群和socket.io-redis扩展node.jssocket.io@1.*.*【英文标题】:Scalenode.jssocket.io@1.*.*withclusterandsocket.io-redisonHeroku【发布时间】:2014-11-2505:31:58【问题描述】:有没有人知道在多个内核上扩展基于node.js-socket.io的应用程序... 查看详情

Node.js 和 socket.io 的混淆

...以我真的很困惑。它们之间有什么区别?为什么我不能只使用Node.JS"OR"Socket.io来编写我的应用 查看详情

多人 HTML5、Node.js、Socket.IO

...ket.IO【发布时间】:2011-09-0819:26:21【问题描述】:我尝试使用HTML5Canvas、JavaScript(也使用JohnResig简单继承库)和带有Socket.IO的Node.js创建简单的多人游戏。我的客户代码:varcanvas=document.getElementById(\'ga 查看详情