我是socket.io的新手,并且不熟悉如何处理他们的数据结构。根据另一篇文章,我需要使用“socket.rooms”来找出套接字所在的空间。但是如果我在控制台日志中打印出“socket.rooms”,我会得到[Object object]。它是某种类型的对象,但如果没有任何关于如何正确访问该对象的文档,我将无所适从。
下面非常简单的代码,我想要“????”成为他们所在的房间。显然,他们可能在不止一个房间,在这种情况下我可以建立一个循环......但是对于我正在建造的东西,它们只会在一个房间里。
// Send Message
socket.on('game_update', function(data){
var tStamp = Date.now();
console.log(tStamp +" - "+ data.msg);
io.in('????').emit('game_update', {time: tStamp, msg: data});
});
答案 0 :(得分:1)
感谢@Quentin我能够弄明白。
console.log(socket.rooms); // prints all elements of the rooms object
82号房间的玩家看起来像是:
{ '82': '82', 'oNKayk7Ny8GKh1-4AAAB': 'oNKayk7Ny8GKh1-4AAAB' }
第一个元素是房间,第二个元素是socket.io创建的浏览器cookie。
为了解决我的问题,我需要弄清楚房间是什么元素,所以'82'不适合我正在做的事情。我对82更具体,所以我知道该属性是我引用的房间而不是他们的cookie或其他东西。
socket.join("game_id="+data.game_id); // to join the room, but also id this from other properties
然后我需要的最终代码是:
socket.on('game_update', function(data){
console.log(socket.rooms); // for debug, prints the data
var tStamp = Date.now();
console.log(tStamp +" - "+ data.msg);
var roomsObj = socket.rooms;
for(i=0; i < Object.keys(roomsObj).length; i++)
{
if(roomsObj[Object.keys(roomsObj)[i]].split("=")[0] == "game_id")
{
//broadcasts to every room they are in, which begins in "game_id="
io.in(roomsObj[Object.keys(roomsObj)[i]]).emit('game_update', {time: tStamp, msg: data});
}
}
});
经过测试,它正在运行!
答案 1 :(得分:-1)
Socket.IO通过不同版本发生了很大变化。可以把它想象成一个方向不好,政策不稳定的公司,不断变化,不利于客户(开发商)。
深入研究&#34; io&#34;我找到了这个,并且我在上一个项目中一直在使用它,因为我遇到了同样的问题:
io.sockets.adapter.sids[socket.id]
如果在房间里面有一个插座,你还需要将一个插座放在一个房间内,请使用以下内容:
io.sockets.adapter.rooms['nameOfTheRoom'].sockets