2014-06-05 32 views
0

我必須在node.js模塊中的服務器上的ajax請求中獲取套接字實例。這是我的代碼。在服務器上獲取選項卡的套接字實例

app.js

在我的Ajax請求的一個
io.set('authorization', function (handshake, callback) { 
    if (handshake.headers.cookie) { 
     cookieParser(handshake, null, function(err) { 
      handshake.sessionID = handshake.signedCookies['express.sid']; 
     }); 
    } else { return callback('No cookie transmitted.', false); } 
}); 

io.sockets.on('connection', function(socket) { 
    var session = socket.handshake.session; 
    var userid = session.userid; 
    socket.join("room"); 
    //make user offline 

    socket.on('disconnect', function() { 
     //my code goes here... 
     //make user offline 
    }) 
}); 

現在,我想Socket實例

app.post('/logout', function (req, res) { 
    //here i want socket instance, so I can emit message to all socket, accept this. 
}); 

據我所知,每個標籤創建它自己的新的套接字連接,但會話在瀏覽器的所有選項卡之間是唯一的。那麼,如何爲服務器端的每個選項卡存儲套接字,在那裏我可以輕鬆找到套接字實例,然後將消息廣播到所有套接字,不包括正在創建事件的套接字。 (表示用戶的活動標籤的套接字連接)

任何猜測。

感謝

回答

1

在我的應用程序,我可以做你說什麼,因爲我使用的命名空間和餘地,因此在一個房間裏,我可以找人的每一個插座。

因此,我可以刪除用戶的每個插座。但是如果你不能使用它,我想在你的應用程序中,你將不得不在外部實現socket.io類(使用會話作爲一種方式來查看它是否已經打開了套接字或者是否必須創建一個新實例) 。在這個類中,有一個套接字表,以便您能夠處理某人的套接字。

在我的情況,我做同樣的事情,除了我使用socket.io的房間來做到這一點。

而要廣播到每個套接字,它取決於你的應用程序。如果您的應用發送給同一名稱空間中的任何人,它不會更改任何內容,因爲同一會話的套接字也會收到該消息。但是,如果沒有,你將不得不實現一個函數發射到我上面建議的表的每個插座。 在我的情況我使用'排除',以確保當前套接字不會收到消息,但通常你可以使用廣播。

io.of('/user').in(this.id).except(socket.id).emit('msg', { text: text,type:person}); 

最後,socket.io不會幫你處理會話和幾個插座一個用戶/會話,但你能設法對付使用房間的功能它(對我來說這是最好的方式),或實現一個用戶類,您將在其中管理會話套接字表。

相關問題