2017-02-23 71 views
1

我做了一个非常简单的应用程序socket.io。现在,它显示所有的连接ID:当我们打开一个新的浏览器选项卡时,它会添加一个ID;当我们关闭浏览器选项卡时,它将删除该ID。激活闲置/非活动连接

现在,我想对于任何插座设置一个超时事件:如果一个标签的按钮Keep alive!还没有被点击3小时(这也许是因为标签还没有被重新走访3小时),我们认为连接“半死”,并且在其他连接的页面中使其连接ID为grey;当我们点击该按钮时,该选项卡变为活动状态,并在其他页面中显示black,并重新开始倒计时3小时。

有谁知道如何实现这个?

此外,我有空闲/活动的连接,断开以及片重访之间的关系,两个可选问题:

  1. 如果我们不重游了很长一段时间开放的选项卡,将它被视为断开连接?

  2. 是否可以在浏览器选项卡上设置重新访问事件?

我现在的后端:

var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 
var io = require('socket.io').listen(server); 
var ids = []; 

server.listen(3000); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.sockets.on('connection', function(socket) { 
    ids.push(socket.id); 
    io.sockets.emit('ids', ids); 

    socket.on('disconnect', function() { 
     var index = ids.indexOf(socket.id); 
     ids.splice(index, 1); 
     io.sockets.emit('ids', ids);  
    }) 
}); 

前端:

<button type="button" onclick="alert('Keep alive!')">Keep alive!</button> 
<div id="ids"></div> 
<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script src="/socket.io/socket.io.js"></script> 
<script> 
    jQuery(function($) { 
     var socket = io.connect(); 
     var $ids = $('#ids'); 

     socket.on('ids', function (data) { 
      var html =""; 
      for (i = 0; i < data.length; i++) { 
       html += data[i] + "<br/>"; 
      }; 
      $ids.html(html); 
     }) 
    }); 
</script> 

回答

1

Socket.io用心跳(0.9.x版本的版本),或使用ping(1版管理超时.x起)。一旦在服务器上设置了这些超时,并且客户端与socket.io兼容,套接字将永远不会自动断开连接。当然,如果它丢失网络或网络超时或有人断开连接,它将断开连接。

见从目前socketio规范下面的文字:

在这些选项:

pingTimeout(号码):没有一个乒乓球包许多毫秒如何考虑 关闭连接(60000 ) pingInterval(数字):在发送新的ping数据包(25000)之前有多少ms 。

的socket.io客户端将继续发送ping或心跳,使 确保连接活着

因此,如果您的选项卡打开并且没有任何活动,则必须在应用程序级别进行管理,而不是在socket.io级别进行管理。

要做同样的事情,您可以使用计时器并检查您是否从某个套接字接收到数据。定期计时器可以跟踪活动并在您的3小时期满后更改状态