socket.io 'disconnect' 如果页面刷新足够快则不调用
socket.io 'disconnect' not called if page refreshed fast enough
我有以下删节代码:
io.on('connection', function(client) {
client.uuid = uuid.v4();
// add client object to server...
console.log('socket.io:: client connected ' + client.uuid );
client.on('disconnect', function() {
console.log('socket.io:: client disconnected ' + client.uuid );
// remove client object from server...
});
});
如果我在浏览器中打开这个页面,一切似乎都很好。如果我刷新页面,它将触发 disconnect
然后 connection
。但是,如果我刷新得足够快,有时 disconnect
不会被调用,因此客户端数据不会从服务器上清除。有什么办法可以避免这种情况吗?
编辑:改写 reconnect
-> connection
如 adeneo 所述,socket.io 有心跳,可自动检查客户端是否仍处于连接状态。如果 disconnect
代码检测到客户端确实消失了,它就会被触发。复制我的原始问题后,我尝试让服务器保持打开状态,大约 30 秒后,"dead" 客户端被删除。所以要解决这个问题,你只需要等待。 Socket.io 自己搞定一切。
.
TL;DR
您可以在客户端使用这些选项:
const socket = io({
transports: ['websocket'],
upgrade: false
});
这将完全阻止导致问题的 socket.io
from using the HTTP polling 方法。我在 v4.
上成功使用了这个技巧
我有以下删节代码:
io.on('connection', function(client) {
client.uuid = uuid.v4();
// add client object to server...
console.log('socket.io:: client connected ' + client.uuid );
client.on('disconnect', function() {
console.log('socket.io:: client disconnected ' + client.uuid );
// remove client object from server...
});
});
如果我在浏览器中打开这个页面,一切似乎都很好。如果我刷新页面,它将触发 disconnect
然后 connection
。但是,如果我刷新得足够快,有时 disconnect
不会被调用,因此客户端数据不会从服务器上清除。有什么办法可以避免这种情况吗?
编辑:改写 reconnect
-> connection
如 adeneo 所述,socket.io 有心跳,可自动检查客户端是否仍处于连接状态。如果 disconnect
代码检测到客户端确实消失了,它就会被触发。复制我的原始问题后,我尝试让服务器保持打开状态,大约 30 秒后,"dead" 客户端被删除。所以要解决这个问题,你只需要等待。 Socket.io 自己搞定一切。
TL;DR 您可以在客户端使用这些选项:
const socket = io({
transports: ['websocket'],
upgrade: false
});
这将完全阻止导致问题的 socket.io
from using the HTTP polling 方法。我在 v4.