Socket.IO JS延迟断开连接发射事件。

3

在客户端,当socket.on('disconnect')被触发时,会立即发送信号,但在服务端,需要一分钟时间才能发送信号。

场景1:如果客户端由于网络问题断开连接,则服务器端将在1分钟后发出disconnect信号。是否有方法在服务器端立即发现它的断开连接。

我试过更改pingTimeout=30000和pingInterval=12000,但每30秒它都会重新连接。

1个回答

3

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

当您的套接字连接时,将其添加到桶对象中。

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变量也与会话绑定),但超时断开连接的概念是相同的。


我假设你已经有了 bucket.push() 来存储每次用户连接时的 socketID(clientID),对吧?为了帮助我们的朋友避免混淆,将这个小提示加入可能会很有帮助。 - sova
1
有点是的,桶是一个对象,所以不需要推送。我会添加代码片段。 - Sterling Archer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接