【问题标题】:Socket.io what room(s) is the socket in?Socket.io 插座在哪个房间?
【发布时间】:2017-07-26 08:20:32
【问题描述】:

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

【问题讨论】:

  • 我得到 [Object object]。 — 您是在打印 socket.rooms 还是像在示例中使用 data.msg 一样将其转换为字符串(例如 @ 987654323@)?
  • 为了记录对象的内容,使用 JSON.stringify(obj)
  • 不要使用JSON.stringify,这会丢弃大多数数据类型。
  • @Quentin - 我只是打印 socket.rooms 产生 [Object object]
  • @Quentin - 不抱歉,我错了,查看我的代码,我确实将它转换为字符串。我尝试按照您的建议打印对象,并且确实显示了对象内部的元素。谢谢!

标签: javascript node.js socket.io


【解决方案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});
        }
    }
});

测试过了,效果很好!

【讨论】:

  • 解决自己的问题是世界上最好的感觉,干得好!我也想弄清楚这一点,幸运的是,现在这方面的资源比 2017 年要多!
【解决方案2】:

Socket.IO 通过不同的版本发生了很大的变化。将其视为一家方向不佳且政策不可靠的公司,不断变化以损害其客户(开发人员)。

挖掘“io”我发现了这个,我在上一个项目中一直在使用它,因为我遇到了同样的问题:

io.sockets.adapter.sids[socket.id]

如果除了获取房间之外,您还需要获取房间内的所有套接字,请使用以下内容:

io.sockets.adapter.rooms['nameOfTheRoom'].sockets

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 2017-01-04
    • 2018-09-26
    • 2018-07-05
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多