首页 > 解决方案 > socket.io,如何将状态附加到套接字房间

问题描述

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

假设我创建了一个房间room_name

socket.join("room_name")

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

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

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

标签: socket.io

解决方案


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

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

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

  2. 直接访问 Room 对象和房间列表不在公共 socket.io 接口中(据我所知)。适配器是一个可替换的东西,当您使用 redis 适配器和集群时,它的工作方式可能会有所不同(实际上这可能是因为房间列表集中到了 redis 数据库中)。在 socket.io 的未来版本中,非公共接口也可能会发生变化(并且众所周知,socket.io 会不时重新排列一些内部结构)。

所以,如果这是我的代码,我会创建自己的数据结构来保存特定房间的信息。

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

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


推荐阅读