socket io js delay disconnect emit
socket io js delay disconnect emit
客户端立即触发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变量也与会话绑定),但超时断开连接的概念是相同的。
相关文章:
- $emit,$broadcast,原型继承
- 如何在angular js中使用$emit后重新加载数据
- TypeError:socket.emit不是函数
- Socket.io socket.emit 不将数据传递到服务器
- 使用socket.io、jquery mobile、socket.emit();的时序逻辑有点奇怪;
- 客户端如何知道发射是否失败?socket.emit()有回调吗
- Socket.io-io.to.emit向所有连接的用户发射
- socket.emit-事件名称[socket.io]
- AngularJS Scope.on和Scope.emit在筛选器中的调用顺序
- 正在尝试访问已.emit但无法访问的数组数据
- $rootScope.$emit and $on
- Bluebird unhandled Error with emit NodeJS
- 在我的情况下,如何在指令中设置$emit
- 使用 Meteor.disconnect() 和 Meteor.reconnect() 来模拟反应性
- Firefox addon - port.emit inside port.on
- 无法让 port.emit 和 port.on 在 Firefox 附加组件中工作
- $scope.$emit 和 $rootScope.$emit 有什么区别
- 你能在 EventEmitter 的 emit 方法上使用 '.apply()' 吗?
- 如何实现 emit 以同步方式工作
- socket io js delay disconnect emit