2014-03-01 85 views
0

我已經開發了一個應用程序使用PHP和Node.js的大多數我的應用程序使用PHP但是在我的webapp我使用Node.js和受socket.io我的實時部分建問題是......強制註銷用戶:Socket.IO

如何處理在多個客戶端中登錄的用戶?我打算在他/她嘗試從另一個客戶端登錄時強制註銷用戶。是否有可能實現這個邏輯,以及如何?日Thnx

io.sockets.on('connection',function(socket) { 
    var secret = socket.manager.handshaken[socket.id].query.secret; 
    clients[secret] = socket; 
    console.log('Client Connected'); 
    // Notification 
    app.on("notification",function(data){ 
     socket = clients[data.recipient]; 
     if(socket != undefined){ 
      console.log('worked'); 
      socket.emit('notify',data); 
     } 
    }); 
}); 

回答

0

你可以通過每個用戶一個唯一的ID,通過握手插座和維護包含與他們socket.id(鍵/值對),所有連接的用戶ID的服務器上的全局對象。

當客戶端連接你檢查對象具有用戶ID,這表明用戶已經從其他客戶端連接的關鍵。

  • 如果爲false,則將用戶標識和套接字ID添加到該對象。

  • 如果屬實,你可以很容易地從該對象的舊連接的socket.id並關閉這一個。然後,在對象中設置新客戶端的socket.id。

當客戶端斷開連接時,您從對象中刪除具有用戶標識的密鑰。

這種方法,只要你只有一個socket.io同時實例(沒有羣集等)的作品,否則,你必須使用像Redis的中央存儲器,以維護所有連接的用戶ID的列表。

如果您需要更多的細節或例子,請讓我知道。

我沒有測試過下面的代碼,但是這應該是你的最簡單的解決方案。

當然你有連接的用戶的ID,以取代所有user_id_here

var user_connected = {}; 

io.sockets.on('connection',function(socket) { 

// Check if user is already connected 
if(user_connected.hasOwnProperty(user_id_here)) { 
    // If true, disconnect previous connection 
    user_connected['user_id_here'].disconnect(); 
} 

// Add current socket to object 
user_connected['user_id_here'] = socket; 

var secret = socket.manager.handshaken[socket.id].query.secret; 
clients[secret] = socket; 
console.log('Client Connected'); 
// Notification 
app.on("notification",function(data){ 
    socket = clients[data.recipient]; 
    if(socket != undefined){ 
     console.log('worked'); 
     socket.emit('notify',data); 
    } 
}); 
}); 
+0

你可以舉一些例子嗎? – NEWBIE

+0

請參閱更新,並告訴我這是否適合您。 – 1nsane