如何使用节点WebSockets管理组/房间?

时间:2017-07-27 02:59:54

标签: node.js web-services sockets express websocket

TL; DR 在下面。

我目前正在开发一个由实时数据驱动的React / Redux SPA。我决定使用ws代替socket.io,因为socket.io对我正在做的事感觉有点高,我宁愿自己管理套接字

说到这一点,我很难找到一种方法来管理每个视图/路由的更新/消息分离。由于我使用客户端路由,因此每条快速路线都无法正常工作......

服务器和客户端之间通过WebSockets发送的消息是JSON,其行为类似于GET_ITEMS,然后是GET_ITEMS_SUCCESS的响应,其中包含一系列'项目'和错误:..._ERROR等。这一切都很好,因为它只是1比1的交易。虽然在服务器收到更新时向所有相关客户端广播(1到全部)时会出现问题。

因此,我认为最佳做法是将这些广播限制在正在查看/想要数据的客户端。因此,在查看Item页面时,无法广播User数据的更新,因为这仅用于User页面。

在处理这种情况时,我还没有找到任何常见的做法,只需要为ws添加一些小的过时/几乎不用的包装,只需添加一些基本功能即可离开/加入但实施时并没有多大的灵活性。

我认为 MIGHT 工作的目的是为每个' /' room'提供一个对象/数组,它存储当前正在侦听的客户端来自给定部分的更新。因此,用户可以使用类别的参数向INIT_LISTEN(&``)发送操作,例如ITEM用于更新和与项目相关的其他操作。

<小时/> TL; DR

我的问题归结为:我如何存储对单个套接字的引用? (ws客户端对象?ws客户端ID?)然后,我可以将它存储在一个对象/数组中,如下所示进行迭代。

 const ClientRooms = {
      Items: {
           {
                ...ws
           }
           /* ...rest of the client */
      }
 }

 const ClientRooms = {
      Items: [ "xyz" ] /* Array of ws ids */
 }

我有一个&#34;乒乓球&#34;心跳功能可以使客户端保持活动状态并防止静默连接失败/断开连接。我无法找到ws.terminate()是否仍会触发ws close事件,因此我可以重复组合&#39; /&#39; room&#39;用于查找和删除该客户端实例的对象/数组。

0 个答案:

没有答案