Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 激活空闲/非活动连接_Javascript_Sockets_Socket.io_Timeout_Session Timeout - Fatal编程技术网

Javascript 激活空闲/非活动连接

Javascript 激活空闲/非活动连接,javascript,sockets,socket.io,timeout,session-timeout,Javascript,Sockets,Socket.io,Timeout,Session Timeout,我用socket.io制作了一个非常简单的应用程序。现在,它显示所有的连接id:当我们打开一个新的浏览器选项卡时,它会添加一个id;当我们关闭浏览器选项卡时,它会删除id 现在,我想为任何套接字设置一个超时事件:如果按钮保持活动状态未被点击3小时(这可能是因为标签没有被重新访问3小时),我们考虑连接“半死”,并在其他连接的页面中制作其连接ID“代码>代码;当我们点击按钮时,该选项卡变为活动状态,在其他页面中变为黑色,并重新开始3小时的倒计时 有人知道如何实现这一点吗 此外,关于空闲/非活动连接、

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

现在,我想为任何套接字设置一个超时事件:如果按钮
保持活动状态未被点击3小时(这可能是因为标签没有被重新访问3小时),我们考虑连接“半死”,并在其他连接的页面中制作其连接ID“代码>代码<灰色/代码>;当我们点击按钮时,该选项卡变为活动状态,在其他页面中变为黑色,并重新开始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>
    
    保持活力!
    jQuery(函数($){
    var socket=io.connect();
    var$ids=$(“#ids”);
    socket.on('id',函数(数据){
    var html=“”;
    对于(i=0;i”;
    };
    $ids.html(html);
    })
    });
    
    Socket.io使用heartbeat(0.9.x版本)或ping(1.x版本之后)管理超时。一旦您在服务器上设置了这些超时,并且客户端符合socket.io,则套接字将永远不会自动断开连接。当然,如果它失去网络或网络超时或有人断开连接,它将断开连接

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

    在这些选项中:

    <代码> PiTimeOUT(数字):有多少MS没有考虑PANG包 连接已关闭(60000)

    pingInterval
    (数字):多少毫秒 在发送新的ping数据包(25000)之前

    socket.io客户端将继续发送ping或心跳信号,以使 确保连接处于活动状态

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

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