【问题标题】:socket io js delay disconnect emit套接字 io js 延迟断开连接发射
【发布时间】:2017-01-21 03:12:54
【问题描述】:

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

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

我尝试更改 pingTimeout=30000 和 pingInterval=12000,但它每 30 秒重新连接一次。

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    您可以使用超时延迟和套接字断开事件来更轻松地断开和重新连接。

    当您的套接字连接时,将它们添加到存储桶对象中。

    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(我的游戏)的副本,因此其中一些可能不会直接翻译给您(例如,我的套接字变量也与会话绑定),但是超时的概念断线也是一样的。

    【讨论】:

    • 我假设您有bucket.push() 来存储用户每次连接时的socketID(clientID)?添加该花絮可能会有所帮助,以帮助我们的朋友避免混淆...
    • 是的,桶是一个对象,所以不推。我会添加sn-p。
    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2011-11-03
    • 2023-02-14
    • 2016-02-06
    • 2012-04-10
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多