繁体   English   中英

断开node.js中以前的客户端socket.io套接字的连接

[英]Disconnect previous client socket.io socket in node.js

我正在使用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]);
    });
});

首次加载页面时触发Joinlobby。 我正在使用session.socket.io,因此可以访问套接字中的会话数据。 我正在使用用户名作为数组键,并存储当前的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()调用.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,但这取决于您的应用程序逻辑。

同样使用该逻辑,如果您从客户端两次发送“ joinlobby”消息,也会导致自断开,因此我也添加了检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM