注销后销毁握手。 socket.io

时间:2012-09-06 04:55:51

标签: node.js express socket.io

您好我正在尝试将聊天内容构建到应用程序中。我想知道的是,当用户退出网站时,我如何销毁与该会话相关联的socket.io握手,以便用户在注销时无法从另一个标签发送消息。

如果有任何帮助,我正在使用expressjs。

2 个答案:

答案 0 :(得分:6)

好吧,如果有人发现这一点,并想知道我确实搞清楚了。 您可以访问套接字断开功能。我有用户ID的对象和他们的套接字ID,所以当有人退出时我打电话给

app.get("/logout", function(req,res){
  //do other logging out stuff
  sockets.disconnectUser(req.session.user_id);
}

// Disconnect User function
sockets.disconnectUser = function(user_id){
  sockets.socket(users[user_id]).disconnect();
}

答案 1 :(得分:1)

socket.io对象包含有关所有连接的套接字以及每个套接字的sessionID的信息。因此,可以遍历连接的套接字,并断开与正在注销的sessionID关联的套接字。这种方法无需手动跟踪用户和套接字ID。

使用socket.io @ 2.2.0,express @ 4.17.1和express-session@1.16.2测试的示例代码。

const SocketIO = require('socket.io');

let sio = new SocketIO;

app.get('/logout', function(req, res) {
  //do other logging out stuff
  logoutSocketsIO(req.sessionID);
});


// Iterate through all connected sockets and close those which are associated
// with the given sessionID
// Note: One sessionID can have multiple sockets (e.g. many browser tabs)
function logoutSocketsIO(sessionID) {    
  let connections = sio.sockets.connected;
  for(let c in connections) {
    let socketSessionID = connections[c].conn.request.sessionID;
    if(sessionID === socketSessionID) {
      connections[c].disconnect();
    }
  }
}