4

こんにちは私はチャットをアプリケーションに組み込むことを試みています。私が疑問に思っているのは、ユーザーがWebサイトからログアウトしたときに、そのセッションに関連付けられたsocket.ioハンドシェイクを破棄して、ユーザーがログアウトしたときに別のタブからメッセージを送信できないようにするにはどうすればよいかということです。

それが助けになるなら、私はexpressjsを使用しています。

4

2 に答える 2

7

誰かがこれを見つけて、私がそれを理解したことを知りたい場合に備えて。ソケット切断機能にアクセスできます。私はユーザー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();
}
于 2012-09-14T04:18:24.103 に答える
3

socket.ioオブジェクトには、接続されているすべてのソケットと各ソケットのsessionIDに関する情報が含まれています。したがって、接続されたソケットを反復処理し、ログアウトしているsessionIDに関連付けられているソケットを切断することができます。このアプローチでは、ユーザーIDとソケット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();
    }
  }
}
于 2019-08-27T06:10:56.617 に答える