【问题标题】:Disconnect previous client socket.io socket in node.js在 node.js 中断开以前的客户端 socket.io 套接字
【发布时间】:2014-01-18 17:02:51
【问题描述】:

我正在使用 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

即使它显示已连接,它也不会让我发送或接收任何消息。任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: javascript node.js session websocket socket.io


    【解决方案1】:

    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,但这取决于您的应用程序逻辑。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2017-07-17
      • 2014-10-01
      • 2019-08-04
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多