首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字io js延迟断开连接发出

套接字io js延迟断开连接发出
EN

Stack Overflow用户
提问于 2016-09-13 21:29:52
回答 1查看 1.2K关注 0票数 3

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-09-13 21:36:14

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

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

代码语言:javascript
复制
if (socket.request.sessionID && !bucket[socket.request.sessionID]) {
    bucket[socket.request.session.player.id] = socket.id; //nuuu they stealin mah bukkit
}

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

代码语言:javascript
复制
//object for delayed log out
let disconnection = {
    sid : null, //socket id
    delay : null //timeout id
};

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

代码语言:javascript
复制
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);
});

当用户断开连接时,设置重新连接的超时时间。

重新连接后,只需执行以下操作:

代码语言:javascript
复制
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 (我的游戏)的副本,因此其中一些可能不会直接转换为您(例如,我的套接字变量也与会话绑定),但超时断开连接的概念是相同的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39471366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档