2011-08-29 24 views
4

我會爲每個插座內部循環:如何從一個socket.io房間正確取消訂閱並銷燬它?

if (!chat.room.list[hash]) { // room has expired 
    socket.leave(hash); 
    delete chat.user.list[socket.store.data.id].rooms[hash]; 
    delete socket.store.data.inRooms[hash]; // delete room hash from user store 
} 

socket.leave(hash)什麼都不做 - 插座仍然接收發送給hash房的消息。

作爲一個側面說明 - 如果我的客戶安娜和客戶端連接鮑勃 - 無論是接收消息,但如果我的客戶重新鮑勃 - 鮑勃無法發送消息給安娜。

有沒有什麼地方全套接字IO API文檔(因爲我無法找到socket.leave(室)的例子)?

編輯: 明白了! Socket IO使用斜槓節省了房間句柄,因此您必須使用socket.leave('/'+hash)

+5

您應該添加您的解決方案作爲一個「答案」,所以這不上來爲「懸而未決」 – timoxley

回答

0

正切的排序,但要回答關於完整的socket.io文檔的問題部分:但是,如果檢出源在socket.io's home page你可以找到一些稀疏的文檔(查看源代碼和「房間」的CTRL + F)。我已經做過幾次了。沒有關於離開房間的事情,但有一些一般的解釋。

視圖-出處:http://socket.io被隱式地創建

4

房間中socket.io和隱式地刪除。基本上它們在空時會自動移除。

是的,前面的/被添加到房間內部的名字,但你做需要添加這去除房間的插座。

嘗試發射console.log(io.sockets.manager.rooms)當一個房間被創建以看看發生了什麼內部發生的事情。

+0

什麼來調試,爲什麼房間樹葉會不會發生的最好方法?即。即使客戶斷開連接,房間仍然充滿人氣。使用redisstore。 –

3

隨着0.8.7我嘗試過了,似乎你不必添加/(斜線)再

socket.leave(hash) 

作品就好了。

1

SocketIO 1.0有Socket.prototype.leave(roomName)Socket.prototype.leaveAll()

而且你不必手動刪除的房間:

斷開時,插座離開他們的自動一部分,並沒有特別需要對您的部分拆卸的所有通道。 [From here]