激活空闲/非活动连接

时间:2017-02-23 17:44:58

标签: javascript sockets socket.io timeout session-timeout

我使用socket.io制作了一个非常简单的应用。现在,它显示所有连接ID:当我们打开一个新的浏览器选项卡时,它会添加一个id;当我们关闭浏览器标签时,它会删除ID。

现在,我想为任何套接字设置一个超时事件:如果标签的按钮Keep alive!未被点击3个小时(可能是因为标签未被重新访问过3小时),我们考虑连接"半死",并在其他连接的页面中建立其连接ID grey;当我们点击按钮时,标签变为活动状态,并在其他页面中显示black,并重新开始倒计时3小时。

有谁知道如何实现这个?

此外,我有两个关于空闲/非活动连接,断开连接和选项卡重访之间关系的可选问题:

  1. 如果我们长时间没有重新访问打开的标签页,是否会将其视为断开连接?

  2. 是否可以在浏览器标签页上设置重新访问事件?

  3. 我目前的后端:

    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 个答案:

答案 0 :(得分:1)

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

请参阅当前socketio规范的以下文字:

  

在这些选项中:

     

pingTimeout(数字):没有乒乓包需要考虑多少毫秒   连接关闭(60000)   pingInterval(数字):多少毫秒   在发送新的ping数据包(25000)之前。

     

socket.io客户端将继续发送ping或心跳   确保连接存在

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

为了做到这一点,您可以使用计时器并检查从某个套接字收到数据的时间。周期性计时器可以跟踪活动并在3小时期限到期后更改状态