2011-12-05 54 views
11

我想要做的事,如:是否有可能聽到加入並將事件留在房間裏?

var room = io.sockets.in('some super awesome room'); 
room.on('join', function() { 
    /* stuff */ 
}); 
room.on('leave', function() { 
    /* stuff */ 
}); 

這似乎並沒有工作。可能嗎?

爲了說明所期望的行爲:

io.sockets.on('connection', function (socket) { 
    socket.join('some super awesome room'); // should fire the above 'join' event 
}); 
+0

當你加入/離開時,或當別人做什麼? – cHao

+1

我不確定我明白你在問什麼。我有一個「房間」,我想知道什麼時候_any_套接字加入或離開它。 – lakenen

+0

套接字不加入或離開房間。客戶加入或離開房間。我認爲你對客戶感興趣(那不是你),那麼? – cHao

回答

10

在Socket.IO,一個「房」其實只是一個命名空間,一些事來幫助您篩選插座的巨型袋下降到插座的小袋子。調用io.sockets.in('room').on('something')將導致事件處理程序在事件觸發時在房間內每套接字觸發。如果這是你想要的東西,這樣的事情應該做的伎倆:

var room = io.sockets.in('some super awesome room'); 
room.on('join', function() { 
    console.log("Someone joined the room."); 
}); 
room.on('leave', function() { 
    console.log("Someone left the room."); 
}); 

socket.join('some super awesome room'); 
socket.broadcast.to('some super awesome room').emit('join'); 

setTimeout(function() { 
    socket.leave('some super awesome room'); 
    io.sockets.in('some super awesome room').emit('leave'); 
}, 10 * 1000); 

需要注意的是,你會得到同樣的效果,如果你(1)獲得在一個房間裏,所有套接字的列表(2 )遍歷它們,每個調用emit('join')。因此,您應該確保您的活動名稱足夠具體,以免您不小心將其排放到房間的「名稱空間」之外。

如果您只想在套接字加入或離開房間時發出/消耗單個事件,那麼您需要自己編寫這個事件,因爲再次,房間不是一件「事物」因爲它是一個「過濾器」。

+3

'房間不是一個「東西」,而是一個「過濾器」 - 這是我所擔心的(我希望socket.io有更好的文檔)。我想我必須寫我自己的版本的房間......謝謝! – lakenen

+1

我對'join'處理器的參數有疑問 - http://stackoverflow.com/q/16969463/37759 –

0

您可以使用本機 「斷開」 事件。

socket.on('disconnect', function() { 

     io.sockets.emit('user disconnected'); 
    }); 
+2

這不是我要找的。我想創建事件處理程序來處理socket連接()'和'離開()'房間,而不是完全連接到服務器或與服務器斷開連接(儘管斷開_應該導致一個「離開」事件)。 – lakenen

+0

@camupod - 套接字不知道「房間」。房間是一個應用程序級別的概念,因此插座不會連接或離開房間。您必須編寫一些更高級別的處理程序來自行發出加入和離開事件。 –

+1

@StephenP - 插座不需要了解房間。我想知道是否有可能在「房間」('io.sockets.in('name')')告訴我什麼時候加入或離開了。 – lakenen

0

我知道這個問題很舊,但對於任何人通過谷歌搜索絆倒這一點,這是我如何接近它。

即使沒有加入或離開房間的本地事件,加入房間也很容易計算。

/* client.js */ 
var socket = io(); 
socket.on('connect', function() { 
    // Join a room 
    socket.emit('joinRoom', "random-room"); 
}); 

和服務器端

/* server.js */ 
// This will have the socket join the room and then broadcast 
// to all sockets in the room that someone has joined 
socket.on("joinRoom", function (roomName) { 
    socket.join(roomName); 
    io.sockets.in(roomName).emit('message','Someone joined the room'); 
} 

// This will have the rooms the current socket is a member of 
// the "disconnect" event is after tear-down, so socket.rooms would already be empty 
// so we're using disconnecting, which is before tear-down of sockets 
socket.on("disconnecting", function() { 
    var rooms = socket.rooms; 
    console.log(rooms); 
    // You can loop through your rooms and emit an action here of leaving 
}); 

它變得有點棘手是當他們斷開,但幸運的是加入一個disconnecting事件的眼淚在房間插座下來之前,這種情況發生。在上面的例子中,如果事件是disconnect那麼房間將是空的,但是disconnecting將具有它們所屬的所有房間。對於我們的示例,您將有兩個房間,插座將成爲其中的一部分,Socket#idrandom-room

我希望這可以指出其他人從我的研究和測試的正確方向。

相關問題