socket io js delay disconnect emit

socket io js delay disconnect emit

本文关键字:disconnect emit delay js io socket      更新时间:2023-09-26

客户端立即触发socket.on('disconnect'),但服务器端需要一分钟。

场景1:-如果客户端由于互联网问题而断开连接,服务器端在1分钟后断开连接,任何方法都可以立即在服务器端找到。

我试图改变pingTimeout= 30000和pingInterval=12000,但它每30秒重新连接和连接。

您可以使用超时延迟和套接字断开事件使断开和重新连接更容易。

当您的套接字连接时,将它们添加到bucket对象

if (socket.request.sessionID && !bucket[socket.request.sessionID]) {
    bucket[socket.request.session.player.id] = socket.id; //nuuu they stealin mah bukkit
}

这将添加玩家的id(我通过连接到套接字的节点会话跟踪)作为socketId

的关键。
//object for delayed log out
let disconnection = {
    sid : null, //socket id
    delay : null //timeout id
};

创建一个对象来存储您的套接字ID,以便您可以跟踪谁断开了连接。

socket.on('disconnect', function () {
    disconnection.sid = socket.request.sessionID; //grab session id
    disconnection.delay = setTimeout(() => {
        //set timeout to variable, in case of reconnection
        delete bucket[socket.request.sessionID];
        //emit the disconnection event
    }, 60000);
});

当用户断开连接时,设置超时时间,无论他们需要重新连接多长时间。

重新连接时,只需执行:

io.sockets.on("connection", socket => {
    //check for disconnection, compare socket ids, and remove timeout if sockets match
    if (disconnection.delay && disconnection.sid == socket.request.sessionID) {
        clearTimeout(disconnection.delay);
        disconnection.sid = null;
    }
});

这将检查现有socketID的重新连接并清除超时,再次成功建立连接。

请注意,这段代码是SourceUndead(我的游戏)的副本,所以其中一些可能无法直接转换为您(例如,我的socket变量也与会话绑定),但超时断开连接的概念是相同的。