javascript - 激活空闲/非事件连接

标签 javascript sockets socket.io timeout session-timeout

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

现在,我想为任何套接字设置一个超时事件:如果一个选项卡的Keep Alive!按钮在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>

最佳答案

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

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

Among those options:

pingTimeout (Number): how many ms without a pong packet to consider the connection closed (60000) pingInterval(Number): how many ms before sending a new ping packet (25000).

The socket.io client will keep sending a ping or a heartbeat to make sure the connection is alive

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

要执行相同的操作,您可以使用计时器并检查何时从某个套接字接收到数据。定期计时器可以跟踪事件并在 3 小时期限到期后更改状态

关于javascript - 激活空闲/非事件连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42422741/

相关文章:

Java:端口不可用(在 Windows 7 上)

perl - 使用 chomp() 时打印失败

javascript - 使用 Socket.IO,在发送 JavaScript 事件时防止客户端劫持 - 使用 SignalR?

java - Flex与Java Socket之间的通信

node.js - Mongoose 更新总是给我 TypeError : Cannot set property '__v' of undefined

javascript - Node.js/Socket.io 使用安全连接在 IE 中不返回结果

javascript - 使用 gtk3 在 Seed-3.2 javascript 中使用 cairo 进行绘图

javascript - 回调递归插入 Mongo 与 Node.js

javascript - Javascript 错误 : "Expected identifier, string or number" 的可能情况

javascript - 执行数组深处的函数