簡體   English   中英

Socket.io套接字在哪個房間?

[英]Socket.io what room(s) is the socket in?

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

感謝@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});
        }
    }
});

經過測試,它正在工作!

Socket.IO通過不同的版本進行了很大的更改。 可以將其視為一家方向不佳,政策不健全的公司,並且不斷變化以損害其客戶(開發人員)。

深入研究“ io”,我發現了這一點,並且在上一個項目中一直在使用它,因為我遇到了同樣的問題:

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

如果除了要在房間中插入插座之外,還需要將所有插座插入房間內,請使用以下方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM