激活空闲/不活跃的连接

3
我使用了socket.io制作了一个非常简单的应用程序。现在,它会显示所有连接的ID:当我们打开一个新的浏览器选项卡时,它会添加一个ID;当我们关闭一个浏览器选项卡时,它会删除该ID。
现在,我想为任何套接字设置一个超时事件:如果某个选项卡的保持活动!按钮在3个小时内没有被点击(可能是因为该选项卡在3个小时内未被重新访问),我们将认为该连接处于“半死”状态,并将其连接ID在其他连接的页面中显示为灰色。当我们点击按钮时,该选项卡变为活动状态,在其他页面中显示为黑色,并重新启动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个回答

4
Socket.io使用心跳(0.9.x版本)或Ping(1.x及以上版本)来管理超时。一旦在服务器上设置了这些超时时间,并且如果客户端符合socket.io规范,那么套接字将不会自动断开连接。当然,如果它失去网络连接、网络超时或有人断开它,它将会断开连接。
可以参见当前socketio规范中的以下文本:
"在这些选项中:pingTimeout(数字):没有pong数据包的毫秒数,以便考虑关闭连接(60000)。pingInterval (数字): 发送新ping数据包之前的毫秒数(25000)。socket.io客户端将持续发送ping或心跳包以确保连接正常。"
因此,如果您的标签页处于打开状态并且没有活动,您需要在应用程序级别而不是在socket.io级别上进行管理。
要做到这一点,您可以使用一个计时器并检查何时从某个套接字接收到数据。周期性计时器可以跟踪活动并在3小时期限到期后更改状态。

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