Javascript 断开node.js中以前的client socket.io套接字

Javascript 断开node.js中以前的client socket.io套接字,javascript,node.js,session,websocket,socket.io,Javascript,Node.js,Session,Websocket,Socket.io,我正在使用node.js和socket.io创建一个包含多个游戏室的游戏大厅。我试图做的是防止用户在多个选项卡中打开大厅。我的想法是,当打开一个新标签时,断开上一个标签。我想我可以通过跟踪已经打开的选项卡的socket.id来实现这一点 //Keep track of the online users var onlineUsers = new Array(); sessionSockets.on('connection', function(err, socket, session){

我正在使用node.js和socket.io创建一个包含多个游戏室的游戏大厅。我试图做的是防止用户在多个选项卡中打开大厅。我的想法是,当打开一个新标签时,断开上一个标签。我想我可以通过跟踪已经打开的选项卡的socket.id来实现这一点

//Keep track of the online users
var onlineUsers = new Array();

sessionSockets.on('connection', function(err, socket, session){
    socket.on('joinlobby', function(){
        //Disconnect the users previous socket if their username is already in the onlineUser array
        console.log("DISCONNECTED: " + onlineUsers[session.username]);
        socket.disconnect(onlineUsers[session.username]);
        onlineUsers[session.username] = socket.id;
        console.log("CONNECTED: " + onlineUsers[session.username]);
    });
});
JoinLobble在首次加载页面时触发。我正在使用,以便可以访问套接字中的会话数据。我使用用户名作为数组键,并存储当前socket.id。现在的问题是,我的行为似乎有点不一致。有时它什么也不做,两个选项卡都未断开连接,而其他时候,两个选项卡似乎都已断开连接。控制台中没有错误,因此任何人都可以看到我的方法有问题吗?控制台输出的一个示例是:

DISCONNECTED: dOW2y-fq-aDW7t0sRUKn
   info  - booting client
   info  - transport end by forced client disconnection
   info  - transport end (booted)
CONNECTED: 9vZbMC85x9OQsFo9RUKo
即使它说已连接,它也不允许我发送或接收任何消息。感谢您的帮助。

socket.disconnect(onlineUsers[session.username])
实际上,您正在断开新插座而不是旧插座。
如果有指向旧套接字的指针,请调用
.disconnect()

比如:

var sockets = { };
sessionSockets.on('connection', function(err, socket, session){
    sockets[socket.id] = socket;

    socket.on('joinlobby', function(){
        //Disconnect the users previous socket if their username is already in the onlineUser array
        var onlineSocketID = onlineUsers[session.username];
        if (onlineSocketID && onlineSocketID !== socket.id) {
            console.log("DISCONNECTED: " + onlineUsers[session.username]);
            sockets[onlineSocketID].disconnect();
            delete sockets[onlineSocketID];
        }
        if (onlineSocketID !== socket.id) {
            onlineUsers[session.username] = socket.id;
            console.log("CONNECTED: " + onlineUsers[session.username]);
        }
    });
});
作为这里的额外评论——就个人而言,我不会通过用户名来识别用户,但会使用内部用户ID,但这取决于您的应用程序逻辑

同样使用这种逻辑,若您从客户端发送两次“JoinLobble”消息,它将导致自断开连接,所以我还添加了检查