socket.io,如何将状态附加到套接字室

时间:2018-08-03 23:12:18

标签: socket.io

我想知道是否有将状态附加到各个房间的方法,可以做到吗?

说我创建一个房间room_name

socket.join("room_name")

如何为该特定房间分配对象,数组,变量?我想做类似的事情:

io.adapter.rooms["room_name"].max = maxPeople

在这里我给房间room_name一个状态变量max,并为max分配了变量maxPeople的值,即类型int。 Max存储一个变量,该变量表示允许加入该特定房间的最大人数。可以/可以为其他房间分配不同的最大值。

1 个答案:

答案 0 :(得分:0)

好吧,有一个对象(在socket.io内部)代表一个房间。它存储在适配器中。您可以看到对象here in the source的基本定义。因此,如果您进入适配器并获得给定名称的房间对象,则可以向其中添加数据,只要不删除房间,它就会一直存在。

但是,出于以下几个原因,这有点危险:

  1. 如果会议室中只有一个连接并且该用户断开连接并重新连接(例如,因为他们导航到新页面),则会议室对象可能会被破坏然后重新创建,并且您的数据将丢失。

  2. p>
  3. 直接访问Room对象和房间列表不在公共socket.io接口中(据我所知)。适配器是可替换的,当您执行将redis适配器与集群一起使用时,它的工作方式可能有所不同(实际上,这可能是因为房间列表集中在redis数据库中)。非公共接口也可能在socket.io的未来版本中进行更改(并且已知socket.io会不时重新安排某些内部组件)。

因此,如果这是我的代码,我将创建自己的数据结构以保留会议室特定的信息。

将某人添加到房间时,请确保您自己的房间对象存在并已使用所需数据正确初始化。使用房间名称作为键的Map对象和值作为您自己的Room对象的效果很好。当您将某人从房间中移出时,如果房间为空,则可以清理自己的数据结构。

您甚至可以使自己的房间对象成为用于加入或离开房间的中央API,然后它将维护自己的数据结构,然后调用socket.io进行加入或离开。当任何人加入或离开会议室时,这将集中维护您自己的数据结构。这也将允许您在其中有任何用户之前(如果需要/想要这样做),使用它们自己的属性预先创建房间对象,而socket.io不会这样做。

相关问题