激活 idle/inactive 个连接
Activate idle/inactive connections
我用 socket.io
制作了一个非常简单的应用程序。现在,它会显示所有连接 ID:当我们打开一个新的浏览器选项卡时,它会添加一个 ID;当我们关闭浏览器选项卡时,它会删除 id。
现在,我想为任何套接字设置一个超时事件:如果选项卡的按钮 Keep alive!
3 小时未被点击(这可能是因为该选项卡 3 小时未被重新访问)小时),我们考虑连接"semi-dead",并在其他连接的页面中使其连接idgrey
;当我们点击该按钮时,该选项卡变为活动状态并在其他页面中 black
,并重新开始倒计时 3 小时。
有人知道如何实现吗?
此外,我有两个关于 idle/inactive 连接、断开连接和重新访问选项卡之间关系的可选问题:
如果我们长时间不重新访问打开的标签页,是否会被视为断开连接?
是否可以在浏览器选项卡上设置重访事件?
我目前的后端:
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 使用心跳(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
。
因此,如果您的选项卡已打开并且没有 activity,则您必须在应用程序级别而不是 socket.io 级别进行管理。
要做到这一点,您可以使用计时器并检查何时从某个套接字收到数据。定期计时器可以跟踪 activity 并在您的 3 小时周期到期后更改状态
我用 socket.io
制作了一个非常简单的应用程序。现在,它会显示所有连接 ID:当我们打开一个新的浏览器选项卡时,它会添加一个 ID;当我们关闭浏览器选项卡时,它会删除 id。
现在,我想为任何套接字设置一个超时事件:如果选项卡的按钮 Keep alive!
3 小时未被点击(这可能是因为该选项卡 3 小时未被重新访问)小时),我们考虑连接"semi-dead",并在其他连接的页面中使其连接idgrey
;当我们点击该按钮时,该选项卡变为活动状态并在其他页面中 black
,并重新开始倒计时 3 小时。
有人知道如何实现吗?
此外,我有两个关于 idle/inactive 连接、断开连接和重新访问选项卡之间关系的可选问题:
如果我们长时间不重新访问打开的标签页,是否会被视为断开连接?
是否可以在浏览器选项卡上设置重访事件?
我目前的后端:
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 使用心跳(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
。
因此,如果您的选项卡已打开并且没有 activity,则您必须在应用程序级别而不是 socket.io 级别进行管理。
要做到这一点,您可以使用计时器并检查何时从某个套接字收到数据。定期计时器可以跟踪 activity 并在您的 3 小时周期到期后更改状态