2015-01-26 69 views
0

我使用node.js和socket.io创建聊天应用程序。2分钟后断开事件火灾

socket.on('disconnect',function(data){ 
    console.log("disconnected"); 
} 

一旦客户端断开连接(选项卡关闭或网络问题),就会触发此事件。

我希望在客户端断开连接1分钟后触发断开连接事件。那可能吗?在socket.io中有没有配置?

+0

为什么这会有用?在接收到断开连接事件后,很容易在一分钟内添加自己的超时时间。 – spirulence 2015-01-26 19:14:04

+1

如果在socket.io中已经有了一个选项,我可以使用它来代替编写自己的函数来超时。 – Vishnu 2015-01-26 19:16:50

回答

2

该功能未嵌入到socket.io中。当套接字断开时,disconnect事件触发。期。如果您想在断开连接后1分钟触发某个活动,则可以创建自己的计时器来完成此操作。

socket.on('disconnect',function(data){ 
    setTimeout(function() { 
     console.log("disconnected"); 
    }, 60 * 1000); 
} 

如果要触发事件只有当你有救了setTimeout()定时器客户端不会在1分钟内重新连接,然后就可以代码也,但它是一个涉及多一点和然后取消它,如果特定的客户端重新连接定时器触发。


根据你放什么在你的答案,这就是我认为这是一个改进版本:

(function() { 
    var origClose = socket.onclose; 
    socket.onclose = function(reason){ 
     var self = this; 
     var args = Array.prototype.slice.call(arguments); 

     /* Delay of 1 second to remove from all rooms and disconnect the id */ 
     setTimeout(function() { 
      origClose.apply(self, args); 
     }, 60 * 1000); 
    } 
})(); 
0

你有一些参数来控制这种行为的服务器端。见close timeoutheartbeat timeouthere 如果你正在使用1.0版,您需要设置的选项中描述here.

注意新的样式,这些并没有从技术上做什么你问 - 他们只是延长客户端必须重新连接的时间量。

+1

var io = require('socket.io')(server,{'close timeout':60});不工作.. – Vishnu 2015-01-26 19:40:01

+1

有没有人发现解决方案,使'超时超时'工作? – 2015-05-22 17:37:37

0

Socket.onclose在断开连接事件之前断开后立即触发。 断开事件可以通过如下更改被延迟。

socket.onclose = function(reason){ 
    console.log(socket.adapter.sids[socket.id]); 
    Object.getPrototypeOf(this).onclose.call(this,reason); 

    /* Delay of 1 seconds to remove from all rooms and disconnect the id */ 
    setTimeout(function() { 
     if (!this.connected) return this; 
     debug('closing socket - reason %s', reason); 
     this.leaveAll(); 
     this.nsp.remove(this); 
     this.client.remove(this); 
     this.connected = false; 
     this.disconnected = true; 
     delete this.nsp.connected[this.id]; 
     this.emit('disconnect', reason); 
    }, 60 * 1000); 
} 
+0

为什么你在'setTimeout()'之前调用常规'onclose()'?这不会只是导致断开事件立即触发吗?这不是打败你在做什么的目的吗?难道你不能在你的超时时间内调用prototype.onclose并且不复制所有你正在复制的代码,如果实现改变将来很容易破解的代码。我看到你在这方面得到了什么,看起来你可以在这个方向上解决你的问题,但你发布的代码看起来不正确。 – jfriend00 2015-12-23 21:28:13

+0

看看我在之前的回答结束时提出了什么,我认为这是一个改进版。仅供参考,你的工作并不像你所说的那样,因为在setTimeout()回调中'this'不正确。 – jfriend00 2015-12-23 22:36:49