Socket.io套接字在哪个房间?

时间:2017-07-25 08:11:13

标签: javascript node.js socket.io

我是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});
});

2 个答案:

答案 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